Ошибка LightGBM: ValueError: для ранней остановки для оценки требуется как минимум один набор данных и eval metri c - PullRequest
1 голос
/ 09 мая 2020

Я пытаюсь обучить LightGBM с помощью gridsearch, я получаю следующую ошибку при попытке обучить модель.

ValueError: For early stopping, at least one dataset and eval metric is required for evaluation

Я предоставил набор данных проверки и метрику оценки c. Не знаю, почему до сих пор возникает эта проблема. Вот мой код.

train_data  = rtotal[rtotal['train_Y'] == 1]
test_data   = rtotal[rtotal['train_Y'] == 0]

trainData, validData = train_test_split(train_data, test_size=0.007, random_state = 123)

#train data prep
X_train = trainData.iloc[:,2:71]
y_train = trainData.loc[:,['a_class']]

#validation data prep
X_valid = validData.iloc[:,2:71]
y_valid = validData.loc[:,['a_class']]

#X_test
X_test = test_data.iloc[:,2:71]

import lightgbm as lgb
from sklearn.model_selection import GridSearchCV

gridParams = {
    'learning_rate': [0.005],
    'n_estimators': [40],
    'num_leaves': [16,32, 64],
    'objective' : ['multiclass'],
    'random_state' : [501],
    'num_boost_round' : [3000],
    'colsample_bytree' : [0.65, 0.66],
    'subsample' : [0.7,0.75],
    'reg_alpha' : [1,1.2],
    'reg_lambda' : [1,1.2,1.4],
    }

lgb_estimator = lgb.LGBMClassifier(boosting_type = 'gbdt', 
                                   n_estimators=500, 
                                   objective = 'multiclass', 
                                   learning_rate =  0.05, num_leaves =  64,  
                                   eval_metric  = 'multi_logloss',
                                   verbose_eval=20, 
                                   eval_set = [X_valid, y_valid],
                                   early_stopping_rounds=100)

g_lgbm = GridSearchCV(estimator=lgb_estimator, param_grid=gridParams, n_jobs = 3, cv= 3)

lgb_model = g_lgbm.fit(X=X_train, y=y_train)

1 Ответ

0 голосов
/ 10 мая 2020

Из того, что я вижу в предоставленном коде, у вас есть пара проблем:

  1. Вы определяете свою классификацию как мультикласс, это не совсем так, поскольку вы определяете свой вывод как один столбец, который, как я полагаю, может иметь несколько меток внутри него.

  2. Если вы хотите преждевременную остановку, вам необходимо предоставить набор проверки, как четко указано в сообщении об ошибке. И делать это нужно подходящим методом.

Если вы исправите код для этих ошибок, он будет успешно работать:

gridParams = { 
    'learning_rate': [0.005],
    'n_estimators': [40],
    'num_leaves': [16,32, 64], 
    'random_state' : [501],
    'num_boost_round' : [3000],
    'colsample_bytree' : [0.65, 0.66],
    'subsample' : [0.7,0.75],
    'reg_alpha' : [1,1.2],
    'reg_lambda' : [1,1.2,1.4], 
    }

lgb_estimator = lgb.LGBMClassifier(boosting_type = 'gbdt', 
                                   n_estimators=500, 
                                   learning_rate =  0.05, num_leaves =  64,  
                                   eval_metric  = 'logloss',
                                   verbose_eval=20, 
                                   early_stopping_rounds=10)

g_lgbm = GridSearchCV(estimator=lgb_estimator, param_grid=gridParams, n_jobs = 3, cv= 3)

lgb_model = g_lgbm.fit(X=X_train, y=y_train, eval_set = (X_valid, y_valid))

...
[370]   valid_0's binary_logloss: 0.422895
[371]   valid_0's binary_logloss: 0.423064
[372]   valid_0's binary_logloss: 0.422681
[373]   valid_0's binary_logloss: 0.423206
[374]   valid_0's binary_logloss: 0.423142
[375]   valid_0's binary_logloss: 0.423414
[376]   valid_0's binary_logloss: 0.423338
[377]   valid_0's binary_logloss: 0.423864
[378]   valid_0's binary_logloss: 0.42381
[379]   valid_0's binary_logloss: 0.42409
[380]   valid_0's binary_logloss: 0.423476
[381]   valid_0's binary_logloss: 0.423759
[382]   valid_0's binary_logloss: 0.423804
Early stopping, best iteration is:
[372]   valid_0's binary_logloss: 0.422681
...