使用预定义的验证集 Sklearn 执行网格搜索
Performing grid search with a predefined validation set Sklearn
这个问题之前已经问过好几次了。但是在按照答案
进行操作时出现错误
首先我指定哪部分是训练集和验证集如下。
my_test_fold = []
for i in range(len(train_x)):
my_test_fold.append(-1)
for i in range(len(test_x)):
my_test_fold.append(0)
然后执行网格搜索。
from sklearn.model_selection import PredefinedSplit
param = {
'n_estimators':[200],
'max_depth':[5],
'min_child_weight':[3],
'reg_alpha':[6],
'gamma':[0.6],
'scale_neg_weight':[1],
'learning_rate':[0.09]
}
gsearch1 = GridSearchCV(estimator = XGBClassifier(
objective= 'reg:linear',
seed=1),
param_grid = param,
scoring='roc_auc',
cv = PredefinedSplit(test_fold=my_test_fold),
verbose = 1)
gsearch1.fit(new_data_df, df_y)
但是我得到以下错误
object of type 'PredefinedSplit' has no len()
尝试替换
cv = PredefinedSplit(test_fold=my_test_fold)
与
cv = list(PredefinedSplit(test_fold=my_test_fold).split(new_data_df, df_y))
原因是您可能需要应用 split method 才能真正拆分为训练和测试(然后将其从可迭代对象转换为列表对象)。
我是作者的 hypopt
Python package (pip install hypopt
) 正是为了这个目的而创建的:使用验证集优化参数。它适用于 scikit-learn 模型,可以与 Tensorflow、PyTorch、Caffe2 等一起使用。
# Code from https://github.com/cgnorthcutt/hypopt
# Assuming you already have train, test, val sets and a model.
from hypopt import GridSearch
param_grid = [
{'C': [1, 10, 100], 'kernel': ['linear']},
{'C': [1, 10, 100], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']},
]
# Grid-search all parameter combinations using a validation set.
opt = GridSearch(model = SVR(), param_grid = param_grid)
opt.fit(X_train, y_train, X_val, y_val)
print('Test Score for Optimized Parameters:', opt.score(X_test, y_test))
编辑:hypopt 有什么变化导致最近突然的反对票吗?一些反馈会有所帮助,因为 hypopt 解决了这个确切的问题,如果有问题,我们应该解决它。
这个问题之前已经问过好几次了。但是在按照答案
进行操作时出现错误首先我指定哪部分是训练集和验证集如下。
my_test_fold = []
for i in range(len(train_x)):
my_test_fold.append(-1)
for i in range(len(test_x)):
my_test_fold.append(0)
然后执行网格搜索。
from sklearn.model_selection import PredefinedSplit
param = {
'n_estimators':[200],
'max_depth':[5],
'min_child_weight':[3],
'reg_alpha':[6],
'gamma':[0.6],
'scale_neg_weight':[1],
'learning_rate':[0.09]
}
gsearch1 = GridSearchCV(estimator = XGBClassifier(
objective= 'reg:linear',
seed=1),
param_grid = param,
scoring='roc_auc',
cv = PredefinedSplit(test_fold=my_test_fold),
verbose = 1)
gsearch1.fit(new_data_df, df_y)
但是我得到以下错误
object of type 'PredefinedSplit' has no len()
尝试替换
cv = PredefinedSplit(test_fold=my_test_fold)
与
cv = list(PredefinedSplit(test_fold=my_test_fold).split(new_data_df, df_y))
原因是您可能需要应用 split method 才能真正拆分为训练和测试(然后将其从可迭代对象转换为列表对象)。
我是作者的 hypopt
Python package (pip install hypopt
) 正是为了这个目的而创建的:使用验证集优化参数。它适用于 scikit-learn 模型,可以与 Tensorflow、PyTorch、Caffe2 等一起使用。
# Code from https://github.com/cgnorthcutt/hypopt
# Assuming you already have train, test, val sets and a model.
from hypopt import GridSearch
param_grid = [
{'C': [1, 10, 100], 'kernel': ['linear']},
{'C': [1, 10, 100], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']},
]
# Grid-search all parameter combinations using a validation set.
opt = GridSearch(model = SVR(), param_grid = param_grid)
opt.fit(X_train, y_train, X_val, y_val)
print('Test Score for Optimized Parameters:', opt.score(X_test, y_test))
编辑:hypopt 有什么变化导致最近突然的反对票吗?一些反馈会有所帮助,因为 hypopt 解决了这个确切的问题,如果有问题,我们应该解决它。