数据集说明:
一共58个数据样本
因为水果的名字是字符串,对其进行编码。
labelencoder = LabelEncoder()
data.iloc[:,0] = labelencoder.fit_transform(data.iloc[:,0])
对水果进行分类,最后预测正确值。一共有四类。
对于KNN算法,K的取值是需要自己设置的,sklearn中默认是5,水果分类实验中从1到30进行了选择,选取最好的那个k值再用于预测。
最终输出的是模型的得分。
整体代码:
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
import pandas as pd
from sklearn.preprocessing import LabelEncoder
import matplotlib.pyplot as plt
data = pd.read_csv('fruit_data.csv')
# print(data)
labelencoder = LabelEncoder()
data.iloc[:,0] = labelencoder.fit_transform(data.iloc[:,0])
# print(data)
# print(labelencoder.classes_)
from sklearn.model_selection import train_test_split
# 切分数据集,stratify=y表示切分后训练集和测试集中的数据类型的比例跟切分前y中的比例一致
# 比如切分前y中0和1的比例为1:2,切分后y_train和y_test中0和1的比例也都是1:2
# 设置random_state,使用同样的随机方式来切分数据
x_train,x_test,y_train,y_test = train_test_split(data.iloc[:,1:], data.iloc[:,0], test_size=0.3, stratify=data.iloc[:,0], random_state=20)
# 保存不同k值测试集准确率
test_scores = []
# 保存不同k值训练集准确率
train_scores = []
# 设置30个k值
k = 30
for i in range(1,k):
knn = KNeighborsClassifier(i)
knn.fit(x_train,y_train)
# 保存测试集准确率
test_scores.append(knn.score(x_test,y_test))
# 保存训练集准确率
train_scores.append(knn.score(x_train,y_train))
plt.title('k-NN Varying number of neighbors')
plt.plot(range(1,k),test_scores,label="Test")
plt.plot(range(1,k),train_scores,label="Train")
plt.legend()
plt.xticks(range(1,k))
plt.xlabel('k')
plt.ylabel('accuracy')
plt.show()
# 选择一个最好的k值作为模型参数
k = np.argmax(test_scores)+1
knn = KNeighborsClassifier(k)
knn.fit(x_train,y_train)
print(k)
print(knn.score(x_test,y_test))