почему 10-кратная перекрестная проверка даже быстрее, чем 1-кратная подгонка при использовании LGB? - PullRequest
1 голос
/ 22 мая 2019

Я использую LGB, чтобы справиться с задачей наклона машины. Но я обнаружил, что когда я использую sklearn API cross_val_score и устанавливаю cv=10, затраты времени меньше, чем подгонка в один раз. Я разделил набор данных, используя train_test_split, затем поместил LGBClassifier на тренировочный набор. Стоимость последних намного больше, чем прежняя, почему?

Извините за мой плохой английский.

Среда: Python 3.5, scikit-learn 0.20.3, lightgbm 2.2.3 Inter Xeon CPU E5-2650 v4 Память 128ГБ

X = train_df.drop(['uId', 'age'], axis=1)
Y = train_df.loc[:, 'age']
X_test = test_df.drop(['uId'], axis=1)

X_train, X_val, Y_train, Y_val = train_test_split(X, Y, test_size=0.1,
                                                  stratify=Y)

# (1809000, 12) (1809000,) (201000, 12) (201000,) (502500, 12)
print(X_train.shape, Y_train.shape, X_val.shape, Y_val.shape, X_test.shape)

from lightgbm import LGBMClassifier
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import cross_val_score
from sklearn.metrics import accuracy_score
import time

lgb = LGBMClassifier(n_jobs=-1)

tic = time.time()
scores = cross_val_score(lgb, X, Y,
                         scoring='accuracy', cv=10, n_jobs=-1)
toc = time.time()
# 0.3738402985074627 0.0009231167322574765 300.1487271785736
print(np.mean(scores), np.std(scores), toc-tic)

tic = time.time()
lgb.fit(X_train, Y_train)
toc = time.time()
# 0.3751492537313433 472.1763586997986 (is much more than 300)
print(accuracy_score(Y_val, lgb.predict(X_val)), toc-tic)

1 Ответ

0 голосов
/ 27 мая 2019

Извините, я нашел ответ. Вот что написано в документации LightGBM: «для лучшей скорости установите это количество реальных ядер ЦП, а не количество потоков». Поэтому набор n_jobs=-1 не лучший выбор.

...