特征重要性(Feature Importance)是评估各输入特征对模型预测结果贡献程度的指标。计算方法因模型类型而异,总结以下五种方法:

1. 基于模型内置的特征重要性

许多算法自带特征重要性评估机制,可直接使用:

树模型(决策树、随机森林、XGBoost 等)
  • Gini Importance(基尼重要性)
    通过特征在树中分裂时的不纯度(Gini 指数或信息增益)减少量来衡量,减少量越大越重要。
    示例:

    from sklearn.ensemble import RandomForestClassifier
    
    model = RandomForestClassifier()
    model.fit(X, y)
    importance = model.feature_importances_  # 返回特征重要性数组
    
  • SHAP 值(SHapley Additive exPlanations)
    基于博弈论的方法,计算每个特征对预测结果的贡献值,考虑了特征间的交互影响。
    示例

    import shap
    
    explainer = shap.TreeExplainer(model)
    shap_values = explainer.shap_values(X)
    shap.summary_plot(shap_values, X)  # 可视化特征重要性
    
线性模型(逻辑回归、线性回归)
  • 系数绝对值
    线性模型的系数(Coefficient)直接反映特征对预测的影响方向和强度,取绝对值后可比较重要性。
    示例(逻辑回归)
    from sklearn.linear_model import LogisticRegression
    
    model = LogisticRegression()
    model.fit(X, y)
    importance = np.abs(model.coef_[0])  # 取系数绝对值
    

2. 基于统计方法的特征重要性

不依赖模型,直接通过统计指标评估特征与目标变量的相关性:

方差分析(ANOVA)
  • 用于连续特征与分类目标之间的相关性评估,计算 F 值和 p 值。
    示例
    from sklearn.feature_selection import f_classif
    
    f_values, p_values = f_classif(X, y)  # 返回F值和p值
    
卡方检验(Chi-Square)
  • 用于分类特征与分类目标之间的相关性评估。
    示例
    from sklearn.feature_selection import chi2
    
    chi2_values, p_values = chi2(X, y)  # 返回卡方值和p值
    
互信息(Mutual Information)
  • 衡量特征与目标变量之间的依赖关系,对非线性关系敏感。
    示例
    from sklearn.feature_selection import mutual_info_classif
    
    mi_scores = mutual_info_classif(X, y)  # 返回互信息分数
    

3. 基于扰动的特征重要性

通过人为干扰特征值,观察模型性能变化来评估重要性:

置换重要性(Permutation Importance)
  • 随机打乱某个特征的值,若模型性能显著下降,则该特征重要。
    示例
    from sklearn.inspection import permutation_importance
    
    result = permutation_importance(model, X, y, n_repeats=10)
    importance = result.importances_mean  # 返回平均重要性分数
    
Drop-column Importance
  • 移除某个特征后重新训练模型,比较前后性能差异,差异越大越重要。
    示例
    baseline_score = model.score(X, y)
    importance = []
    
    for col in X.columns:
        X_drop = X.drop(col, axis=1)
        model_drop = model.__class__()  # 复制模型
        model_drop.fit(X_drop, y)
        importance.append(baseline_score - model_drop.score(X_drop, y))
    

4. 特征重要性的可视化与应用

  • 可视化工具
    使用matplotlibseaborn或专用库(如shap)绘制柱状图、热力图等:

    import matplotlib.pyplot as plt
    
    plt.bar(range(len(importance)), importance)
    plt.xticks(range(len(features)), features, rotation=90)
    plt.show()
    
  • 实际应用

    1. 特征选择:删除低重要性特征,减少过拟合,提升模型效率。
    2. 业务解释:理解哪些因素对预测结果影响最大(如风控模型中的收入、年龄)。
    3. 异常检测:监控特征重要性的变化,发现数据分布偏移或模型退化。

5. 注意事项

  • 非线性关系:树模型和 SHAP 更适合捕捉非线性特征重要性,而线性方法(如系数)仅适用于线性关系。
  • 特征交互:某些特征单独不重要,但与其他特征组合后可能重要(如树模型中的特征组合)。
  • 归一化:不同方法的重要性分数范围可能不同,比较时需注意归一化。

总结

方法 适用模型 优点 缺点
Gini Importance 树模型 计算快,内置支持 对高基数特征有偏倚
SHAP 值 所有模型 考虑特征交互,解释性强 计算开销大
系数绝对值 线性模型 直接反映影响方向 仅适用于线性关系
置换重要性 所有模型 模型无关,直观易理解 计算开销大,依赖随机扰动
统计方法(ANOVA / 卡方) 特征筛选前期 快速评估单特征相关性 忽略特征间交互
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