**

机器学习knn算法学习笔记使用sklearn库 ,莺尾花实例。

具体knn算法是怎样的我这里就不再详细论述。在这里我注意总结我使用knn算法进行一个分类的分析
**

分析过程

1.前期准备

引入相关的库,model_selection这个模块采用我这种写法,不然就用不了

import numpy as np
from sklearn import model_selection  #将训练集和测试集分开的模块
from sklearn.neighbors import KNeighborsClassifier  # K-近邻算法模块
import matplotlib.pyplot as plt
import pandas as pd

引入数据看看数据是怎样的

data = pd.read_csv(r'C:\Users\lenovo\Desktop\毕业论文文献2\iris.csv')
data.head()


如图所示,一个数据有四个特征值,为了发方面后续分析,我们将各数据的类别重新命名。

###将种类名称替换成对应的数字, 1:setosa, 2:versicolor, 3: virginica. 这一步在这个分类预测中没有必要, 但可以用在回归中。
data['encode'] = data['Species'].map(lambda x :1 if x =='setosa' else (2 if x =='versicolor' else 3))
data.info()


一共有150个数据集,没存在空值的情况。

#设置变量x 与变量y
x = np.array(data.iloc[:,:4])
y = np.array(data.encode)#将x,y分别划分为训练集与测试集
train_x,test_x,train_y,test_y = model_selection.train_test_split(x,y,test_size=0.3)#将train_x,test_x 做标准化处理, 因为数据特征值之间差距过大,容易让某一特征值不起作用
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler().fit(train_x)
x_train = scaler.transform(train_x)
x_test = scaler.transform(test_x)scaler 是根据train_x 来计算的。x_train是通过train_x的均值与标准差,用x-mena/std来标准化每一个值,均值,标准差是按列来计算
x_test是同理。一般情况下,测试集要用训练集的均值与标准差来标准化
- scaler.mean_ 各列的均值
- scaler.scale_ 各列的方差

2.尝试建模

我们首先尝试建立一种模型,再使用交叉验证法,寻找最好的模型参数

2.1建立一个模型

#将训练集引入knn模块训练
k = 3
clf1 = KNeighborsClassifier(k)
clf1.fit(x_train, train_y)
#.score() 输出训练级或者测试集的正确率
clf1.score(x_train, train_y) #训练集正确率
clf1.score(x_test, test_y) #测试集正确率#使用交叉验证发估计测试误差,因为在真实数据中,测试集是不知道y值,只能使用重抽样方法估计测试误差
from sklearn import model_selection as cv
scores = cv.cross_val_score(clf1, x_train, train_y, cv = 5) #这里用5折交叉验证法
score = scores.mean()  #scores是总的正确率,还要平均才行
score

2.2寻找最优拟合

建立多个模型,使用交叉验证法寻找最优拟合的k,通过选择cv错误率最低的k。

#=利用交叉验证发为模型选择最合适的k值(即cv正确率最高时,模型最好)
ks = range(1,100)
inSampleScores = [] #记录每个k的训练集得分
crossValidationScores = [] #记录每个k交叉验证得分
d = {} #key = k ,value = cv accuracy rate  记录每个k交叉验证得分,以k为键for k in ks:clf = KNeighborsClassifier(k).fit(x_train, train_y)inSampleScores.append(1-clf.score(x_train, train_y))  #训练集得分scores = 1-cv.cross_val_score(clf, x_train, train_y, cv = 5) #交叉验证得分crossValidationScores.append(scores.mean())d[k] = scores.mean()#画出训练集得分,交叉验证得分,随k值的变化
p1 = plt.plot(ks, inSampleScores)
p2 = plt.plot(ks, crossValidationScores)
plt.legend(["train_error rate", "cv_error rate"])
plt.show()


由图可以看出随着k值的增加,train_error rate呈下降趋势,cv_accuracy rate呈上升趋势,我们选择cv_error rate最小的值对于k值作为模型的最优拟合

