web-dev-qa-db-fra.com

Recherche de grille avec l'exemple LightGBM

J'essaie de trouver les meilleurs paramètres pour un modèle lightgbm en utilisant GridSearchCV de sklearn.model_selection. Je n'ai pas pu trouver de solution qui fonctionne réellement.

J'ai réussi à mettre en place un code partiellement fonctionnel:

import numpy as np
import pandas as pd
import lightgbm as lgb
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import KFold

np.random.seed(1)

train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
y = pd.read_csv('y.csv')
y = y.values.ravel()
print(train.shape, test.shape, y.shape)

categoricals = ['COL_A','COL_B']
indexes_of_categories = [train.columns.get_loc(col) for col in categoricals]

gkf = KFold(n_splits=5, shuffle=True, random_state=42).split(X=train, y=y)

param_grid = {
    'num_leaves': [31, 127],
    'reg_alpha': [0.1, 0.5],
    'min_data_in_leaf': [30, 50, 100, 300, 400],
    'lambda_l1': [0, 1, 1.5],
    'lambda_l2': [0, 1]
    }

lgb_estimator = lgb.LGBMClassifier(boosting_type='gbdt',  objective='binary', num_boost_round=2000, learning_rate=0.01, metric='auc',categorical_feature=indexes_of_categories)

gsearch = GridSearchCV(estimator=lgb_estimator, param_grid=param_grid, cv=gkf)
lgb_model = gsearch.fit(X=train, y=y)

print(lgb_model.best_params_, lgb_model.best_score_)

Cela semble fonctionner mais avec un UserWarning:

categorical_feature le mot clé a été trouvé dans params et sera ignoré. Veuillez utiliser categorical_feature argument du constructeur Dataset pour passer ce paramètre.

Je recherche une solution de travail ou peut-être une suggestion sur la façon de s'assurer que lightgbm accepte les arguments catégoriques dans le code ci-dessus

5
bhaskarc

Comme l'indique l'avertissement, categorical_feature N'est pas l'un des arguments LGBMModel. Il est pertinent dans l'instanciation lgb.Dataset, Qui dans le cas de l'API sklearn se fait directement dans la méthode fit()voir la doc . Ainsi, pour passer ceux dans l'optimisation GridSearchCV, il faut le fournir comme argument de la méthode GridSearchCV.fit() dans le cas de sklearn v0.19.1 ou comme un supplément fit_params argument dans GridSearchCV instanciation dans les anciennes versions de sklearn

5
Mykhailo Lisovyi