SVR,SVM,Gradient boosting和XGBoost永远运行[python]

时间:2017-07-18 15:43:06

标签: python svm xgboost

我有一个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用于分类问题。

2 个答案:

答案 0 :(得分:0)

让我们看看你正在使用的网格:

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设置为使用所有可用的并行核心。但我会更聪明地使用网格。搜索较小的空间。

答案 1 :(得分:0)

设置n_jobs = 1是一个很好的解决方案,但是更好的解决方法是改为使用Randomsearch()。

事实证明,随机网格点选择可以更快,更有效地达到更好的模型。

相关问题