Grid Search
初学机器学习,之前的模型都是手动调参的,效果一般。同学和我说他用了一个叫grid search的方法、可以实现自动调参,顿时感觉非常高级。吃饭的时候想调参的话最差不过也就是粗暴遍历吧,没想到回来看了grid search发现其实就是粗暴遍历
emmm越学越觉得,机器学习解决问题的思路有时候真的很粗暴
原文看这里吧,这篇文章总结的很好:https://www.jianshu.com/p/55b9f2ea283b
不过深度学习算是不用这种方法了,几千个feature嵌套起来怕是没救了
附上一个sklearn中gridSearch的实现:
>>> from sklearn import svm, datasets
>>> from sklearn.model_selection import GridSearchCV
>>> iris = datasets.load_iris()
>>> parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]}
>>> svc = svm.SVC()
>>> clf = GridSearchCV(svc, parameters)
>>> clf.fit(iris.data, iris.target)
GridSearchCV(estimator=SVC(),
param_grid={'C': [1, 10], 'kernel': ('linear', 'rbf')})
>>> sorted(clf.cv_results_.keys())
['mean_fit_time', 'mean_score_time', 'mean_test_score',...
'param_C', 'param_kernel', 'params',...
'rank_test_score', 'split0_test_score',...
'split2_test_score', ...
'std_fit_time', 'std_score_time', 'std_test_score']
- 注意上面的
'C':[1, 10]
不是1到10的意思,而是1和10,因为例子写的不太典型,[]的用法是这样的:'C': [1, 10, 100, 1000]
.如果要使用步长获取数组,应该这样写:list(range(from,to,step))
,当然这样只能以整数为步长,如果要使用小数的话可以使用Numpy的arange:list(np.arange(from,to,step))
- 注意方法的名称上面带了一个CV,它表示cross-validation.这里为什么要使用交叉验证呢?因为和直接train不同,直接train的时候我们只需要不断在整个训练集进行训练即可;而这里还涉及到了一个验证的问题,就是验证哪个参数效果是最好的,这就要求必须有一部分未经过训练的数据供验证(因为训练了的话表现会失实,一般会比未训练地表现好,因为我们已经对这些数据的验证误差修改了模型),所以必须使用交叉验证