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