十七、分类

    分类是对数据进行分类的过程 - 将数据点分配给预定义的组(或簇)。

    来自维基百科的文章。

    支持向量机是一种监督分类算法。

    在此示例中,我们将生成来自两个不同(已知)组的一些二维数据,并将 SVM 分类模型应用于此数据。

    1. n_points = 50
    2. label_prop = 0.5
    3. # 初始化数据矩阵(为零)
    4. dat = np.zeros(shape=[n_points, 2])
    5. # 配置每类的数据点数量
    6. n_dat_1 = int(n_points * label_prop)
    7. n_dat_2 = n_points - n_dat_1
    8. # 生成数据
    9. dat[0:n_dat_1, 0] = np.abs(np.random.randn(n_dat_1))
    10. dat[0:n_dat_1, 1] = np.abs(np.random.randn(n_dat_1))
    11. dat[n_dat_2:, 1] = np.abs(np.random.randn(n_dat_1)) + 2
    12. # 创建标签向量
    13. labels = np.array([0] * n_dat_1 + [1] * n_dat_2)
    14. # 绘制出带标签数据
    15. fig = plt.figure(figsize=[9, 7])
    16. plt.plot(dat[0:n_dat_1, 0], dat[0:n_dat_1, 1], 'b.', ms=12, label="Label=0")
    17. plt.plot(dat[n_dat_2:, 0], dat[n_dat_2:, 1], 'g.', ms=12, label="Label=1")
    18. plt.legend();

    Scikit-Learn 对象

    如上所述,我们有两组完全不同的数据。现在我们想要学习一个数学过程,可以将这些数据标记为两组,我们希望它能够学习一个可以应用于新数据点的一般过程。

    在这里,我们将使用典型的 scikit-learn 方法:

    • 为我们正在使用的模型对象初始化 sklearn 对象,设置所需的参数
    • 在我们带标记的训练数据上训练模型
    • 应用模型来预测新的数据点

    一旦我们有一个训练好的模型,我们就可以预测新数据点的标签 - 我们不知道答案的数据。

    1. # 设置一个新点 - 来预测标签
    2. new_point = np.array([[3, 3]])
    3. # 向图形添加我们的新点(红色)
    4. fig.gca().plot(new_point[0][0], new_point[0][1], '.r', ms=12);
    5. # 重绘图形
    6. fig

    支持向量

    SVM的一个关键特性是它们使用“支持向量”,这意味着它们优先使用靠近决策边界的数据点的信息,并使用它们来尝试找到最宽的边距 - 两组之间的距离。在这里,我们可以简单探索我们的已训练模型的支持向量。

    1. # 向绘图添加支持向量
    2. # 支持向量将通过用黑色圆圈突出显示
    3. for row in classifier.support_vectors_:
    4. fig.gca().plot(row[0], row[1], 'ok', ms=14, mfc='none')
    5. fig

    png

    现在让我们绘制决策边界 - 我们的学习模型认为标签在组之间切换的边界。

    以下代码用于查找和可视化决策边界和边距,取自 sklearn 示例

    探索

    在更改数据,更改内核和预测不同数据点时,调查会发生什么。