# 选择最好的k
best_k = sorted(d.items(), key = lambda x:x[1], reverse = False)[0][0]
print("最优的k值:{}".format(best_k))


最好的k值为7,当k值为7时,cv错误率为最低为3.81%

2.3建模

#建模,k值为7
clf2 = KNeighborsClassifier(7).fit(x_train, train_y)
#预测
y_test_pred = clf2.predict(x_test)#测试集错误率
1-clf2.score(x_test, test_y)


这里测试集错误率为0,我也感觉很惊讶
2.4通过混淆矩阵可视化,来对模型分类进行评价

#建立混淆矩阵,来看模型的分类结果,以及分类错误程度
from sklearn.metrics import confusion_matrix
import seaborn as sns
cnf_matrix = confusion_matrix(test_y, y_test_pred) #混淆矩阵#可视化混淆矩阵
class_names = [1,2,3] #图例
dataframe = pd.DataFrame(cnf_matrix, index=class_names, columns=class_names)
# create heatmap 绘制热力图ax = plt.gca()                        #获取到当前坐标轴信息
ax.xaxis.set_ticks_position('top')   #将X坐标轴移到上面
plt.title("Confusion Matrix")
plt.tight_layout()  #调整子图参数的sns.heatmap(dataframe, annot=True, cbar=None, cmap="Blues")
plt.ylabel("True Class"),
plt.xlabel("Predicted Class")
#ax.invert_yaxis()   #反转y轴
plt.show()


建立混淆矩阵后,可以计算一系列指标来评价模型的拟合优度,最常用的有精确率,召回率,当然含有一些其他的指标,具体可以百度,这里我就用了精确率和召回率。

from sklearn.metrics import classification_report
target_names = ['class 0', 'class 1', 'class 2']
print(classification_report(test_y, y_test_pred,target_names=target_names))

  • 列表最左边一列为分类的标签,行依次为精确率,召回率,f1值
  • 精确率P是针对预测数据而言的,表示预测的样本中有多少是真正的样本,如第一行第一轮的1,表示模型中分类为1的总数有17个,其中就17个是真实的数据
  • 召回率R是针对真实数据(测试数据)而言的,它表示的是测试样本中的有多少被预测正确了,如第一行第二列的1,表示测试样本中1的值有17个,其中模型预测出17个
  • F1值是精确度和召回率的调和平均值:2/F1 = 1/P +1/R,精确度和召回率都高时, F1值也会高. F1值在1时达到最佳值(完美的精确度和召回率),最差为0
  • suppor 为测试集中各类别的总数
  • 微平均值:micro average,所有数据结果的平均值
  • 宏平均值:macro average,所有标签结果的平均值
  • 加权平均值:weighted average,所有标签结果的加权平均值

3总结

第一次再python写出机器学习的代码,也是第一次写博客,写得有点乱大家请见谅呀,在我分析的过程中测试集的错误率竟然为0,具体什么原因我也不清楚,还需要慢慢学习,欢迎大家指出我的错误。
数据集链接

