我们可以通过sklearn库的自带数据集直接引入鸢尾花的数据集,在这个数据集中,我们可以通过花萼长度,花萼宽度,花瓣长度和花瓣宽度四个属性来预测未标记的鸢尾花属于哪个类别。
# 1 导入鸢尾花数据集 from sklearn.datasets import load_iris # 2 声明一个鸢尾花的类对象 iris = load_iris() # 3 获取鸢尾花的数据 iris_data = iris.data # 4 获取数据对应的种类 iris_target = iris.target print(iris_data) print(iris_target)查看数据后你会看到iris_data变量里每一个元素一共有4个值,这四个值就是分别对应花萼长度、花萼宽度、花瓣长度、花瓣宽度4个属性,iris_target变量对应的就是每一个花所属的类别。一共对应的是3个类别,0的意思是山鸢尾,1是虹膜锦葵,2是变色鸢尾。
3 训练模型 from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split # 分割训练集和测试集 from sklearn.neighbors import KNeighborsClassifier iris = load_iris() iris_data = iris.data iris_target = iris.target # 把数据分为训练集和测试集,x表示特征值,y表示目标值,test_size=0.25表示将25%的数据用作测试集 x_train, x_test, y_train, y_test = train_test_split(iris_data, iris_target, test_size=0.25) # 创建KNN算法实例,n_neighbors参数默认为5,后续可以通过网格搜索获取最优参数 knn = KNeighborsClassifier(n_neighbors=5) # 训练测试集数据 knn.fit(x_train, y_train) # 获取预测结果 y_predict = knn.predict(x_test) # 展示预测结果 labels = ['山鸢尾', '虹膜锦葵', '变色鸢尾'] for i in range(len(y_predict)): print('第%d次测试:预测值:%s 真实值:%s' %((i + 1), labels[y_predict[i]], labels[y_test[i]])) print('准确率:', knn.score(x_test, y_test)) 4 获取k值最优参数k值选取的思路是我们先来选择一个k值的范围,把这个范围中所有的误差值都获取到,然后我们再来选择误差最小的值作为k值。
from sklearn.datasets import load_iris from sklearn.model_selection import cross_val_score from sklearn.neighbors import KNeighborsClassifier import matplotlib.pyplot as plt # 中文显示 plt.rcParams["font.family"] = 'Arial Unicode MS' # 导入数据集 iris = load_iris() x = iris.data y = iris.target # 限制k的取值范围 k_range = range(1, 31) # 记录每当k值变换一次,它的错误值是多少 k_error = [] for k in k_range: knn = KNeighborsClassifier(n_neighbors=k) # cv参数决定数据集划分比例,这里按照5:1划分训练集和测试集 scores = cross_val_score(knn, x, y, cv=6) print(scores) k_error.append(1 / scores.mean()) # 把结果画成图,直观看出k取什么值误差最小,x轴为k值,y轴为误差值 plt.plot(k_range, k_error) plt.xlabel('k值') plt.ylabel('误差值') plt.show()图形显示结果如下图所示:
根据这个图形我们就可以看得出来,k值大概是在12这个位置时,误差是最小的。这时当我们把12重新放入到之前的代码中,可能你会发现他的准确率并没有提升甚至还有可能下降了,其实是因为数据量比较小的缘故,并不影响我们解决问题的方式。 四 KNeighborsClassifier参数详解
通过前面的练习,相信你已经基本掌握了KNeighborsClassifier的使用方法了,最后,在这里我们会对这个方法的参数进行更细致的说明和讲解。
# 查看KNeighborsClassifier源代码 NeighborsClassifier( n_neighbors=5, weights="uniform”, algorithm=”auto“, leaf_size=30, p=2, metric="minkowski", metric_params=None, n_jobs=None, **kwargs, )weights用于指定临近样本的投票权重,默认是uniform,表示所有邻近样本投票权重都是一样的。如果我们把weights的值设置成distance,表示投票权重与距离成反比,也就是说邻近样本与未知类别样本距离越远,则其权重越小,反之,权重越大。
algorithm用于指定邻近样本的搜寻方法,如果值为ball_tree,表示用球树搜寻法寻找近邻样本,kd_tree就是KD树搜寻法,brute是使用暴力搜寻法。algorithm默认参数是auto,表示KNN算法会根据数据特征自动选择***搜寻方法。关于这些搜寻法的细节,我会在未来发布的机器学习的文章中做详细的说明,现在只需要知道我们当前用的是默认的自动帮我们选择的搜寻方法。
leaf_size用于指定球树或者KD树叶子节点所包含的最小样本量,它用于控制树的生长条件,会影响查询速度,默认值是30,目前我们先不关注这个点。
metric参数是用来指定距离的度量指标,默认为闵可夫斯基距离。