如何在 sklearn:: LGBMClassifier() 中为 LightGBM 分类器的 feature_importances_ 中设置“增益”作为特征重要性度量

Posted

技术标签:

【中文标题】如何在 sklearn:: LGBMClassifier() 中为 LightGBM 分类器的 feature_importances_ 中设置“增益”作为特征重要性度量【英文标题】:How to set 'gain' as Feature Importance measure in feature_importances_ for LightGBM classifer in sklearn:: LGBMClassifier() 【发布时间】:2018-12-09 15:42:25 【问题描述】:

我正在 LightGBM 中使用 LGBMClassifer 构建一个二元分类器模型,如下所示:

 # LightGBM model
        clf = LGBMClassifier(
            nthread=4,
            n_estimators=10000,
            learning_rate=0.005,
            num_leaves= 45,
            colsample_bytree= 0.8,
            subsample= 0.4,
            subsample_freq=1,
            max_depth= 20,
            reg_alpha= 0.5,
            reg_lambda=0.5,
            min_split_gain=0.04,
            min_child_weight=.05
            random_state=0,
            silent=-1,
            verbose=-1)

接下来,在训练数据上拟合我的模型

     clf.fit(train_x, train_y, eval_set=[(train_x, train_y), (valid_x, valid_y)], 
                eval_metric= 'auc', verbose= 100, early_stopping_rounds= 200)

    fold_importance_df = pd.DataFrame()
    fold_importance_df["feature"] = feats   
    fold_importance_df["importance"] = clf.feature_importances_

输出:

feature                      importance
feature13                     1108
feature21                     1104
feature11                     774

到目前为止一切都很好,现在我正在研究基于此模型的特征重要性度量。所以,我使用feature_importance_() 函数来获得它(但默认情况下,它基于split 给了我特征重要性)

虽然split 让我了解哪个功能在拆分中使用了多少次,但我认为gain 可以让我更好地了解功能的重要性。

LightGBM booster 类的 Python API https://lightgbm.readthedocs.io/en/latest/Python-API.html?highlight=importance 提到:

 feature_importance(importance_type='split', iteration=-1)


 Parameters:importance_type (string, optional (default="split")) – 
 If “split”, result contains numbers 
 of times the feature is used in a model. If “gain”, result contains 
 total gains of splits which use the feature.
 Returns:   result – Array with feature importances.
 Return type:   numpy array`

然而,Sklearn API for LightGBM LGBMClassifier() 没有提到任何东西Sklearn API LGBM,它只有这个函数的参数:

feature_importances_
array of shape = [n_features] – The feature importances (the higher, the more important the feature).
我的问题是如何从sklearn 版本(即基于gainLGBMClassifier())获得特征重要性?

【问题讨论】:

直接切换到原来的lgbm 这不能回答我的问题。您能解释一下原始 LGBM 是什么意思吗?在答案部分有一个例子会有所帮助 【参考方案1】:

feature_importance() 是原始 LGBM 中 Booster 对象的一个​​方法。

sklearn API 通过API Docs 中给出的属性booster_ 公开训练数据的底层Booster。

因此,您可以先访问此助推器对象,然后以与原始 LGBM 相同的方式调用 feature_importance()

clf.booster_.feature_importance(importance_type='gain')

【讨论】:

以上是关于如何在 sklearn:: LGBMClassifier() 中为 LightGBM 分类器的 feature_importances_ 中设置“增益”作为特征重要性度量的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Keras 中将 Sklearn Metric 实现为 Metric?

如何在 sklearn 的 AdaBoost 中使用 Keras 模型?

在 sklearn 中使用 DictVectorizer 后如何获得分类特征的重要性

“余弦”度量在 sklearn 聚类算法中如何工作?

如何在 sklearn 管道中获取通过特征消除选择的特征名称?

Sklearn:如何在庞大的数据集上应用降维?