Как использовать joblib для создания LightGBM? - PullRequest
1 голос
/ 02 марта 2020

Я разрабатываю модель с 2M строками, но кадр данных pandas выдает ошибку памяти при чтении файла. Я использую python 3.6. Я использовал dask dataframe для чтения файла и пытался использовать scikit learn с помощью joblib для обучения модели. Код работал нормально, но с большим временем ожидания, большим использованием памяти и процессора, влияющим на другие выполняемые задания. Приведенный ниже код для справки.

import dask
import dask.dataframe as dd
from dask.distributed import Client
from dask_ml.model_selection import train_test_split
import joblib
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import roc_curve, auc
import lightgbm as lgb
client = Client(processes=False)
#read data and split
train_data= dd.read_parquet('s3://bucket/my-parquet-data')
X_train, X_test, y_train, y_test = train_test_split(train_data.loc[:,X],
                                                    train_data.loc[:,y],
                                                    test_size=0.20,
                                                    random_state=42)
estimator= lgb.LGBMClassifier(boosting_type='gbdt',n_jobs=-1, silent=True, importance_type='gain'
objective='binary','is_unbalance': True)

param_grid = {
'learning_rate': [0.7, 0.1, 0.15],
'n_estimators': [150, 200, 250],
'max_depth': [3,4,5]
}
gbm = GridSearchCV(estimator, param_grid, cv=3)
with joblib.parallel_backend('dask'):
# Will this use each chunk to train data. So parallel processing and boosting will work fine here? Referense on [joblib][1]
     gbm.fit(X_train, y_train,
     eval_set=[(X_test, y_test)],
     eval_metric='logloss',
     early_stopping_rounds=20)
#AUC and Curve
#Any suggestions to avoid compute and still able to get auc and plot the curve?
y_test=test_y.compute().ravel()
prd_test = gbm.predict_proba(X)[:,1].compute() 
#for curve;
fpr, tpr, threshold = roc_curve(y_test, prd_test )
auc_ = auc(fpr, tpr)

Может ли кто-нибудь помочь мне с:

1) Является ли параллельный бэкэнд правильным способом обучения бустерного дерева? Я скучаю по какой-либо теории, например, параллельной обработке и усилению go прямо здесь? Будет ли это позаботиться обо всех разделах в бэкэнде, то есть прочитать все, чтобы соответствовать модели.

2) Оптимизировать код, чтобы он работал быстро и занимал меньше памяти. Любые параметры для оценки. Я использовал n_job = -1 для параллельного запуска

3) Как рассчитать ROC / AU C без использования вычислений (поместить массивы в память)?

4) Есть ли способ построить AU C без использования вычислений и размещения массивов в памяти.

Нужен ли где-нибудь между ними .persist(), чтобы ускорить процесс? Я использую 3 рабочих по 2 ядра. Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 04 марта 2020

1) Ваш параллельный бэкэнд должен действительно работать. Это должно гарантировать, что операции подбора модели распределены по вашим машинам. LightGBM может работать на всех ядрах для каждой машины с n_jobs=-1,

2) Вы можете попытаться уменьшить пространство функций, используя SV C или PCA, чтобы уменьшить размерность ваших данных. Я бы также посоветовал вам пересмотреть свое пространство поиска. Вот отличная вики-страница о том, как настроить модель LightGBM https://github.com/microsoft/LightGBM/blob/master/docs/Parameters-Tuning.rst. Другой вариант для вас - использовать spark https://github.com/Azure/mmlspark/blob/master/docs/lightgbm.md. Наконец, вы можете попробовать запустить randomizedsearchCV, поскольку это часто находит очень хорошее решение по сравнению с исчерпывающим поиском по сетке (вы можете соответствующим образом расширить пространство поиска)

Я бы также посоветовал вам не настраивать n_estimators параметр при использовании ранней остановки. Просто установите его, например, на 5000, lightgbm остановится, когда оценка не улучшится для early_stopping_rounds=20, как вы указали.

Я не уверен, что вы имеете в виду с 3) и 4)

...