交叉验证,⽹格搜索

1. 什么是交叉验证(cross validation)

交叉验证:将拿到的训练数据,分为训练和验证集。以下图为例:将数据分成4份,其中⼀份作为验证集。然后经过4次 (组)的测试,每次都更换不同的验证集。即得到4组模型的结果,取平均值作为最终结果。⼜称4折交叉验证。

1.1 分析

我们之前知道数据分为训练集和测试集,但是为了让从训练得到模型结果更加准确。做以下处理

  • 训练集:训练集+验证集
  • 测试集:测试集
    在这里插入图片描述

1.2 为什么需要交叉验证

交叉验证⽬的:为了让被评估的模型更加准确可信
问题:这个只是让被评估的模型更加准确可信,那么怎么选择或者调优参数呢?

2 什么是⽹格搜索(Grid Search)

通常情况下,有很多参数是需要⼿动指定的(如k-近邻算法中的K值),这种叫超参数。但是⼿动过程繁杂,所以需要 对模型预设⼏种超参数组合。每组超参数都采⽤交叉验证来进⾏评估。最后选出最优参数组合建⽴模型。
在这里插入图片描述

3 交叉验证,⽹格搜索(模型选择与调优)API:

sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)

  • 对估计器的指定参数值进⾏详尽搜索
  • estimator:估计器对象
  • param_grid:估计器参数(dict){“n_neighbors”:[1,3,5]}
  • cv:指定⼏折交叉验证
  • fit:输⼊训练数据
  • score:准确率
  • 结果分析:
    • bestscore__:在交叉验证中验证的最好结果
    • bestestimator:最好的参数模型
    • cvresults:每次交叉验证后的验证集准确率结果和训练集准确率结果

4 鸢尾花案例增加K值调优

#获取数据
from sklearn.datasets import load_iris
#数据基本处理(训练集和测试集)
from sklearn.model_selection import train_test_split,GridSearchCV
#特征工程和特征预处理
from sklearn.preprocessing import StandardScaler
#机器学习
from sklearn.neighbors import KNeighborsClassifier


# 1.获取数据
iris=load_iris()

# 2.数据基本处理
x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,test_size=0.2,random_state=5)

# 3.特征工程 - 特征预处理
transfer=StandardScaler()
x_train=transfer.fit_transform(x_train)
x_test=transfer.fit_transform(x_test)

# 4.机器学习-KNN
# 4.1 实例化一个估计器
estimator=KNeighborsClassifier()

# 4.2 模型调优 --交叉验证,网格搜索
param_grid={"n_neighbors":[1,3,5,7]}
estimator=GridSearchCV(estimator,param_grid=param_grid,cv=5)

# 4.2 模型训练
estimator.fit(x_train,y_train)

# 5.模型评估
## 5.1 预测值结果输出
y_pre=estimator.predict(x_test)
print("预测值是:\n",y_pre)
print("预测值和真实值的对比是:\n",y_pre==y_test)

## 5.2 准确率计算
score=estimator.score(x_test,y_test)
print("准确率是:\n",score)

## 查看交叉验证,网罗搜索的一些属性
print("在交叉验证种,得到的最好结果是:\n",estimator.best_score_)
print("在交叉验证种,得到的最好的模型是:\n",estimator.best_estimator_)
print("在交叉验证种,得到的的模型结果是:\n",estimator.cv_results_)

  • 然后进⾏评估查看最终选择的结果和交叉验证的结果
预测值是:
 [1 1 2 0 2 1 0 1 0 1 1 1 2 2 0 0 2 2 0 0 1 2 0 1 1 2 1 1 1 2]
预测值和真实值的对比是:
 [ True False  True  True  True  True  True  True  True  True  True False
  True  True  True  True  True  True  True  True  True  True  True  True
  True  True  True  True  True  True]
准确率是:
 0.9333333333333333
在交叉验证种,得到的最好结果是:
 0.9666666666666668
在交叉验证种,得到的最好的模型是:
 KNeighborsClassifier(n_neighbors=1)
在交叉验证种,得到的的模型结果是:
 {'mean_fit_time': array([0.00112395, 0.00061102, 0.00058861, 0.00101709]), 'std_fit_time': array([8.42139639e-04, 4.99277752e-04, 4.80842302e-04, 3.56363605e-05]), 'mean_score_time': array([0.00220127, 0.00212345, 0.00202436, 0.00181046]), 'std_score_time': array([3.95486549e-04, 2.39257652e-04, 6.86831582e-05, 4.34575417e-04]), 'param_n_neighbors': masked_array(data=[1, 3, 5, 7],
             mask=[False, False, False, False],
       fill_value='?',
            dtype=object), 'params': [{'n_neighbors': 1}, {'n_neighbors': 3}, {'n_neighbors': 5}, {'n_neighbors': 7}], 'split0_test_score': array([1., 1., 1., 1.]), 'split1_test_score': array([1.        , 0.95833333, 0.95833333, 1.        ]), 'split2_test_score': array([0.95833333, 0.95833333, 0.95833333, 0.95833333]), 'split3_test_score': array([0.95833333, 0.95833333, 0.95833333, 0.91666667]), 'split4_test_score': array([0.91666667, 0.91666667, 0.91666667, 0.91666667]), 'mean_test_score': array([0.96666667, 0.95833333, 0.95833333, 0.95833333]), 'std_test_score': array([0.03118048, 0.02635231, 0.02635231, 0.0372678 ]), 'rank_test_score': array([1, 2, 2, 2])}
import sys; print('Python %s on %s' % (sys.version, sys.platform))

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值