web-dev-qa-db-ja.com

lightgbmを使用した機能の重要性

以下のように、機能選択のために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,) 
4
Ian Okeyo

lightgbmモデルを使用するときにtrainで機能の重要度を取得する例。

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

def plotImp(model, X , num = 20):
    feature_imp = pd.DataFrame({'Value':model.feature_importance(),'Feature':X.columns})
    plt.figure(figsize=(40, 20))
    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()
6
rosefun

feature_importance()関数はLightGBM python APIでは使用できなくなりましたが、この例の関数のように_feature_importances__プロパティを使用できます(ここでmodellgbm.fit()および_train_columns = x_train.columns_)の結果です。

_import pandas as pd

def get_lgbm_varimp(model, train_columns, max_vars=50):

    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

_

_feature_importances__は、modelトレーニング中にモデル行列の列が並べられたのと同じように並べられているという前提に依存していることに注意してください(ワンホットダミー列を含む)。 LightGBM#209

0
mirekphd