Я разрабатываю модель с 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 ядра. Спасибо за вашу помощь.