美文网首页
第2章 监督学习 2

第2章 监督学习 2

作者: 冰度猎魂 | 来源:发表于2018-12-31 13:18 被阅读0次

2.3 监督学习算法

2.3.1 一些样本数据集

我们将使用一些数据集来说明不同的算法。其中一些数据集很小,而且是模拟的,其目的是强调算法的某个特定方面。其他数据集都是现实世界的大型数据集。
forge数据集是一个模拟的二分类数据集示例,它有两个特征。下列代码将绘制一个散点图,将此数据集的所有数据点可视化。图像以第一个特征为x轴,第二个特征为y轴。正如其他散点图那样,每个数据点对应图像中的一点。每个点的颜色和形状对应其类别:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import mglearn
# 生成数据集
X, y = mglearn.datasets.make_forge()
# 数据集绘图
mglearn.discrete_scatter(X[:, 0], X[:, 1], y)
plt.legend(["Class 0", "Class 1"], loc=4)
plt.xlabel("First feature")
plt.ylabel("Second feature")
print("X.shape:{}".format(X.shape))

运行结果:

forge数据集的散点图
从X.shape可以看出,这个数据集包含26个数据点和2个特征。
我们用模拟的wave数据集来说明回归算法。wave数据集只有一个输入特征和一个连续的目标变量(或响应),后者是模型想要预测的对象。下面绘制的图像中单一特征位于x轴,回归目标(输出)位于y轴:
X, y = mglearn.datasets.make_wave(n_samples=40)
plt.plot(X, y, 'o')
plt.ylim(-3, 3)
plt.xlabel("Feature")
plt.ylabel("Target")
wava数据集的图像,x轴表示特征,y轴表示回归目标
我们之所以使用这些非常简单的低维数据集,是因为他们的可视化非常简单——书页只有两个维度,所以很难展示特征数超过两个的数据。从特征较少的数据集(也叫低维数据集)中得到的结论可能并不适用于特征较多的数据集(也叫高维数据集)。只要你记住这一点,那么在低维数据集上研究算法也是很有启发的。
除了上面这些小型的模拟的数据集,我们还将补充两个现实世界中的数据集,它们都包含在scikit-learn中。其中一个是威斯康星州乳腺癌数据集(简称cancer),里面记录了乳腺癌肿瘤的临床测量数据。每个肿瘤都被标记为“良性”(benign,表示无害肿瘤)或“恶性”(malignant,表示癌性肿瘤),其任务是基于人体组织的测量数据来学习预测肿瘤是否为恶性。
可以用scikit-learn模块的load_breast_cancer函数来加载数据:
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
print("cancer.keys():\n{}".format(cancer.keys()))

运行结果:

cancer.keys():
dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names'])

包含在scikit-learn中的数据集通常被保存为Bunch对象,里面包含真实数据以及一些数据集信息。关于Bunch对象,你只需要知道它与字典很相似,而且还有一个额外的好处,就是你可以用点操作符来访问对象的值(比如用bunch.key来代替bunch['key'])。

这个数据集共包含569个数据点,每个数据点有30个特征:

print("Shape of cancer data:{}".format(cancer.data.shape))
Shape of cancer data:(569, 30)

在569个数据点中,212个被标记为恶性,357个被标记为良性:

print("Sample counts per class:\n{}".format(
    {n: v for n, v in zip(cancer.target_names, np.bincount(cancer.target))}))
Sample counts per class:
{'malignant': 212, 'benign': 357}

为了得到每个特征的语义说明,我们可以看一下feature_names属性:

print("Feature names:\n{}".format(cancer.feature_names))
Feature names:
['mean radius' 'mean texture' 'mean perimeter' 'mean area'
 'mean smoothness' 'mean compactness' 'mean concavity'
 'mean concave points' 'mean symmetry' 'mean fractal dimension'
 'radius error' 'texture error' 'perimeter error' 'area error'
 'smoothness error' 'compactness error' 'concavity error'
 'concave points error' 'symmetry error' 'fractal dimension error'
 'worst radius' 'worst texture' 'worst perimeter' 'worst area'
 'worst smoothness' 'worst compactness' 'worst concavity'
 'worst concave points' 'worst symmetry' 'worst fractal dimension']

我们还会用到一个现实世界中的回归数据集,即波士顿房价数据集。与这个数据集相关的任务是,利用犯罪率、是否临近查尔斯河、公路可达性等信息,来预测20世纪70年代波士顿地区房屋价格的中位数。这个数据集包含506个数据点和13个特征:

from sklearn.datasets import load_boston
boston = load_boston()
print("Data shape:{}".format(boston.data.shape))
Data shape:(506, 13)

同样,可以阅读boston对象的DESCR属性来了解数据集的更多信息。对于我们的目的而言,我们需要扩展这个数据集,输入特征不仅包括这13个测量结果,还包括这些特征之间的乘积(也叫交互项)。换句话说,我们不仅将犯罪率和公路可达性作为特征,还将犯罪率和公路可达性的乘积作为特征。像这样包含导出特征的方法叫作特征工程(feature engineerng)。这个导出的数据集可以用load_extended_boston函数加载:

X, y = mglearn.datasets.load_extended_boston()
print("X.shpe:{}".format(X.shape))
X.shpe:(506, 104)

最初的13个特征加上这13个特征两两组合(有放回)得到的91个特征,一共有104个特征。

2.3.2 k近邻

k-NN算法可以说是最简单的机器学习算法。构建模型只需要保存训练数据集即可。想要对新数据点做出预测,算法会在训练数据集中找到最近的数据点,也就是它的“最近邻”。
1. k近邻分类
k-NN算法最简单的版本只考虑一个最近邻,也就是与我们想要预测的数据点最近的训练数据点。预测结果就是这个训练数据点的已知输出。下图给出了这种分类方法在forge数据集上的应用:

mglearn.plots.plot_knn_classification(n_neighbors = 1)
单一最近邻模型对forge数据集的预测结果

这里我们添加了3个新数据点(用五角星表示)。对于每个新数据点,我们标记了训练集中与它最近的点。单一最近邻算法的预测结果就是那个点的标签(对应五角星的颜色)。
除了仅考虑最近邻,还可以考虑任意个(k个)邻居。这也是k近邻算法名字的来历。在考虑多余一个邻居的情况时,我们用“投票法”(voting)来指定标签。也就是说,对于每个测试点,我们数一数多少个邻居属于类别0,多少个邻居属于类别1。然后将出现次数更多的类别(也就是k个近邻中占多数的类别)作为预测结果。下面的例子用到了3个近邻:

mglearn.plots.plot_knn_classification(n_neighbors = 3)
3近邻模型对forge数据集的预测结果

和上面一样,预测结果可以从五角星的颜色看出。你可以发现,左上角新数据点的预测结果与只用一个邻居时的预测结果不同。
虽然这张图对应的是一个二分类问题,但方法同样适用于多分类的数据集。对于多分类问题,我们数一数每个类别分别有多少个邻居,然后将最常见的类别作为预测结果。
现在看一下如何通过scikit-learn来应用k近邻算法。首先,要将数据分为训练集和测试集,以便评估泛化性能:

from sklearn.model_selection import train_test_split
X, y = mglearn.datasets.make_forge()
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 0)

然后,导入类并将其实例化。这时可以设定参数,比如林俊的个数。这里我们将其设为3:

from sklearn.neighbors import KNeighborsClassifier
clf = KNeighborsClassifier(n_neighbors = 3)

现在,利用训练集对这个分类器进行拟合。对于KNeighborsClassifier来说就是保存数据集,以便在预测时计算与邻居之间的距离:

clf.fit(X_train, y_train)

调用predict方法来对测试数据进行预测。对于测试集中的每个数据点,都要计算它在训练集的最近邻,然后找出其中出现次数最多的类别:

print("Test set predictions:{}".format(clf.predict(X_test)))

输出结果:

Test set predictions:[1 0 1 0 1 0 0]

为了评估模型的泛化能力好坏,我们可以对测试数据和测试标签调用score方法:

print("Test set accuracy:{:.2f}".format(clf.score(X_test, y_test)))

输出结果:

Test set accuracy:0.86

可以看到,我们的模型精度约为86%,也就是说,在测试数据集中,模型对其中86%的样本预测的类别都是正确的。

相关文章

  • 第2章 监督学习 2

    2.3 监督学习算法 2.3.1 一些样本数据集 我们将使用一些数据集来说明不同的算法。其中一些数据集很小,而且是...

  • Types of Machine Learning: Super

    1. 监督学习 or 无监督学习 2. 监督学习 2.1 分类 2.2 回归 2.3 监督学习:分类 & 回归...

  • ml chapter1机器学习的分类

    1,监督学习:数据与标签的2,非监督学习:只有数据没有标签3,半监督学习:监督学习+半监督学习4,强化学习:训练中...

  • 第 2 章 监督学习(上)

    前面说过,监督学习是最常用也是最成功的机器学习类型之一。本章将会详细介绍监督学习,并解释几种常用的监督学习算法。我...

  • 第 2 章 监督学习(下)

    2.3.5决策树 决策树是广泛用于分类和回归任务的模型。本质上,它从一层层的 if/else 问题中进行学习,并得...

  • 第2章 监督学习 1

    监督学习是最常用也是最成功的机器学习类型之奥一。本章将会详细介绍监督学习,并解释几种常用的监督学习算法。记住,每当...

  • 【Machine Learning】从零开始,了解无监督学习的方

    目录### 1. 什么是无监督学习2. 发现和无监督学习3. 聚类分析 1. 什么是无监督学习 无监督学习没有教师...

  • 机器学习实战(一) - 绪论 : 初识机器学习

    1 欢迎来到机器学习 2 什么是机器学习 3 监督学习 - Supervised Learning 监督式学习就...

  • Udacity.机器学习入门.2朴素贝叶斯.2017-08-27

    机器学习入门 2. 朴素贝叶斯 监督学习 马是否属于acerous?关注特征 监督学习、非监督学习(异常检测、聚类...

  • 机器学习

    学习方式:1.监督学习2.无监督学习3.非监督学习4.强化学习 算法分类:1.回归算法2.基于实例的算法3.正则化...

网友评论

      本文标题:第2章 监督学习 2

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