美文网首页机器学习
"深入浅出Python机器学习" 学习笔记-

"深入浅出Python机器学习" 学习笔记-

作者: 爱折腾的大懒猪 | 来源:发表于2019-07-05 04:15 被阅读1次

    3.3 kNN实战 - 酒的分类

    其实这部分也没啥.. 和前面大同小异. 主要的差异就是, 继续学习使用sklearn的datasets模块读取已有的数据集.

    3.3.1 数据集基本分析

    #从sklearn的datasets模块载入数据集
    from sklearn.datasets import load_wine
    wine_dataset = load_wine()
    
    print("红酒数据集中的键:\n{}".format(wine_dataset.keys()))
    # 红酒数据集中的键:
    # dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names'])
    
    print('数据概况:{}'.format(wine_dataset['data'].shape))
    # 数据概况:(178, 13)
    
    print(wine_dataset['DESCR'])
    # .. _wine_dataset:
    # Wine recognition dataset
    # ------------------------
    # **Data Set Characteristics:**
    # 后面接了一堆的说明. 只放出有意义的部分
        :Summary Statistics:
        
        ============================= ==== ===== ======= =====
                                       Min   Max   Mean     SD
        ============================= ==== ===== ======= =====
        Alcohol:                      11.0  14.8    13.0   0.8
        Malic Acid:                   0.74  5.80    2.34  1.12
        Ash:                          1.36  3.23    2.36  0.27
        Alcalinity of Ash:            10.6  30.0    19.5   3.3
        Magnesium:                    70.0 162.0    99.7  14.3
        Total Phenols:                0.98  3.88    2.29  0.63
        Flavanoids:                   0.34  5.08    2.03  1.00
        Nonflavanoid Phenols:         0.13  0.66    0.36  0.12
        Proanthocyanins:              0.41  3.58    1.59  0.57
        Colour Intensity:              1.3  13.0     5.1   2.3
        Hue:                          0.48  1.71    0.96  0.23
        OD280/OD315 of diluted wines: 1.27  4.00    2.61  0.71
        Proline:                       278  1680     746   315
        ============================= ==== ===== ======= =====
    
        :Missing Attribute Values: None
        :Class Distribution: class_0 (59), class_1 (71), class_2 (48)
    

    使用 load_xxxx的方法就可以简单地加载该数据集, 其实数据集是一种Bunch对象, 用于数据集的一种容器, 类似于字典, 有key和value. 可使用对象.key 来将键名作为属性来调用. 属性有: 'DESCR', 'data', 'feature_names', 'target', 'target_names', 部分数据集还有如'filename'等.

    • DESCR是数据集的描述. 一个字符串. 这里可以看到, 每个类有多少样本.
    • data这里是一个(178,13)ndarray, 类似地target(178,1)的数组.
    • feature_namestarget_names,前者储存了13个feature的名字, 后者储存了对于目标0,1,2类(没有名, Iris集会有花种类名) .

    此外, datasets 模块还有不少小数据集:

    datasets中已有的数据集

    除此以外, 还能简单地获取更大的一些数据集:


    datasets使用fetch获取的数据集

    3.3.2 生成训练数据集和测试数据集

    使用model_selection模块的train_test_split方法可以将数据集随机分成一定大小的子集. 从而实现训练和测试两步. 前面已经说了, 一般使用大写X来储存多维数据的训练集, 而用小写y储存一位数组(向量).

    • train_test_split方法是个重要方法, 将数组分为随机的训练集和测试集. 须确保数据长度一致.
      • *arrays : 等长的可索引化的序列. list, array, scipy-sparse矩阵, pandas dataframe都可以.
      • test_size=None : 浮点0-1的话,是测试集的比例; 整数的话是测试集的样品数. 如果None, 根据训练集来定, 如果训练集也是None, 则默认设为0.25.
      • train_size=None : 训练集大小或比例, 同上. None的话根据测试集来互补.
      • random_state=None : 随机状态, int, RandomState. 对于随机种子想固定时有用.
      • shuffle=True : 在分割数据集前进行洗牌(打乱顺序) .
      • stratify=None : 分层???
      • 返回 list(array), 长度为2*arrays总数 (给定两个数组(特征和目标值), 会分成4份, 依次是输入数组分成的训练集和测试集,顺序很重要). 例如输入X,y,返回train_X, test_X, train_y, test_y.
    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(wine_dataset['data'], 
                                          wine_dataset['target'], random_state=0)
    
    print('X_train shape:{}'.format(X_train.shape))
    print('X_test shape:{}'.format(X_test.shape))
    print('y_train shape:{}'.format(y_train.shape))
    print('y_test shape:{}'.format(y_test.shape))
    # X_train shape:(133, 13)
    # X_test shape:(45, 13)
    # y_train shape:(133,)
    # y_test shape:(45,)
    

    3.3.3 kNN进行建模和预测

    和前面类似, 包括了使用fit来拟合(使用训练集X_train, y_train), 使用predict来预测(使用测试集X_test, y_test), 使用score也可以预测并直接评分.

    from sklearn.neighbors import KNeighborsClassifier
    knn = KNeighborsClassifier(n_neighbors = 1)
    knn.fit(X_train, y_train)
    
    print('训练数据集得分:{:.2f}'.format(knn.score(X_train, y_train)))
    # 训练数据集得分:1.00
    
    print('测试数据集得分:{:.2f}'.format(knn.score(X_test, y_test)))
    # 测试数据集得分:0.76
    

    这里的得分其实是预测正确样本数/总输入样本数.

    假设有一瓶新酒, 经测试各种指标后(如酒精含量,某某成分含量等), 可以建立其特征. 利用新特征, 就可以对其进行分类预测:

    import numpy as np
    X_new = np.array([[13.2,2.77,2.51,18.5,96.6,1.04,2.55,0.57,1.47,6.2,1.05,
                      3.33,820]])
    prediction = knn.predict(X_new)
    
    print("预测新红酒的分类为:{}".format(wine_dataset['target_names'][prediction]))
    # 预测新红酒的分类为:['class_2']
    

    相关文章

      网友评论

        本文标题:"深入浅出Python机器学习" 学习笔记-

        本文链接:https://www.haomeiwen.com/subject/gyyjhctx.html