美文网首页机器学习随笔-生活工作点滴
"深入浅出Python机器学习" 学习笔记-

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

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

    第三章 K最近邻算法-近朱者赤,近墨者黑

    3.1 kNN原理

    • 在分类上, 原理是取最近的k个点, 按这些点的类标签来决定未知点的类型.
    • 在回归上, 取最近k个点的y值取平均作为预测值.
    • 默认的k是5, 根据经验可以调5, 10. 参数最好要优化.
    • metricp可以改变距离的测量. weights可以改变各特征的权重(默认均等).

    TODO: 如果分类时, k个点最多的类有2甚至3种, 是根据最近原则来确定类么?

    3.2 kNN的用法

    这里作者用了一个自建数据集和红酒数据集做测试, 针对分类和回归的应用都做了展示.

    • neighbors.KNeighborsClassifier 能用于kNN分类.
    • neighbors.KNeighborsRegressor 能用于kNN回归 (取邻近的k个点的y值平均)
    • 一般习惯地, clf代表分类器, reg代表回归器.

    3.2.1 kNN在简单分类的应用

    sklearn.datasets子模块是针对数据集的一个模块, 内含几个toy datasets, 另外, 也可以下载更大的数据集, 或者自己产生数据集. 这章书使用make_blobs来产生分类点, 使用make_regression来产生回归使用的点.

    make_blobs 产生数据集

    使用datasets.make_blobs 可以产生分类的数据点, 见下面例子.

    • make_blobs : 产生各同向性Gaussian blobs用于聚类. 返回(features, labels)的两个数组.
      • n_samples=100 : 产生点数. 如果给的是数组, 数组中每个元素是每个类的点数.
      • n_features=2 : 特征数.
      • centers=None : 产生分类数(标签). 如果给定了n_samples, 而centers为None, 则会产生三个中心
      • cluster_std=1.0 : 类的标准差.
      • center_box=(-10.0, 10.0) : 一个类的边界, (min,max)
      • shuffle=True : 对样本洗牌.
      • random_state=None : 随机状态.
    # 导入数据集, 分类器, 画图工具, 数据集拆分工具
    from sklearn.datasets import make_blobs
    from sklearn.neighbors import KNeighborsClassifier
    import matplotlib.pyplot as plt
    from sklearn.model_selection import train_test_split
    
    # 生成样本数200, 分类为2类的数据集,
    data = make_blobs(n_samples=200, n_features=2, centers=2, random_state=8)
    X, y = data
    # 将生成的数据集进行可视化
    plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.spring, edgecolors='k')
    plt.show()
    
    make_blobs产生二分类的数据集
    • 该例子产生的是两个类, 为了便于可视化, 使用2个特征.
    • 产生的返回值是(features, labels)两个数组, 分别给了X和y.
    • 一般地, 大写X是多维数据(矩阵), 特征时用; y是一维数组(向量), 一般标签用.
    • scatter作散点图, 前两个是X轴和Y轴坐标(用的是特征1和特征2), c=y是指定颜色对应的是标签(0/1)
    创建kNN分类模型
    • 使用neighbors.KNeighborsClassifier可以创建分类模型, 有很多参数可调, 最常用n_neighbors指定k值.
    • 创建的对象就是一个分类器. 或者说是模型. 使用fit(X,y)方法可以进行训练, 使用predict(X)可以进行预测(返回相应标签y).
    • 模型训练使用训练集, 训练一次后即可进行多次的预测.
    • 下面的例子使用上面的测试集进行训练(整个集作为训练集). 一般要将数据分割成训练集和测试集来测试.
    • 为可视化表征模型, 作者创建了网格( np.meshgrid, 格点距离0.02, 范围覆盖坐标), 并用网格的坐标利用模型进行预测(这步很费时), 预测值就是网格对应的类, 再结合plt.pcolormesh将坐标内根据类标签用不同颜色表示.
    • array.ravel() 可以将多维数组一维化. np.c_[A, B] 可以将后面的slice中给定的数组连结为2D数组.
    # 拟合
    import numpy as np
    clf = KNeighborsClassifier()
    clf.fit(X, y)
    
    # 画图
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
                         np.arange(y_min, y_max, 0.02))
    # 空间虚拟点的预测值
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Pastel1)
    plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.spring, edgecolor='k')
    plt.xlim(xx.min(), xx.max())
    plt.ylim(yy.min(), yy.max())
    plt.title("Classifier:KNN")
    plt.show()
    
    建立kNN模型并可视化
    预测新点的分类

    输入一个数据点的特征([[6.75,4.82]],注意两层中括号, 一层是元素, 一层是特征), 肉眼可见再灰色一类(类1). 进行预测, 其结果和观察一致.

    # 加入新数据点, 并五星标记
    plt.scatter(6.75, 4.82, marker='*', c='red', s=200)
    plt.show()
    
    # 对新点进行预测, 并显示其分类
    print('新数据点的分类是:',clf.predict([[6.75,4.82]]))
    
    新数据点显示和预测

    新数据点的分类是: [1]


    未完, 待续

    相关文章

      网友评论

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

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