knn算法的原理和步骤,说明KNN算法的原理,基本思想,和算法的实现步骤
**
学习机knn算法学习笔记使用sklearn库,莺尾花的例子。具体knn算法是什么样的,这里就不详细描述了。在这里,我们将注意使用knn算法进行分类分析,并做一个总结。
**
分析过程1。前期计划引入相关数据库,model_selection模块像我写的。如果你不这样做,你就不能使用它。
ImportnumpyasnpfromsklearnImportModel _ Selection #来自sklearn的模块。将训练集与测试集分开的neighborsportknighborslacializer
Data=pd.read _ csv (r c:(用户(联想)桌面)论文文档2(Iris。CSV) (data.head)))
如图所示,一个数据有四个特征值。重命名每个数据类别,以便发件人以后可以分析它。
# #将类别名称替换为相应的数字1:setosa,2:versicolor和3: virginica。这种分类预测不需要这一步,但是可以用于回归。数据[编码]=数据[种类]。map(lambdax:1 ifx= setosa else(2 ifx= versi color else 3)))DAP
总共有150个数据集,没有空值。
#设置变量X和YX=NP。Array (data.iloc [:4]) Y=NP。Array (data.encode),并将X和Y设置为训练集,将测试集设置为test_x),Test _ Y=model _ selection . training _ Test _ split(X,Y,Test_size=0.3) #表示train _ X . Test _ X标准化后,Froms Klearn的平均值和标准差。预处理ImportStandardScaler=StandardScaler()与按列计算x_test相同,因为数据特征值差异太大。一般来说,测试集通过训练集的均值和标准差来标准化。-scaler.mean_每列的平均值-scaler.scale_每列的方差2。尝试建模。首先建立模型,通过交叉验证法寻找最佳模型参数。
2.1将训练集引入knn模块training k=3 clf 1=kneighborsclassifier(k)cl f1 . fit)x _ train,train_y)。#.score) train_y)训练集正确率CLF1.score(x_test,test_y),用于对正确率CLF1进行建模。输出训练水平或测试集。由于测试集不知道实际数据中y的值,重采样方法将测试误差从sklearninportmodel _ selectionasscores=cv。cross _ val _ score (clf1,clf1,)cv=5) #这里50%交叉验证法score=scores.mean(#scores为总正确率,平均得分为2.2寻找最佳拟合建立多个模型,最佳拟合使用交叉验证法。
#=通过交叉验证发送选择最适合模型的K值(即如果cv准确率最高,模型最好);ks=range(1,100) inSampleScores=[] #每个k的训练集得分=[] # value=cv准确率记录每个k的交叉检查得分d=enter for kings以k为关键字:clf=kneighborsclassifier(k)。fit) x_train,train _ y (insamplescores。追加(1-clf。score) train _ y))训练集得分=1-cv。cross _ val _ scores cv=5) #交叉检查分数交叉验证分数。追加(分数)
end([train_error rate , cv_error rate])plt.show()
从图中可以看出,随着k值的增加,train_error率呈下降趋势,而cv_accuracy率呈上升趋势。我们选择cv_error率最小的值作为模型的最佳拟合值。
# Choose best _ k=sorted(d . items(),key=lambda x: x [1],reverse=false)[0][0]print( best k value:{ } )。格式(best_k))
k的最佳值为7,当k为7时,cv误差率最低,为3.81%。
2.3建模#建模,k值为7 clf 2=kneighborsclassifier(7)。fit (x _ train,train _ y) #预测y _ test _ pred=clf 2 . predict(x _ test)#测试集错误率1-clf2.score(x_test,test_y
我也很惊讶这里的测试集错误率是0。
2.4通过可视化混淆矩阵来评估模型分类。
#建立混淆矩阵从sklearn.metrics导入混淆_矩阵导入seaborn as SNS CNF _矩阵=混淆_矩阵(test _ y,Y_test_pred) #混淆矩阵#视觉混淆矩阵class_names=[1,2,3] #图例数据帧=pd .数据帧(CNF _矩阵,index=class _ names columns=class _ names)# createheatmap绘制热图ax=plt.gca() #获取当前坐标轴信息ax . xaxis . set _ tickets _ position( top )#将x坐标轴移动到上面PLT . title( fusion matrix )PLT . tight _ layout()# SNS . heat map(data frame,annot=true,cbar=none,cmap= blues )PLT . ylabel( true class ),PLT . xlabel( predicted class )# ax . invert _ ya
混淆矩阵建立后,可以计算出一系列指标来评价模型的拟合优度。最常用的是准确率和召回率。当然还有一些其他的指标,可以是百度。这里我用的是准确率和召回率。
从sklearn.metrics导入分类_报告目标_名称=[class 0 , class 1 , class 2]print(分类_报告(test_y,y_test_pred,target_names=目标_名称))
列表最左边一列是分类的标签,行是准确率、召回率、f1值。准确率P是针对预测数据的,表示预测样本中有多少是真实的,比如第一行第一轮中的1,表示在模型中有17个总数被归类为1,其中17个是真实数据。召回率R是针对真实数据(测试数据)的,它表示有多少测试样本被正确预测。例如,第一行第二列中的1表示测试样本中有17个值为1,其中模型预测的17个f 1值是精度和召回率的调和平均值:2/F1=1/P 1/R .当精度和召回率都高时,F1值也会高。F1值在1时达到最佳值(完美的精度和召回率),最差的0支持是测试集中类别总数的微观平均值、所有数据结果的宏观平均值、所有标签结果的加权平均值、所有标签结果的加权平均值以及所有标签结果的加权平均值的3-汇总。第一次用python写机器学习代码,也是第一次写博客。请原谅我写得乱七八糟。在我的分析过程中,测试集的错误率为0。具体原因我也不清楚。我还是要慢慢学。欢迎大家指出我的错误。
数据集链接