《用Python开始机器学习(KNN分类算法).docx》由会员分享,可在线阅读,更多相关《用Python开始机器学习(KNN分类算法).docx(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、用Python开始机器学习(4:KNN分类算法)1、KNN分类算法KNN分类算法(K-Nearest-Neighbors Classification),又叫K近邻算法,是一个概念极其简单,而分类效果又很优秀的分类算法。他的核心思想就是,要确定测试样本属于哪一类,就寻找所有训练样本中与该测试样本“距离”最近的前K个样本,然后看这K个样本大部分属于哪一类,那么就认为这个测试样本也属于哪一类。简单的说就是让最相似的K个样本来投票决定。这里所说的距离,一般最常用的就是多维空间的欧式距离。这里的维度指特征维度,即样本有几个特征就属于几维。KNN示意图如下所示。上图中要确定测试样本绿色属于蓝色还是红色。
2、显然,当K=3时,将以1:2的投票结果分类于红色;而K=5时,将以3:2的投票结果分类于蓝色。KNN算法简单有效,但没有优化的暴力法效率容易达到瓶颈。如样本个数为N,特征维度为D的时候,该算法时间复杂度呈O(DN)增长。所以通常KNN的实现会把训练数据构建成K-D Tree(K-dimensional tree),构建过程很快,甚至不用计算D维欧氏距离,而搜索速度高达O(D*log(N)。不过当D维度过高,会产生所谓的”维度灾难“,最终效率会降低到与暴力法一样。因此通常D20以后,最好使用更高效率的Ball-Tree,其时间复杂度为O(D*log(N)。人们经过长期的实践发现KNN算法虽然简单
3、,但能处理大规模的数据分类,尤其适用于样本分类边界不规则的情况。最重要的是该算法是很多高级机器学习算法的基础。当然,KNN算法也存在一切问题。比如如果训练数据大部分都属于某一类,投票算法就有很大问题了。这时候就需要考虑设计每个投票者票的权重了。2、测试数据测试数据的格式仍然和前面使用的身高体重数据一致。不过数据增加了一些:plainview plaincopy1. 1.540thin2. 1.550fat3. 1.560fat4. 1.640thin5. 1.650thin6. 1.660fat7. 1.670fat8. 1.750thin9. 1.760thin10. 1.770fat11.
4、 1.780fat12. 1.860thin13. 1.870thin14. 1.880fat15. 1.890fat16. 1.980thin17. 1.990fat3、Python代码scikit-learn提供了优秀的KNN算法支持。使用Python代码如下:pythonview plaincopy1. #-*-coding:utf-8-*-2. importnumpyasnp3. fromsklearnimportneighbors4. fromsklearn.metricsimportprecision_recall_curve5. fromsklearn.metricsimport
5、classification_report6. fromsklearn.cross_validationimporttrain_test_split7. importmatplotlib.pyplotasplt8. 9. 数据读入10. data=11. labels=12. withopen(data1.txt)asifile:13. forlineinifile:14. tokens=line.strip().split()15. data.append(float(tk)fortkintokens:-1)16. labels.append(tokens-1)17. x=np.array(
6、data)18. labels=np.array(labels)19. y=np.zeros(labels.shape)20. 21. 标签转换为0/122. ylabels=fat=123. 24. 拆分训练数据与测试数据25. x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2)26. 27. 创建网格以方便绘制28. h=.0129. x_min,x_max=x:,0.min()-0.1,x:,0.max()+0.130. y_min,y_max=x:,1.min()-1,x:,1.max()+131. xx,
7、yy=np.meshgrid(np.arange(x_min,x_max,h),32. np.arange(y_min,y_max,h)33. 34. 训练KNN分类器35. clf=neighbors.KNeighborsClassifier(algorithm=kd_tree)36. clf.fit(x_train,y_train)37. 38. 测试结果的打印39. answer=clf.predict(x)40. print(x)41. print(answer)42. print(y)43. print(np.mean(answer=y)44. 45. 准确率与召回率46. prec
8、ision,recall,thresholds=precision_recall_curve(y_train,clf.predict(x_train)47. answer=clf.predict_proba(x):,148. print(classification_report(y,answer,target_names=thin,fat)49. 50. 将整个测试空间的分类结果用不同颜色区分开51. answer=clf.predict_proba(np.c_xx.ravel(),yy.ravel():,152. z=answer.reshape(xx.shape)53. plt.cont
9、ourf(xx,yy,z,cmap=plt.cm.Paired,alpha=0.8)54. 55. 绘制训练样本56. plt.scatter(x_train:,0,x_train:,1,c=y_train,cmap=plt.cm.Paired)57. plt.xlabel(u身高)58. plt.ylabel(u体重)59. plt.show()4、结果分析其输出结果如下: 0. 0. 1. 0. 0. 1. 1. 0. 0. 1. 1. 0. 0. 1. 1. 0. 1. 0. 1. 1. 0. 0. 1. 1. 0. 0. 1. 1. 0. 0. 1. 1. 0. 1.准确率=0.94,
10、 score=0.94 precision recall f1-score support thin 0.89 1.00 0.94 8 fat 1.00 0.89 0.94 9avg / total 0.95 0.94 0.94 17KNN分类器在众多分类算法中属于最简单的之一,需要注意的地方不多。有这几点要说明:1、KNeighborsClassifier可以设置3种算法:brute,kd_tree,ball_tree。如果不知道用哪个好,设置auto让KNeighborsClassifier自己根据输入去决定。2、注意统计准确率时,分类器的score返回的是计算正确的比例,而不是R2。R2一般应用于回归问题。3、本例先根据样本中身高体重的最大最小值,生成了一个密集网格(步长h=0.01),然后将网格中的每一个点都当成测试样本去测试,最后使用contourf函数,使用不同的颜色标注出了胖、廋两类。容易看到,本例的分类边界,属于相对复杂,但却又与距离呈现明显规则的锯齿形。这种边界线性函数是难以处理的。而KNN算法处理此类边界问题具有天生的优势。我们在后续的系列中会看到,这个数据集达到准确率=0.94算是很优秀的结果了。