use*_*838 15 machine-learning svm scikit-learn hyperparameters
我遇到的问题是我的超参数svm.SVC()太宽,以至于GridSearchCV()永远不会完成!一个想法是改为使用RandomizedSearchCV().但同样,我的数据集相对较大,因此500次迭代需要大约1小时!
我的问题是,为了阻止浪费资源,GridSearchCV(或RandomizedSearchCV)的一个好的设置(就每个超参数的值范围而言)是什么?
换句话说,如何判断C100以上的值是否有意义和/或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_ )
Run Code Online (Sandbox Code Playgroud)
And*_*ler 14
哪种内核最有效取决于您的数据.样品和尺寸的数量以及您拥有的数据类型是多少?对于可比较的范围,您需要标准化您的数据,通常StandardScaler,它的零均值和单位方差,是一个好主意.如果您的数据是非负数,则可以尝试使用MinMaxScaler.
因为kernel="gamma",我通常这样做
{'C': np.logspace(-3, 2, 6), 'gamma': np.logspace(-3, 2, 6)}
Run Code Online (Sandbox Code Playgroud)
这是基于什么,但在过去几年里我很好.我强烈建议不使用非对数网格,甚至更多的建议使用离散参数进行随机搜索.随机搜索的一个主要优点是您可以使用连续分布实际搜索连续参数[请参阅文档].
要搜索超参数,最好还是要了解每个参数的作用......
C : float, optional (default=1.0)
Penalty parameter C of the error term.
Run Code Online (Sandbox Code Playgroud)
您应该尝试按数量级(0,0.1,1,10,100)更改它,然后可能会减少您的搜索幅度,但我认为它不会改善您的模型.
degree : int, optional (default=3)
Degree of the polynomial kernel function (‘poly’). Ignored by all other kernels.
Run Code Online (Sandbox Code Playgroud)
在这里你应该改变你进行网格搜索的方式,因为正如文档所示,度仅用于多项式内核,因此在使用'rbf'内核时你将浪费时间寻找每个度数.另一点是,使用两个度数会使你的数据过度拟合.这里使用像(1,2,3,4,5)这样的东西
coef0的注释相同,因为它仅用于'poly'内核
tol : float, optional (default=1e-3)
Tolerance for stopping criterion.
Run Code Online (Sandbox Code Playgroud)
我不会接触到这一点,你的价值范围实际上没有任何意义.
我对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']},
]
Run Code Online (Sandbox Code Playgroud)
并尝试了解每个参数的含义:
http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf
http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html
| 归档时间: |
|
| 查看次数: |
16316 次 |
| 最近记录: |