Knn分类算法的简单调优-------利用交叉验证和网格搜索

利用交叉验证和网格搜索对机器学习中的Knn算法进行调参调优
1,Knn算法,这也是最简单的一种分类算法,中文名称是K近邻算法,通俗易懂,适合机器学习的入门,它本身是监督学习算法,既可以用于分类,也可以用于回归,它的算法原理是根据已知样本数据来判断未知样本的类别,简而言之就好比近朱者赤近墨者黑。先看一段代码:

1, 从sklearn自带的数据集中导入鸢尾花数据,并实例化一个对象,得到一个具有四个特征和一个目标值的数据

from sklearn.datasets import load_iris
iris = load_iris()

2,记下来划分训练集和测试集,x_train表示训练集的特征值,x_test表示测试集的特征值,y_train表示训练集的目标值,y_test表示测试集的目标值,顺序不要混淆

from sklearn.model_selection import train_test_split # 导入划分工具
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.25)

接下来有必要针对于特征值进行标准化特征工程,为防止某些个特征因为数据过大而导致其他特征发挥不到作用,所以将特征数据进行标准化处理,其实也可以用归一化处理,但考虑到归一化受异常点影响较大,所以采用标准化比较稳妥
标准化公式:X’ = (x-mean)/σ,公式作用于每一列,mean是平均值,σ是标准差

3,首先导入特征标准化的API

from sklearn.preprocessing import StandardScaler #导入
transfer = StandardScaler() #实例化一个对象
x_train = transfer.fit_transform(x_train) #对训练集的特征值进行标准化
x_test = transfer.transform(x_test) # 对测试集的特征值进行标准化,切记不要加fit,不然两者数据不一致

4,接下来导入Knn算法的预估器

from sklearn.neighbors import KNeighborsClassifier
estimator = KNeighborsClassifier(n_neighbors=3) # 实例化一个对象,选择的参数邻居点是3个,默认是5个
estimator.fit(x_train,y_train) #放入要训练的数据,其实里面并没有做什么计算
estimator.score(x_test,y_test) # 利用测试集来计算模型的准确率

其实到这一步,一个简单的Knn分类模型已经做好了,但是Knn算法中有一个超参数K值,预测的结果受K值影响较大,所以我们要不停地调试参数K值,来得出一个合适的K。
因为每次运行时的训练集和测试集的数据都不一样,所以依靠手动调试没办法比较K的值,这个时候我们需要用到交叉验证和网格搜索。

交叉验证:是将训练集按照比例划分为训练集和验证集,以此得出一个准确率。比如按照 6折划分为6份,其中5份为训练集,1份为验证集,计算出一个准确率,循环6次,使每次的验证集都不一样,这样的话得出6个准确率,求其平均,就得到了一个较为可信的准确率。
网格搜索:大致可以理解为设置若干组超参数,使每组超参数都用交叉验证来评估准确性,最后根据准确率来选出最优参数建立模型

我们接着第三步的来做,利用交叉验证和网格搜索选出最佳超参数K值。

利用交叉验证和网格搜索求出最优K值并计算结果

from sklearn.model_selection import GridSearchCV  # 导入网格搜索API
from sklearn.neighbors import KNeighborsClassifier  # 导入Knn分类器

estimator = KNeighborsClassifier() # 记住括号里面不能设置超参数的值,我们要在下面的字典中去设置

param = {"n_neighbors":[i for i in range(1,11)]} # n_neighbors为超参数的名称,里面的k值是从1到10的列表

gc = GridSearchCV(estimator,param_grid=param,cv=10)# 实例化对象
"""
estimator为预估器对象
param_grid是估计器参数,也就是我们要找的超参数范围
cv为表示几折交叉验证,也就是将训练集分为几等份
"""
gc.fit(x_train,y_train) # 此时gc继承了预估器estimator的API

# 预测准确率
print("在测试集上的准确率:",gc.score(x_test,y_test))
# 输出最优超参数k在交叉验证中的准确率
print("在交叉验证当中的最好结果:",gc.best_score_)
# 输出模型参数,包括选出的最优K值
print("选择最好的模型是:",gc.best_estimator_)

结果如下:

在测试集上的准确率: 0.9473684210526315
在交叉验证当中的最好结果: 0.9732142857142857
选择最好的模型是: KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           metric_params=None, n_jobs=1, n_neighbors=5, p=2,
           weights='uniform')

很明显,当K值等于5的时候,模型是最优的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值