我有一个15,000个小数据集,有13个功能。所有输入都是整数,没有很大的数字。
我使用这些数据通过Gridsearch训练分类器,如SVR,SVM,XGboost等。
然而,每个培训过程都需要永远。(超过60分钟)
我已经扩展了输入数据X但仍然需要很长时间。另外,从其他有类似问题的帖子中,已经添加了catch_size iin分类器,例如SVC(cache_size = 7000)来训练模型,但是加速计算似乎无能为力。
它自己的数据非常小,所以我觉得这很奇怪。
这是我的代码示例,如果有人能给我任何建议,我会非常感激。
from xgboost.sklearn import XGBRegressor
one_to_left = st.beta(10, 1)
from_zero_positive = st.expon(0, 50)
params = {
"n_estimators": [100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200],
"max_depth": [2, 3, 4, 5, 6, 7, 8, 9, 10],
"learning_rate": [0.05, 0.4, 1, 1.5, 2, 2.5, 3, 4],
"colsample_bytree": [0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0],
"subsample":[0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0],
}
xgbreg = XGBRegressor()
gs = GridSearchCV(xgbreg, params)
gs.fit(X_train, y_train)
y_gs = gs.predict(X_test)
目标变量y是回归问题的整数百分比;二进制数据0和1用于分类问题。
让我们看看你正在使用的网格:
params = {
"n_estimators": [100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200],
"max_depth": [2, 3, 4, 5, 6, 7, 8, 9, 10],
"learning_rate": [0.05, 0.4, 1, 1.5, 2, 2.5, 3, 4],
"colsample_bytree": [0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0],
"subsample":[0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0],
}
网格总大小为:
from numpy import prod
grid_size_per_parameter = [len(i) for i in params.values()]
### [8, 11, 9, 8, 8]
prod(grid_size_per_parameter)
50688 # this is how many models you need to train, not counting cv folds
你有一个大网格。很多模型要训练。我的意思是如果这需要一个小时你仍然每分钟训练1000个模型:)
如果你有多CPU机器,你可以设置n_jobs= -1
使用所有可用的并行内核。但我会更聪明地使用网格。搜索较小的空间。
设置n_jobs = 1
是一个很好的解决方案,但更好的方法是使用Randomsearch()代替。
事实证明,随机网格点选择可以更快,更有效地达到更好的模型。