交叉验证与网格搜索(以KNN分类鸢尾花为例)

1、获取数据

import pandas as pd
pd.set_option('display.max_rows', 6)
#1获取数据
from sklearn.datasets import load_iris
iris=load_iris()
#新建一个dataframe,把iris中data方进来,并且dataframe的列的名字是iris的特征名字
iris_df=pd.DataFrame(data=iris.data,columns=iris.feature_names)
iris_df['class']=iris.target#然后再把鸢尾花的分类target放进来
iris_df#这样就有了一个表格,含有特征的标签的一个表格

在这里插入图片描述

2、划分数据集

#2划分数据集
from sklearn.model_selection import train_test_split
#iris_df的前4行iris_df.iloc[:,:4]是特征x,最后一列iris_df["class"]是标签y,70%是训练集,30%是测试集
x_train,x_test,y_train,y_test=train_test_split(iris_df.iloc[:,:4],iris_df["class"],random_state=5,test_size=0.3)

3、特征工程:标准化数据

#3特征工程
from sklearn.preprocessing import StandardScaler
std=StandardScaler()
#训练集数据fit_transform
x_train=std.fit_transform(x_train)
#测试集数据只用transform就行了
x_test=std.transform(x_test)

4、交叉验证与网格搜索

#4导入KNN算法模型,并采用网格划分和交叉验证
from sklearn.neighbors import KNeighborsClassifier
model_knn=KNeighborsClassifier()#这个时候n_neighbors等于几就不指定了 因为下面准备交叉验证

#导入网格搜索和交叉验证的包
from sklearn.model_selection import GridSearchCV
#准备一下网格验证的参数  这里就是KNN模型里的K的个数 n_neighbors
p_dict={"n_neighbors":[3,5,7,9,11]}#用字典类型,字典里面的value用list
#把上面准备好的模型model_knn和p_dict放进来
#并做5折交叉验证,即训练的数据再分成5份(其中1份轮流做测试集其余4份做训练集)训练之后结果求平均
gsCV=GridSearchCV(model_knn,param_grid=p_dict,cv=5)

#训练数据
gsCV.fit(x_train,y_train)

在这里插入图片描述

5、模型评估

#5模型评估
#直接打一个分数出来
gsCV.score(x_test,y_test)

0.9555555555555556

#查看一下网格验证训练之后效果和参数
print('最佳参数组合:{}'.format(gsCV.best_params_))
print('最佳参数组合的模型model:{}'.format(gsCV.best_estimator_))

最佳参数组合:{‘n_neighbors’: 7}
最佳参数组合的模型model:KNeighborsClassifier(algorithm=‘auto’, leaf_size=30, metric=‘minkowski’,
metric_params=None, n_jobs=None, n_neighbors=7, p=2,
weights=‘uniform’)

print('交叉验证中二次划分的分数:{}'.format(gsCV.best_score_))
print('交叉验证的结果:{}'.format(gsCV.cv_results_))  

交叉验证中二次划分的分数:0.9714285714285715
交叉验证的结果:{‘mean_fit_time’: array([0.00062275, 0.00059252, 0.00062752, 0.00059338, 0.000597 ]), ‘std_fit_time’: array([4.40131288e-05, 1.05879326e-05, 4.74605105e-05, 1.25630077e-05,
1.85654452e-05]), ‘mean_score_time’: array([0.00141506, 0.00132527, 0.00136194, 0.00134277, 0.00136309]), ‘std_score_time’: array([1.70124272e-04, 2.57591829e-05, 1.94012377e-05, 9.86488384e-06,
4.70740926e-05]), ‘param_n_neighbors’: masked_array(data=[3, 5, 7, 9, 11],
mask=[False, False, False, False, False],
fill_value=’?’,
dtype=object), ‘params’: [{‘n_neighbors’: 3}, {‘n_neighbors’: 5}, {‘n_neighbors’: 7}, {‘n_neighbors’: 9}, {‘n_neighbors’: 11}], ‘split0_test_score’: array([1., 1., 1., 1., 1.]), ‘split1_test_score’: array([0.9047619 , 0.9047619 , 0.95238095, 0.9047619 , 0.9047619 ]), ‘split2_test_score’: array([1., 1., 1., 1., 1.]), ‘split3_test_score’: array([0.85714286, 0.95238095, 0.95238095, 0.95238095, 0.95238095]), ‘split4_test_score’: array([0.95238095, 0.95238095, 0.95238095, 0.95238095, 0.95238095]), ‘mean_test_score’: array([0.94285714, 0.96190476, 0.97142857, 0.96190476, 0.96190476]), ‘std_test_score’: array([0.05553288, 0.03563483, 0.02332847, 0.03563483, 0.03563483]), ‘rank_test_score’: array([5, 2, 1, 2, 2], dtype=int32)}

总结

(如果您发现我写的有错误,欢迎在评论区批评指正)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值