Press "Enter" to skip to content

使用 Scikit-learn 的进行 KNN 分类

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

最近邻()是一种非常简单、易于理解、通用性强的机器学习算法,广泛应用于金融、医疗、政治、手写检测、图像识别、视频识别等领域。在信用评级中,金融机构会预测客户的信用评级。在贷款支付中,银行机构将预测贷款是否安全或有风险。在政治学中,将潜在选民分为两类,要幺投票,要幺不投票。上一篇《 K-近邻算法KNN学习笔记 》主要讲解的是KNN的理论内容,今天主要学习怎幺用KNN进行实战。

 

使用Scikit-Learn进行分类预测

 

由于Scikit-Learn包中已经封装好了相应的方法,所以使用起来非常的简单。具体代码如下:

 

定义数据:
# 定义特征变量
weather = ['Sunny','Sunny','Overcast','Rainy','Rainy','Rainy','Overcast','Sunny','Sunny',
'Rainy','Sunny','Overcast','Overcast','Rainy']
temperature = ['Hot','Hot','Hot','Mild','Cool','Cool','Cool','Mild','Cool','Mild','Mild','Mild','Hot','Mild']
 
# 定义分类标签
play=['No','No','Yes','Yes','Yes','No','Yes','No','Yes','Yes','Yes','Yes','Yes','No']
 
 
# 将特征变量和分类标签数值化
from sklearn import preprocessing
 
le = preprocessing.LabelEncoder()
weather_encoded=le.fit_transform(weather)
temperature_encoded=le.fit_transform(temperature)
 
# 整合特征变量
features=list(zip(weather_encoded,temperature_encoded))
 
label=le.fit_transform(play)
 
生成模型并预测
from sklearn.neighbors import KNeighborsClassifier
 
model = KNeighborsClassifier(n_neighbors=3)
model.fit(features,label)
predicted= model.predict([[0,2]]) # 0:Overcast, 2:Mild
print(predicted)

 

使用Grid Search确定K值

 

使用KNN遇到的最大问题和使用K-Means类似,就是怎幺确定K值,常见的方法主要是Grid Search。简单的说就是遍历K值,然后再计算评分,去评分最好的值作为最终选择。

 

这里我们使用Scikit-Learn自带的葡萄酒数据集,该数据是对意大利同一地区种植的三种不同品种葡萄酒进行化学分析的结果。这项分析确定了三种葡萄酒中每种葡萄酒中13种成分的含量。该数据库包括13个特征和一个目标(品种类型)。品种类型包括:’0类’、’1类’和’2类’。

 

from sklearn import datasets
wine = datasets.load_wine()
 
print(wine.feature_names) #获取特性向量名称
print(wine.target_names) #获取分类标签名称
 
print(wine.data[0:5]) #查看特征向量数据
print(wine.target) #查看分类标签数据
print(wine.data.shape)
print(wine.target.shape)
 
 
from sklearn.model_selection import train_test_split
 
# 将数据划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(wine.data, wine.target, test_size=0.3) # 70% training and 30% test
 
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
 
neighbors = np.arange(1,10)
train_accuracy =np.empty(len(neighbors))
test_accuracy = np.empty(len(neighbors))
 
for i,k in enumerate(neighbors):
    knn = KNeighborsClassifier(n_neighbors=k)
    knn.fit(X_train, y_train)
    train_accuracy[i] = knn.score(X_train, y_train) #使用训练集测试准确率
    test_accuracy[i] = knn.score(X_test, y_test) #使用测试集测试准确率
 
import matplotlib.pyplot as plt
%matplotlib inline
 
 
plt.title('k-NN Varying number of neighbors')
plt.plot(neighbors, test_accuracy, label='Testing Accuracy')
plt.plot(neighbors, train_accuracy, label='Training accuracy')
plt.legend()
plt.xlabel('Number of neighbors')
plt.ylabel('Accuracy')
plt.show()

 

 

所以在本例中,K选择1是最合适的。(多次执行此代码,发现最后生成的图片不一致,原因是随机划分数据导致的)

 

参考链接: https://www.datacamp.com/community/tutorials/k-nearest-neighbor-classification-scikit-learn

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注