k邻近算法-分类

算法简介

k邻近算法是最简单的算法之一,该算法的思路是:在特征空间中,如果一个样本附近的k个最近(即特征空间中最邻近)样本的大多数属于某一个类别,则该样本也属于这个类别。该算法主要用于解决分类问题,无论是二分类或者是多分类都可以应用。
本文主要记录实际操作,想了解具体的算法原理可以自己查找,或者可以参考这篇博客:KNN原理小结

数据来源

玻璃分类(Kaggle):https://www.kaggle.com/uciml/glass

在这里插入图片描述
该数据按照玻璃的组成成分(RI,Na,Mg,Al,SI,K,Ca,Ba,Fe)的不同划分了7种玻璃,每种玻璃(Type)以数字1~7来命名。
依照这些数据建立一个knn多分类模型。

数据挖掘

1.导入第三方库

1
2
3
4
5
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split#划分训练集和测试集
from sklearn.neighbors import KNeighborsClassifier#导入knn算法
from sklearn.metrics import accuracy_score#导入分类评分标准

依次导入建模需要的各个模块,除了前四个库是数据挖掘必要的第三方库之外,重点说一下accuracy_score:

sklearn.metrics.accuracy_score(y_true, y_pred, normalize=True, sample_weight=None)
normalize:默认值为True,返回正确分类的比例;如果为False,返回正确分类的样本数

分类准确率分数是指所有分类正确的百分比。分类准确率这一衡量分类器的标准比较容易理解,但是它不能告诉你响应值的潜在分布,并且它也不能告诉你分类器犯错的类型。不过我只是简单地建立一个多分类模型,够用了。

2.读取文件

1
2
3
4
5
6
import winreg
real_address = winreg.OpenKey(winreg.HKEY_CURRENT_USER,r'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders',)
file_address=winreg.QueryValueEx(real_address, "Desktop")[0]
file_address+='\\'
file_origin=file_address+"\\源数据-分析\\glass.csv"#设立源数据文件的桌面绝对路径
glass=pd.read_csv(file_origin)#读取csv文件

因为之前每次下载数据之后都要将文件转移到python根目录里面,或者到下载文件夹里面去读取,很麻烦。所以我通过winreg库,来设立绝对桌面路径,这样只要把数据下载到桌面上,或者粘到桌面上的特定文件夹里面去读取就好了,不会跟其它数据搞混。

3.建模

在这里插入图片描述

1
2
3
y=list(glass.columns)[:-1]
X_train,X_test,y_train,y_test=train_test_split(glass[y],glass["Type"],random_state=1)
#考虑到接下来可能需要进行其他的操作,所以定了一个随机种子,保证接下来的train和test是同一组数

划分列索引为特征值和目标分类值,并将数据划分成训练集和测试集。

1
2
knn=KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train,y_train)

引入knn算法,并将算法中的邻居值设为1,并进行建模,得到结果。
在这里插入图片描述

4.评分

1
2
prediction=knn.predict(X_test)#对测试值进行预测
accuracy_score(y_test,prediction)#对结果进行评分

利用knn.predict来对测试值进行预测,并与之前划分的测试标签进行比较评分,来看看模型准确度。
在这里插入图片描述
结果为0.72,也就是说测试结果与预测结果有72%是符合的,或者说该模型准度评分为72分。

5.简单的调参
之前设立的邻居参数为1,接下来依次测试不同的参数,看看最优的邻居参数是多少。

1
2
3
4
5
6
7
result={}#通过字典来记录每次的参数及对应的评分结果
for i in range(20):#参数依次从1取到20
knn=KNeighborsClassifier(n_neighbors=(i+1))
knn.fit(X_train,y_train)
prediction=knn.predict(X_test)
score=accuracy_score(y_test,prediction)
result[i+1]=score*100
1
2
3
4
for i in result.keys():
if result[i]==max(result.values()):
print("最佳邻近数:"+str(i))
print("模型评分"+str(max(result.values())))

结果如下:
在这里插入图片描述
可以看出在参数依次选择1~20的过程中,最佳邻近参数为1,4,5;模型的最佳精度评分是72分。

6.总结
其实整个过程下来,与其说是在建模,倒不如说是体会了一遍建模的流程。而且k邻近算法不是很复杂的算法,暂时也没有涉及到数据标准化或者归一化的一些操作,不过还是有一些问题可以讨论:

1.这个算法可不可以用于文本类数据的分类,如果可以的话,如何使用?(我之前尝试了一些文本类的数据,但是都会报错,不管是将数据类型转换成float,还是将文本元素转换为ASC码,都不能成功建模)

2.knn算法邻近参数越小精度越高吗?对于其它数据的泛化能力呢?
3.有没有更全面的调参方法来提高模型精度?
4.knn算法可以用于回归类问题吗?

有很多地方做的不是很好,欢迎网友来提出建议,也希望可以遇到些朋友来一起交流讨论。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!