J'essaie d'exécuter mon lightgbm pour la sélection des fonctionnalités comme ci-dessous;
initialisation
# 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')
puis j'adapte le modèle comme ci-dessous
# 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_
mais j'obtiens l'erreur ci-dessous
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,)
Un exemple pour obtenir l'importance des fonctionnalités dans lightgbm
lors de l'utilisation du modèle 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()
Même si la fonction feature_importance()
n'est plus disponible dans LightGBM python API, nous pouvons utiliser la propriété feature_importances_
, Comme dans cet exemple de fonction (où model
est le résultat de lgbm.fit()
et 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
Notez que nous nous appuyons sur l'hypothèse que feature_importances_
Sont commandés exactement comme les colonnes de la matrice du modèle ont été commandées lors de la formation model
(y compris les cols factices à chaud), voir LightGBM # 209