机器学习knn算法学习笔记使用sklearn库 ,莺尾花实例相关推荐

  1. 机器学习入门 —— 超级详细的KNN算法学习笔记、KNN算法的三要素、KNN算法的优缺点

    文章目录 KNN(K nearest neighbors) K值的选择和影响 k取值偏小 k取值偏大 样本点距离的计算方式 闵可夫斯基距离 曼哈顿距离 欧几里得距离 切比雪夫距离 余弦距离 决策函数的 ...

  2. 机器学习之KNN算法学习笔记

    1. 综述 1.1 Cover和Hart在1968年提出了最初的邻近算法 1.2 分类(classification)算法|回归算法,这里讨论的是分类算法 1.3 输入基于实例的学习(instance ...

  3. 《机器学习实战》学习笔记(七):利用AdaBoost 元算法提高分类性能

    欢迎关注WX公众号:[程序员管小亮] [机器学习]<机器学习实战>读书笔记及代码 总目录 https://blog.csdn.net/TeFuirnever/article/details ...

  4. 《基于张量网络的机器学习入门》学习笔记8(Shor算法)

    <基于张量网络的机器学习入门>学习笔记8 Shor算法 来源 Shor算法的大致流程 因数分解 周期求取与量子傅里叶变换(QFT) Shor算法 来源 1994 1994 1994年,应用 ...

  5. 『ML』利用K-Means聚类算法对未标注数据分组——《机器学习实战》学习笔记(Ch10)

    本节用Python实现K-Means算法,对未标注的数据进行聚类. 在做完聚类后,如何对于聚类结果进行评估?请看 用Python实现聚类效果的评估(轮廓系数.互信息) 导航 K-Means简介 代码实 ...

  6. 机器学习篇01:在线学习的支持向量机算法学习笔记

    在线学习的支持向量机算法学习笔记 oisvm算法实现说明 oisvm算法实现说明 % 本程序是用于实现基于在线学习的调制信号识别的程序 % % % 第一步:调制信号的生成 % 首先是7个信号:2ASK ...

  7. 《机器学习实战》学习笔记(八):预测数值型数据 - 回归

    欢迎关注WX公众号:[程序员管小亮] [机器学习]<机器学习实战>读书笔记及代码 总目录 https://blog.csdn.net/TeFuirnever/article/details ...

  8. 《机器学习实战》学习笔记(四):基于概率论的分类方法 - 朴素贝叶斯

    欢迎关注WX公众号:[程序员管小亮] [机器学习]<机器学习实战>读书笔记及代码 总目录 https://blog.csdn.net/TeFuirnever/article/details ...

  9. 《机器学习实战》学习笔记(八)

    文章目录 第八章 预测数值型数据:回归 引言 线性回归优缺点 回归的一般方法 : 8 . 1 用线性回归找到最佳拟合直线 最佳估计回归系数表示 给出数据的最佳拟合直线 判断拟合曲线的拟合效果 8.2 ...

最新文章

  1. 如何打印网页版的发票_梦幻西游网页版:陷入瓶颈期,如何快速提升战力?氪金能解决问题...
  2. WebDAV服务漏洞利用工具DAVTest
  3. rabbitmq3.5.1 原理和集群安装
  4. springboot与php通讯,Springboot第二篇:与前端fetch通信(关于传输数据上传文件等前后端的处理)...
  5. SAS线缆为什么这样多
  6. spark计算操作整理
  7. 通过web的方式动态查看tomcat的catalina.out的日志(web.py)
  8. 新出版书籍《Python预测之美:数据分析与算法实战》,送书活动!参与即可机会,获得一本实体书,中奖后可填写地址寄送。
  9. linux的vi详细命令
  10. 哥斯拉Godzilla shell管理工具
  11. PASCAL VOC数据集分析及下载、解压
  12. Ubuntu18搭建SVN可视化工具if.svnadmin
  13. 利用clamav为程序添加查毒功能
  14. 交互设计和UI设计有区别吗 UI学习路线是什么
  15. Android自定义View之CircleView
  16. 分析测试电视遥控总结
  17. 【新知实验室】TRTC腾讯实时音视频动手实验
  18. 直接内存 直接内存的释放和回收
  19. 您可能不知道WooCommerce可以做的10件事
  20. 从0开始一步一步安装walle

热门文章

  1. (FortiGate)飞塔防火墙IPS(***防御)解决方案
  2. 关于球型Shader的写法
  3. Echarts显示数据被遮挡了
  4. 怎么让笔记本变路由器,亲身试验可用,不用下第三方软件
  5. 带刺玫瑰特别美?OLED屏幕画面美但眼睛会累
  6. 递归题目练习---扭蛋机
  7. 编程之类的文案_少儿编程宣传推广文案
  8. kepp-alive的作用?keep-alive的属性?路由元信息?白名单黑名单?keep-alive的钩子函数
  9. SpringBoot 自动装配原理解析
  10. 安卓app开机自启动代码