【问题标题】:Feature importance using lightgbm使用 lightgbm 的特征重要性
【发布时间】:2019-04-24 02:51:23
【问题描述】:

我正在尝试运行我的 lightgbm 以进行如下功能选择;

初始化

# Initialize an empty array to hold feature importances
feature_importances = np.zeros(features_sample.shape[1])

# Create the model with several hyperparameters
model = lgb.LGBMClassifier(objective='binary', 
         boosting_type = 'goss', 
         n_estimators = 10000, class_weight ='balanced')

然后我将模型拟合如下

# Fit the model twice to avoid overfitting
for i in range(2):

   # Split into training and validation set
   train_features, valid_features, train_y, valid_y = train_test_split(train_X, train_Y, test_size = 0.25, random_state = i)

   # Train using early stopping
   model.fit(train_features, train_y, early_stopping_rounds=100, eval_set = [(valid_features, valid_y)], 
             eval_metric = 'auc', verbose = 200)

   # Record the feature importances
   feature_importances += model.feature_importances_

但我收到以下错误

Training until validation scores don't improve for 100 rounds. 
Early stopping, best iteration is: [6]  valid_0's auc: 0.88648
ValueError: operands could not be broadcast together with shapes (87,) (83,) (87,) 

【问题讨论】:

  • 如何初始化 feature_importances ?
  • @FlorianMutel 查看更新后的帖子
  • 什么是 features_sample ?你有多少功能?例如,我无法使用 Iris 数据重现您的错误。您似乎正在尝试添加具有不同形状的数组。要么您使用错误的维度进行了初始化,要么您的某些特征变为空(全部为 nan),或者在您拆分数据时保持不变(训练/有效),而 lightgbm 会忽略它们。试着看看你的分裂!

标签: python python-3.x lightgbm


【解决方案1】:

使用train 模型时获取lightgbm 中特征重要性的示例。

import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)

def plotImp(model, X , num = 20, fig_size = (40, 20)):
    feature_imp = pd.DataFrame({'Value':model.feature_importance(),'Feature':X.columns})
    plt.figure(figsize=fig_size)
    sns.set(font_scale = 5)
    sns.barplot(x="Value", y="Feature", data=feature_imp.sort_values(by="Value", 
                                                        ascending=False)[0:num])
    plt.title('LightGBM Features (avg over folds)')
    plt.tight_layout()
    plt.savefig('lgbm_importances-01.png')
    plt.show()

【讨论】:

  • feature_imp = pd.DataFrame({'Value':model.feature_importances_,'Feature':self.x_cols})
  • feature_imp = pd.DataFrame({'Value':model.feature_importances_,'Feature':X.columns})
【解决方案2】:

根据我们是使用scikit-learn 还是lightgbm 方法训练model,为了获得重要性,我们应该分别选择feature_importances_ 属性或feature_importance() 函数,就像在这个例子中一样(其中model 是一个lgbm.fit() / lgbm.train()train_columns = x_train_df.columns) 的结果:

import pandas as pd

def get_lgbm_varimp(model, train_columns, max_vars=50):
    
    if "basic.Booster" in str(model.__class__):
        # lightgbm.basic.Booster was trained directly, so using feature_importance() function 
        cv_varimp_df = pd.DataFrame([train_columns, model.feature_importance()]).T
    else:
        # Scikit-learn API LGBMClassifier or LGBMRegressor was fitted, 
        # so using feature_importances_ property
        cv_varimp_df = pd.DataFrame([train_columns, model.feature_importances_]).T

    cv_varimp_df.columns = ['feature_name', 'varimp']

    cv_varimp_df.sort_values(by='varimp', ascending=False, inplace=True)

    cv_varimp_df = cv_varimp_df.iloc[0:max_vars]   

    return cv_varimp_df
    

请注意,我们依赖于假设特征重要性值的排序就像模型矩阵列在训练期间的排序一样(包括 one-hot dummy cols),请参阅LightGBM #209

【讨论】:

  • +1,但是 Re:"feature_importance() 函数在 LightGBM python API 中不再可用" 实际上它仍然存在,我认为您的意思是 Scikit-learn API。
  • feature_importance() 确实仍然是there,我建议您相应地更新答案。
  • 这种泛化应该会自动检测哪个 API 用于训练并选择适当的方法来获得重要性。
【解决方案3】:

LightGBM的3.1.1版本,扩展@user3067175的评论:

pd.DataFrame({'Value':model.feature_importance(),'Feature':features}).sort_values(by="Value",ascending=False)

是特征名称的列表,与你的数据集顺序相同,可以替换为features = df_train.columns.tolist()。 这应该以相同的绘图顺序返回特征重要性。

注意:如果你使用 LGBMRegressor,你应该使用

pd.DataFrame({'Value':model.feature_importances_,'Feature':features}).sort_values(by="Value",ascending=False)

【讨论】:

    【解决方案4】:

    如果要检查没有训练数据的加载模型,可以通过

    获取特征重要性和特征名称
    df_feature_importance = (
        pd.DataFrame({
            'feature': model.feature_name(),
            'importance': model.feature_importance(),
        })
        .sort_values('importance', ascending=False)
    )
    

    【讨论】:

      猜你喜欢
      • 2021-02-03
      • 2021-06-02
      • 1970-01-01
      • 2017-11-14
      • 2018-12-14
      • 2021-12-23
      • 2016-11-07
      • 1970-01-01
      相关资源
      最近更新 更多