machine-learning - 为什么使用 LGB 时 10 倍交叉验证甚至比 1 倍拟合更快?
问题描述
我正在使用 LGB 来处理机器学习任务。但是我发现当我使用 sklearn APIcross_val_score
和 setcv=10
时,时间成本小于单倍拟合。我使用 拆分数据集train_test_split
,然后在训练集上拟合 LGBClassifier。后者的时间成本远高于前者,为什么呢?
对不起,我的英语不好。
环境:Python 3.5、scikit-learn 0.20.3、lightgbm 2.2.3 Inter Xeon CPU E5-2650 v4 内存128GB
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)
解决方案
对不起,我找到了答案。此处在 LightGBM 的文档中写道:“为了获得最佳速度,请将其设置为实际 CPU 内核的数量,而不是线程的数量”。所以setn_jobs=-1
不是最好的选择。
推荐阅读
- python - Cisco WebEx:使用 Python 2.7 为一组新令牌生成新代码时出现问题
- php - 如何在 laravel 版本 5.0.35 中配置任何 restful api 包,如 laravel/passort 或 dingo/api(*没有作曲家)
- html - 是否有任何 CSS 代码来定位图像,如下所示但也响应屏幕尺寸?
- python - 将 do-while 从 C 转换为 Python
- javascript - Knex await 如何执行数据库查询?
- c# - 从 IList 而不是 IEnumerable (C#) 获取数据
- hive - Hive 中的左连接未返回预期结果
- dart - 这两个变量的答案是什么?两者之间有什么区别?
- javascript - 有没有办法在 qml 中从网上下载图像
- swift - 如何将数据从一个 UIViewController 传递到另一个?