机器学习——KNN近邻算法(鸢尾花数据集)

一、鸢尾花数据集(Iris)

  • Iris数据集是常用的分类实验数据集,由Fisher, 1936收集整理。Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。数据集包含150个数据集,分为3类,每类50个数据,每个数据包含4个属性。iris以鸢尾花的特征作为数据来源,常用在分类操作中。该数据集由3种不同类型的鸢尾花的50个样本数据构成。其中的一个种类与另外两个种类是线性可分离的,后两个种类是非线性可分离的。
  • 四个属性:
    Sepal.Length(花萼长度),单位是cm;
    Sepal.Width(花萼宽度),单位是cm;
    Petal.Length(花瓣长度),单位是cm;
    Petal.Width(花瓣宽度),单位是cm;
from sklearn.datasets import load_iris

if __name__=='__main__':
    #鸢尾花数据集
    datas = load_iris()
    print(datas)

结果:
{'data': array([[5.1, 3.5, 1.4, 0.2],
       [4.9, 3. , 1.4, 0.2],
       [4.7, 3.2, 1.3, 0.2],
       [4.6, 3.1, 1.5, 0.2],
       [5. , 3.6, 1.4, 0.2],
       [5.4, 3.9, 1.7, 0.4],
       ....................,
       [6.7, 3.3, 5.7, 2.5],
       [6.7, 3. , 5.2, 2.3],
       [6.3, 2.5, 5. , 1.9],
       [6.5, 3. , 5.2, 2. ],
       [6.2, 3.4, 5.4, 2.3],
       [5.9, 3. , 5.1, 1.8]]), 'target': array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       .....................   
  • 上图即为鸢尾花数据集,原数据data和目标数据target用于后续建立评估模型。

二、代码案例

1、指定k值建立评估模型

import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris

if __name__=='__main__':
    #方法一:单独模型评估,鸢尾花数据集
    datas = load_iris()
    # 将鸢尾花元数据data作为训练数据集,target目标数据作为训练目标数据集
    train,target = datas.data,datas.target
    #准备一个乱数的下标序列号
    index = np.arange(150)
    np.random.shuffle(index)
    # 根据给定的乱序的下标到对应的数组中提取对应的数据
    # 将data和target中的前100个数据集作为训练数据集,之后的数据作为测试训练集
    train,test = datas.data[index[:100]],datas.data[index[100:]]
    train_target,real_target = datas.target[index[:100]],datas.target[index[100:]]
    #采用KNN算法,训练模型,假设k值为5
    knn = KNeighborsClassifier(n_neighbors=5)
    knn.fit(train,train_target)
    #模型评估(预测)
    res = knn.predict(test)
    print(res)
    print('---------------')
    print(real_target)
    print(1-abs(res-real_target).sum()/len(res))

结果:
[1 0 0 0 1 0 0 2 2 2 2 1 2 0 2 2 2 1 1 2 0 2 1 0 0 2 1 2 0 1 0 2 2 1 1 0 1
 2 1 0 2 2 0 0 2 0 1 1 1 0]    #评测值
---------------
[1 0 0 0 2 0 0 2 2 2 2 1 2 0 2 2 2 2 1 2 0 2 1 0 0 2 1 2 0 1 0 2 2 1 1 0 1
 2 1 0 2 2 0 0 2 0 2 1 1 0]    #实际值
0.94   评估准确性
  • 结论
    上图结果可知,当我把k值设置为5的时候,评测出准确度为0.94,但不一定是最高值,如何推断出k值为多少时,准确性最高呢?就要用到交叉验证

2、交叉验证

  • 在上述的模型中,我们将80%的数据用来训练,20%的数据用来测试,这样会带来一个问题。当20%的数据中有部分数据时异常数据,特别的大或者特别的小,而这20%的数据是没有进行训练的,这样带入到用80%数据训练的模型中进行测试,就会导致较大的误差,准确度降低,所以这就是我们采用交叉验证的原因。
  • 交叉验证,就是第一轮取80%的数据进行训练,20%的数据进行测试,第二轮再取80%的数据进行训练,20%的数据进行测试,以此类推,这样就能保证每组数据至少训练一次,测试一次。再从中计算平均值,作为最终的评测结果。这样就能保证模型的准确性。
  • 训练和测试数据的比例可以自行定义,下面的案例中我选择的是每次模型建立评估取10份数据,9组训练,1组测试。
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
import matplotlib

方法二:交叉验证模型评估
    datas = load_iris()
    train, target = datas.data, datas.target

    #取k值为1-32,验证k值为多少时,模型最为准确
    neighbors = np.arange(1,33)
    #创建一个数组,用于存放模型评估的值
    y = []
    for k in neighbors:
        # 训练模型
        knn = KNeighborsClassifier(n_neighbors=k)
        # 交叉验证模型评估
        # cv:表示每次取10份数据,9份训练,1份测试
        # scoring:表示该方法最终返回值为准确度
        # mean():表示求平均值
        ms = cross_val_score(knn, train, target, cv=10, scoring='accuracy').mean()
        y.append(ms)

    plt.plot(neighbors,y,'r')
    for x1,y1 in zip(neighbors,y):
        # 在柱状图上显示具体数值, ha参数控制水平对齐方式, va控制垂直对齐方式,rotation字体旋转
        plt.text(x1,y1,str(x1),ha='center',va='bottom',fontsize=12,rotation=0)
    plt.show()
  • 结果展示

机器学习——KNN近邻算法(鸢尾花数据集)_第1张图片

  • 结论
    使用交叉验证来建立评估模型,可以发现当我们将k值取为13、18、20的时候,模型的准确性最高,大概为0.98

你可能感兴趣的:(机器学习——KNN近邻算法(鸢尾花数据集))