我遇到的问题是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_ )
答案 0 :(得分:12)
哪种内核效果最好取决于您的数据。样品和尺寸的数量以及您拥有的数据类型是多少? 对于可比较的范围,您需要标准化您的数据,通常StandardScaler,它的零均值和单位方差,是一个好主意。 如果您的数据是非负数,则可以尝试使用MinMaxScaler。
对于kernel="gamma"
,我通常会
{'C': np.logspace(-3, 2, 6), 'gamma': np.logspace(-3, 2, 6)}
这是基于什么,但在过去几年里我很好。 我强烈建议不使用非对数网格,甚至更多的建议使用离散参数进行随机搜索。随机搜索的一个主要优点是您可以使用连续分布[see the docs]实际搜索连续参数。
答案 1 :(得分:5)
要搜索超参数,最好先了解每个参数的作用......
C : float, optional (default=1.0)
Penalty parameter C of the error term.
你应该尝试按数量级(0,0.1,1,10,100)改变它,然后可能会减少你的搜索幅度,但我认为它不会改善你的模型。
degree : int, optional (default=3)
Degree of the polynomial kernel function (‘poly’). Ignored by all other kernels.
在这里你应该改变你进行网格搜索的方式,因为正如文档所示,度仅用于多项式内核,因此在使用'rbf'内核时你会浪费时间寻找每个度数。 另一点是,使用两个度数会使你的数据过度拟合。这里使用类似(1,2,3,4,5)的东西
coef0的相同注释,因为它仅用于'poly'内核
tol : float, optional (default=1e-3)
Tolerance for stopping criterion.
我不会接触到这一点,你的价值范围确实没有任何意义。
我对gamma参数并不熟悉。
因此请使用此表示而不是您的(http://scikit-learn.org/stable/modules/grid_search.html#exhaustive-grid-search):
param_grid = [
{'C': [1, 10, 100, 1000], 'kernel': ['linear']},
{'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']},
]
并尝试了解每个参数的含义:
http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf
http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html