1、网格搜索是什么?
回答:网格搜索(grid search)主要是指尝试重要参数的所有可能组合,找到最佳泛化性能的参数组合。为了得到对泛化性能的更好估计,可以使用交叉验证来评估每种参数组合的性能,而不是仅将数据单次划分为训练集与验证集。
2、训练集、验证集、测试集三者的区别?
回答:训练集用于构建模型,验证集用于选择模型参数,测试集用于评估所选参数性能。
3、手写带交叉验证的网格搜索
import numpy as np
from sklearn.svm import SVC #假设用SVC分类器
from sklearn.model_selection import train_test_split #划分训练集、测试集
from sklearn.model_selection import cross_val_score #交叉验证
from sklearn.datasets import load_iris #以iris数据集为例
iris=load_iris()
X_trainval,X_test,y_trainval,y_test=train_test_split(iris.data,iris.target,random_state=0)
best_score=0
#有多少个参数,就用多少层for循环
for gamma in [0.001,0.01,0.1,1,10,100]:
for C in [0.001,0.01,0.1,1,10,100]:
svm=SVC(gamma=gamma,C=C)
scores=cross_val_score(svm,X_trainval,y_trainval,cv=5) #这里必须用训练集,不能用全集,降低参数过拟合的风险。
score=np.mean(scores)
if score > best_score:
best_score=score
best_parameters={
'C':C,'gamma':gamma}
svm=SVC(**best_parameters)
svm.fit(X_trainval,y_trainval)
svm.score(X_test,y_test)
4、调包GridSearchCV
from sklearn.model_selection import GridSearchCV
grid_search=GridSearchCV(SVC(),param_grid)
#param_grid的两种表达形式
param_grid={
'gamma':[0.001,0.01,0.1,1,10,100],'C':[0.001,0.01,0.1,1,10,100]} #在网格空间中搜索
param_grid=[{
'kernel':['linear'],'gamma':[0.001,0.01,0.1,1,10,100],'C':[0.001,0.01,0.1,1,10,100]},
{
'kernel':['rbf'],'gamma':[0.001,0.01,0.1,1,10,100],'C':[0.001,0.01,0.1,1,10,100]}] #在非网格空间中搜索
#以下是GridSearchCV的参数
GridSearchCV(
estimator,
param_grid,
scoring=None,
n_jobs=None,
iid='warn',
refit=True,
cv='warn',
verbose=0,
pre_dispatch='2*n_jobs',
error_score='raise-deprecating',
return_train_score=False,
)
# grid_search相当于一个估计器estimator
grid_search.fit(X_trainval,y_trainval) #用训练集
grid_search.score(X_test,y_test)
grid_search.predict()
grid_search.best_score_ #交叉验证下最好的平均准确率
grid_search.best_params_ #最佳参数组合
grid_search.cv_results_ #网格搜索的所有score结果,字典格式,可转化为df格式,再可视化分析
说明:GridSearchCV自带交叉验证,通过参数cv设置,与cross_val_score类似。
5、参数调优的要点?
回答:调节参数对于获得良好的性能是非常重要的。参数的范围要足够大,每个参数的最佳取值不能位于图像的边界上。如果对于不同的参数设置看不到score变化,可能是这个参数根本不重要。通常最好一开始就尝试非常极端的值,以观察改变参数是否会导致score变化。
6、嵌套交叉验证是什么?
回答:网格搜索过分依赖单次划分的训练集和测试集,可使用嵌套交叉验证进行多次划分。由于嵌套交叉验证不提供可用于新数据的模型,所以在寻找可用于未来数据的预测模型时很少用到它。
cross_val_score(GridSearchCV(SVC(),param_grid,cv=5),iris.data,iris.target,cv=5) #iris全集
7、提高运行速度的方法?
回答:可以设置n_job=-1来使用所有可用的内核。对于Spark用户,还可以使用最新开发的spark-sklearn包,它允许在已经建好的Spark集群上运行网格搜索。
以上总结,参考《Python机器学习基础教程》,感谢!