Python 如何使用joblib parallelbackend安装LightGBM?

Python 如何使用joblib parallelbackend安装LightGBM?,python,machine-learning,dask,joblib,lightgbm,Python,Machine Learning,Dask,Joblib,Lightgbm,我正在开发一个有2M行的模型,但是熊猫数据帧在读取文件时抛出内存错误。我正在使用python 3.6 我使用dask dataframe读取文件,并尝试使用scikit learn和joblib来训练模型。代码运行良好,但等待时间较长,内存和cpu使用率较高,会影响其他正在运行的作业。以下代码供参考 import dask import dask.dataframe as dd from dask.distributed import Client from dask_ml.model_sele

我正在开发一个有2M行的模型,但是熊猫数据帧在读取文件时抛出内存错误。我正在使用python 3.6 我使用dask dataframe读取文件,并尝试使用scikit learn和joblib来训练模型。代码运行良好,但等待时间较长,内存和cpu使用率较高,会影响其他正在运行的作业。以下代码供参考

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) 并行后端是训练boosting树的正确方法吗?我是否遗漏了任何理论,比如并行处理和提升是否就在这里?。这将照顾到后端的所有分区,即读取所有以适应模型

2) 优化代码以快速运行并消耗更少的内存。任何参数的估计。对于并行运行,我使用了n_job=-1

3) 如何在不使用compute(将数组放入内存)的情况下计算ROC/AUC

4) 是否有任何方法可以在不使用计算并将数组放入内存的情况下绘制AUC

我是否需要介于两者之间的
.persist()
来加快进程?我使用3个工人,每个工人有2个核心 感谢您的帮助。

1)您的dask并行后端确实应该可以工作。这应该确保模型拟合操作分布在您的机器上。LightGBM能够在具有
n_作业=-1
的每台机器的所有内核上运行

2) 您可以尝试使用SVC或PCA来减少数据的维数,从而减少特征空间。我还建议你重新考虑你的搜索空间。下面是一个关于如何优化LightGBM模型的很棒的wiki页面。另一个选择是使用spark。最后,您可以尝试运行randomizedsearchCV,因为与穷举网格搜索相比,它通常会找到一个非常好的解决方案,(然后您可以相应地扩展搜索空间)

我还建议您在使用提前停止时不要调整
n_估计器
参数。只需将其设置为例如5000,lightgbm将在您指定的
提前停止\u轮数=20的分数没有提高时停止


我不确定3)和4)是什么意思,我不认为joblib.parallel_backend('dask')
在这里可能会有任何影响。我不认为lightgbm在内部使用joblib。@托马格:几个问题。1) 所以我可以直接使用scikit学习程序(这里是light gbm)并传递dask数据帧来拟合和测试模型?2) 您是否知道,
dask_lightgbm.core
将在ml.dask.org上拥有与XGBoost类似的页面。请建议/分享使用dask数据帧培训scikit lightgbm的最佳方法。此外,还有快速找到df.shape0的方法。我正在使用df.persist()、len(df.index),这是一项耗时的任务。如何在使用persist()后释放内存?df.persist()@TomAugspurger:嗨,汤姆,你能分享一些关于我如何使用dask数据帧来适应scikitlearn Lightgbm分类器的见解吗。同样在client.persist(df)之后,我可以通过使用client.restart()来减少内存使用。我注意到gc.collect有时会使用更多的CPU。。感谢您的帮助谢谢您的回答。是的,我会将其更新为RandomCV,将n_估计器更新为500。我正在寻找树木计数<200)。与spark ml相比,我更喜欢scikit learn。后面的文档不多。或者经过审查。对于3)和4):如您所见,我使用Dask数据帧来训练模型。预测输出是dask数组,它需要
.compute()
将其放入内存并将其传递给sklearn函数以计算ROC。我试图避免长度为1.5MAh的数组,明白了。也许你可以对你拥有的每个worker单独计算ROC,然后平均所有中间ROC值。当我使用.compute()获取数组时,我可以使用scikit学习函数计算ROC,但这会将内存%增加到>90%。即使删除了redt_测试或y_测试。我无法减少内存使用(尝试gc.collect)内存百分比的计算方式为:进程=psutil.process(os.getpid())内存=process.memory_percent()。使用prd_test=gbm.predict_proba(X)[:,1].compute()后如何减少%内存的任何见解。再次感谢你!!