sklearn-GridSearchCV 网格搜索 调参数

Grid Search 网格搜索

GridSearchCV:一种调参的方法,当你算法模型效果不是很好时,可以通过该方法来调整参数,通过循环遍历,尝试每一种参数组合,返回最好的得分值的参数组合
比如支持向量机中的参数 C 和 gamma ,当我们不知道哪个参数效果更好时,可以通过该方法来选择参数,我们把C 和gamma 的选择范围定位[0.001,0.01,0.1,1,10,100]
每个参数都能组合在一起,循环过程就像是在网格中遍历,所以叫网格搜索

c=0.001c=0.01c=0.1c=1c=10c=100
gamma =0.001SVC( gamma=0.001,C=0.001)
gamma =0.01SVC( gamma=0.01,C=0.001)
gamma= 10SVC( gamma=10,C=0.001)
gamma=100SVC( gamma=100,C=0.001)

下面来通过具体代码看看怎么调优:

from sklearn.datasets import load_iris
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split 
iris = load_iris()
X_train,X_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=0)
print("训练集个数:%d  测试集个数:%d "%((len(X_train)),len(X_test)))
#开始进行网格搜索
best_score = 0
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)
        svm.fit(X_train,y_train)
        score = svm.score(X_test,y_test)
        if score > best_score:
            best_score = score
            best_parameters = {'gamma':gamma,'C':C}
print("best_score:{:.2f}".format(best_score))
print("best_parameters:{}".format(best_parameters))

输出:

训练集个数:112  验证集个数:38 
best_score:0.97
best_parameters:{'gamma': 0.001, 'C': 100}

存在的问题
原来的数据集分割为训练集和测试集之后,其中测试集起到的作用有两个,一个是用来调整参数,一个是用来评价模型的好坏,这样会导致评分值会比实际效果要好。(因为我们将测试集送到了模型里面去测试模型的好坏,而我们目的是要将训练模型应用在没使用过的数据上。)

解决方法:
我们可以通过把数据集划分三份,一份是训练集(训练数据),一份是验证集(调整参数),一份是测试集(测试模型)。

具体代码如下:

X_trainval,X_test,y_trainval,y_test = train_test_split(iris.data,iris.target)
X_train,X_val,y_train,y_val = train_test_split(X_trainval,y_trainval)
print("训练集个数:%d  验证集个数:%d  测试集个数:%d "%((len(X_train)),len(X_val),len(X_test)))
best_scroe = 0
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)
        svm.fit(X_train,y_train)
        score = svm.score(X_val,y_val)
        if score > best_score:
            best_score = score
            best_parameters = {'gamma':gamma,'C':C}
svm = SVC(**best_parameters)
svm.fit(X_trainval,y_trainval)
test_score = svm.score(X_test,y_test)
print("best_score:{:.2f}".format(best_score))
print("best_parameters:{}".format(best_parameters))
print("best_score:{:.2f}".format(test_score))

输出:

训练集个数:84  验证集个数:28  测试集个数:38 
best_score:1.00
best_parameters:{'gamma': 0.001, 'C': 100}
best_score:0.95

进一步改进:
为了防止模型过拟合,我们使用交叉验证的方法

Grid Search with Cross Validation(GridSearchCV)

from sklearn.model_selection import cross_val_score
best_score = 0.0
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 = scores.mean()
        if score > best_score:
            best_score = score 
            best_parameters = {'gamma':gamma,'C':C}
svm = SVC(**best_parameters)
svm.fit(X_trainval,y_trainval)
test_score = svm.score(X_test,y_test)
print("best_score:{:.2f}".format(best_score))
print("best_parameters:{}".format(best_parameters))
print("best_score:{:.2f}".format(test_score))

输出:

best_score:0.97
best_parameters:{'gamma': 0.1, 'C': 1}
best_score:0.95

为了方便调参,sklearn 设置了一个类 GridSearchCV ,用来实现上面的fit,score等功能。

from sklearn.model_selection import GridSearchCV
#需要求的参数的范围(列表的形式)
param_grid = {"gamma":[0.001,0.01,0.1,1,10,100],
              "C":[0.001,0.01,0.1,1,10,100]}
#estimator模型 (将所求参数之外的确定的参数给出 )
estimator = SVC()
grid_search = GridSearchCV(estimator,param_grid,cv = 5)
X_train,X_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=10)
grid_search.fit(X_train,y_train)
print("Best set score:{:.2f}".format(grid_search.best_score_))
print("Best parameters:{}".format(grid_search.best_params_))
print("Test set score:{:.2f}".format(grid_search.score(X_test,y_test)))

输出

Best set score:0.98
Best parameters:{'gamma': 0.1, 'C': 10}
Test set score:0.97

总结

GridSearchCV能够使我们找到范围内最优的参数,param_grid参数越多,组合越多,计算的时间也需要越多,GridSearchCV使用于小数据集。

  • 14
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
支持向量机回归(SVR)是一种非常有效的机器学习算法,可以用于预测连续型变量。然而,SVR模型的性能高度依赖于超参数的选择。因此,我们需要对超参数进行优以得到最佳的模型。网格搜索是一种常用的优方法,通过指定一组超参数的取值范围,GridSearchCV会自动遍历所有可能的超参数组合,并返回使得模型性能最优的超参数组合。 下面是使用GridSearchCV进行SVR参数优的步骤: 1. 导入必要的库和数据集: ```python from sklearn.model_selection import GridSearchCV from sklearn.svm import SVR from sklearn.datasets import load_boston boston = load_boston() X = boston.data y = boston.target ``` 2. 定义超参数的取值范围: ```python param_grid = {'C': [0.1, 1, 10, 100], 'gamma': [0.1, 1, 10, 100], 'kernel': ['rbf', 'linear']} ``` 我们定义了3个超参数C、gamma和kernel的取值范围。其中C表示正则化强度,gamma表示核函数系数,kernel表示核函数类型。 3. 实例化一个SVR模型对象: ```python svr = SVR() ``` 4. 使用GridSearchCV进行参数搜索: ```python grid_search = GridSearchCV(svr, param_grid, cv=5, scoring='neg_mean_squared_error') grid_search.fit(X, y) ``` 我们将SVR模型对象和超参数取值范围作为参数传递给GridSearchCV,cv参数表示使用5折交叉验证,scoring参数指定了评估指标,这里使用的是均方误差(MSE)的相反数。 5. 输出最优的模型参数: ```python print(grid_search.best_params_) ``` 通过打印出来的最优参数,我们就可以使用这组参数来训练一个最优的SVR模型。 总之,使用GridSearchCV方法可以帮助我们在一定程度上避免手动参的过程,从而得到更加优秀的模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值