我遇到的问题是 svm.SVC()
的超参数太宽,导致 GridSearchCV()
永远无法完成!一种想法是使用 RandomizedSearchCV()
来代替。但同样,我的数据集相对较大,500 次迭代大约需要 1 小时!
我的问题是,为了停止浪费资源,GridSearchCV(或 RandomizedSearchCV )中的良好设置(就每个超参数的值范围而言)是什么?
换句话说,如何决定是否例如C
值大于 100 才有意义和/或步长 1 既大也不小?很感谢任何形式的帮助。这是我当前使用的设置:
parameters = {
'C': np.arange( 1, 100+1, 1 ).tolist(),
'kernel': ['linear', 'rbf'], # precomputed,'poly', 'sigmoid'
'degree': np.arange( 0, 100+0, 1 ).tolist(),
'gamma': np.arange( 0.0, 10.0+0.0, 0.1 ).tolist(),
'coef0': np.arange( 0.0, 10.0+0.0, 0.1 ).tolist(),
'shrinking': [True],
'probability': [False],
'tol': np.arange( 0.001, 0.01+0.001, 0.001 ).tolist(),
'cache_size': [2000],
'class_weight': [None],
'verbose': [False],
'max_iter': [-1],
'random_state': [None],
}
model = grid_search.RandomizedSearchCV( n_iter = 500,
estimator = svm.SVC(),
param_distributions = parameters,
n_jobs = 4,
iid = True,
refit = True,
cv = 5,
verbose = 1,
pre_dispatch = '2*n_jobs'
) # scoring = 'accuracy'
model.fit( train_X, train_Y )
print( model.best_estimator_ )
print( model.best_score_ )
print( model.best_params_ )
最佳答案
哪个内核工作得最好很大程度上取决于您的数据。样本数量和维度是多少?您有哪些数据? 为了使范围具有可比性,您需要对数据进行标准化,通常,StandardScaler 是一个好主意,它可以实现零均值和单位方差。 如果您的数据为非负数,您可以尝试 MinMaxScaler。
对于 kernel="gamma"
,我通常这样做
{'C': np.logspace(-3, 2, 6), 'gamma': np.logspace(-3, 2, 6)}
这毫无根据,但在过去几年里对我很有帮助。 我强烈建议不要使用非对数网格,甚至更不要使用离散参数的随机搜索。随机搜索的主要优点之一是您实际上可以使用连续分布搜索连续参数 [see the docs] .
关于machine-learning - 通过 GridSearchCV() 探索 svm.SVC() 超参数的最佳值范围是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26337403/