模型评估与改进(二)// 网格搜索

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机器学习基础教程》,感谢!

你可能感兴趣的:(Python)