TabularPredictor.feature_importance¶
- TabularPredictor.feature_importance(data=None, model: str = None, features: list = None, feature_stage: str = 'original', subsample_size: int = 5000, time_limit: float = None, num_shuffle_sets: int = None, include_confidence_band: bool = True, confidence_level: float = 0.99, silent: bool = False)[source]¶
通过排列重要性(permutation importance)计算给定模型的特征重要性分数。关于排列重要性的解释,请参考 https://explained.ai/rf-importance/。特征的重要性分数表示在对数据进行扰动副本进行预测时,将该特征的值在行之间随机打乱后,模型性能下降的程度。一个特征分数若为 0.01,则表示该特征被随机打乱后,预测性能下降了 0.01。特征分数越高,表明它对模型性能越重要。如果一个特征分数为负,则意味着该特征可能对最终模型有害,移除该特征后训练的模型预计会达到更好的预测性能。请注意,计算特征重要性可能是一个计算成本很高的过程,特别是当模型使用成百上千个特征时。在许多情况下,这可能比原始模型训练花费的时间更长。要估计 feature_importance(model, data, features) 需要多长时间,大致等于 predict_proba(data, model) 在数据上运行所需时间乘以特征数量。
注意:为了获得高度准确的重要性分数和 p_value 估计,如果可能,建议将 subsample_size 设置为至少 5000,将 num_shuffle_sets 设置为至少 10。
- 参数:
data (str 或
pd.DataFrame
(可选)) –此数据还必须包含与 fit() 期间指定的标签列同名的列。如果指定,则使用该数据计算特征重要性分数。如果传入 str,data 将使用该 str 值作为文件路径加载。如果未指定,并且设置了 cache_data=True,则会使用 fit() 期间使用的原始数据。否则,将引发异常。请勿通过此参数传递训练数据,因为计算出的特征重要性分数会因过拟合而产生偏差。
使用 fit() 期间保留的新数据可以获得更准确的特征重要性。
model (str, 默认值 = None) – 需要获取特征重要性的模型,如果为 None,则选择最佳模型。通过调用 predictor.model_names() 可以列出此 predictor 中的有效模型。
features (list, 默认值 = None) –
要计算并返回其特征重要性的 str 特征名称列表,指定 None 获取所有特征重要性。如果您只想计算部分特征的特征重要性,可以将其名称作为 str 列表传入。有效的特征名称取决于 feature_stage。
要获取 feature_stage=’original’ 的特征名称列表,请调用 predictor.feature_metadata_in.get_features()。要获取 feature_stage=’transformed’ 的特征名称列表,请调用 list(predictor.transform_features().columns)。要获取 feature_stage=`transformed_model 的特征名称列表,请调用 list(predictor.transform_features(model={model_name}).columns)。
- [高级] 也可以包含 (feature_name, feature_list) 形式的元组作为元素。
feature_name 可以是任意字符串,只要它与列表中的所有其他特征名称/特征唯一即可。feature_list 可以是数据中任何有效特征的列表。这将计算 feature_list 中特征组合的重要性,并在返回的 DataFrame 中将这组特征命名为 feature_name。此重要性将不同于将 feature_list 中每个特征的单独重要性相加,并且将更准确地反映整体组的重要性。示例:[‘featA’, ‘featB’, ‘featC’, (‘featBC’, [‘featB’, ‘featC’])] 在此示例中,通过联合置换 ‘featB’ 和 ‘featC’(如同它们是单个二维特征一样)来计算 ‘featBC’ 的重要性。
feature_stage (str, 默认值 = 'original') –
应该计算哪个特征处理阶段的重要性。选项如下:
- ’original’
计算原始特征的重要性。警告:使用此选项时必须指定 data,否则将引发异常。
- ’transformed’
计算经过内部转换后的特征(自动化特征工程之后)的重要性。这些特征可能缺少一些原始特征,或者完全添加了新特征。新特征的一个例子是从文本列生成的 n-gram 特征。警告:对于 bagged 模型,当 data=None 时,此选项尚不支持计算特征重要性。这样做会引发异常。
- ’transformed_model’
计算经过模型转换后的特征的重要性。这些特征是请求的模型使用的内部特征。它们可能与原始特征大不相同。如果模型是堆叠集成模型,这将包括堆叠集成特征,例如堆叠集成模型的基模型(祖先模型)的预测概率特征。
subsample_size (int, 默认值 = 5000) – 计算特征重要性时从 data 中抽样的行数。如果 subsample_size=None 或 data 的行数少于 subsample_size,则计算时将使用所有行。值越大,特征重要性分数的准确性越高。运行时长与 subsample_size 成线性比例。
time_limit (float, 默认值 = None) – 限制计算特征重要性的时间(以秒为单位)。如果为 None,特征重要性将计算直到完成,不会提前停止。至少会评估 1 个完整的 shuffle set。如果一个 shuffle set 的评估时间超过 time_limit,则无论 time_limit 如何设置,方法返回的时间将等于一个 shuffle set 的评估时长。
num_shuffle_sets (int, 默认值 = None) – 评估的数据排列 shuffle 次数。值越大,重要性评估的质量越高。通常建议在增加 num_shuffle_sets 之前增加 subsample_size。如果 time_limit 为 None,则默认值为 5;如果指定了 time_limit,则默认值为 10。运行时长与 num_shuffle_sets 成线性比例。
include_confidence_band (bool, 默认值 = True) – 如果为 True,返回的 DataFrame 将包含两个额外的列,指定每个特征真实底层重要性值的置信区间。增加 subsample_size 和 num_shuffle_sets 将使置信区间更紧凑。
confidence_level (float, 默认值 = 0.99) – 此参数仅在 include_confidence_band 为 True 时考虑,用于指定构建置信区间时使用的置信水平。例如,如果 confidence_level 设置为 0.99,则返回的 DataFrame 将包含列 ‘p99_high’ 和 ‘p99_low’,表示真实特征重要性有 99% 的可能性落在 ‘p99_high’ 和 ‘p99_low’ 之间(99% 置信区间)。更一般地,如果 confidence_level = 0.XX,则包含 XX% 置信区间的列将命名为 ‘pXX_high’ 和 ‘pXX_low’。
silent (bool, 默认值 = False) – 是否抑制日志输出。
- 返回:
index:特征名称。‘importance’:估计的特征重要性分数。‘stddev’:特征重要性分数的标准差。如果为 NaN,则表示用于计算方差的 num_shuffle_sets 不足。‘p_value’:用于对零假设(重要性 = 0)与(单侧)备择假设(重要性 > 0)进行统计 t 检验的 P 值。
p 值低的特征对于预测器来说显然是有用的,而其他特征可能对预测器无用(甚至有害于包含在训练数据中)。p 值为 0.01 表示该特征无用或有害的可能性为 1%,有用的可能性为 99%。p 值为 0.99 表示该特征无用或有害的可能性为 99%,有用的可能性为 1%。
‘n’:用于估计重要性分数的 shuffle 执行次数(对应于用于确定真实分数置信区间的样本大小)。‘pXX_high’:真实特征重要性分数的 XX% 置信区间上限(默认 XX=99)。‘pXX_low’:真实特征重要性分数的 XX% 置信区间下限。
- 返回类型:
包含 6 列的特征重要性分数的
pd.DataFrame