2、监督学习与无监督学习
在处理机器学习问题时,一般有两种类型的数据(和机器学习模型)
- 监督数据:始终有一个或多个与之关联的目标
- 无监督数据:没有任何目标变量。
有监督的问题比无监督的问题更容易处理。我们需要预测一个值的问题被称为有监督问题。例如,如果问题是在给定历史房价的情况下预测房价,具有医院、学校或超市距离最近的公共交通距离等特征,则是一个有监督问题。同样,当我们提供了猫和狗的图像,我们事先知道哪些是猫,哪些是狗,如果任务是创建一个模型,预测提供的图像是猫还是狗,这个问题被认为是有监督的。

- 分类:预测一个类别,例如狗或猫。
- 回归:预测一个价值,例如房价。
必须注意的是,有时我们可能会在分类设置中使用回归,这取决于用于评估的度量。但我们稍后会讨论这个问题。
另一种类型的机器学习问题是无监督类型。无监督数据集没有与之相关的目标,通常,与有监督的问题相比,处理这些数据集更具挑战性。
假设你在一家处理信用卡交易的金融公司工作。每秒钟都会有大量的数据。唯一的问题是,很难找到能将每一笔交易标记为有效或真实交易或欺诈的人。当我们没有任何关于欺诈或真实的信息时,这个问题就变成了一个无人监督的问题。为了解决这类问题,我们必须考虑数据可以划分为多少个集群。聚类是可以用于此类问题的方法之一,但必须注意的是,还有其他几种方法可以应用于无监督问题。对于诈骗检测问题,我们可以说数据可以分为两类(诈骗或真实)。
当我们知道聚类的数量时,我们可以使用聚类算法来解决无监督问题。在图2中,假设数据有两类,深色表示欺诈,浅色表示真实交易。然而,在使用集群方法之前,我们并不知道这些类。在应用聚类算法之后,我们应该能够区分两个假定的目标。为了理解无监督问题,我们还可以使用许多分解技术,如**主成分分析(PCA)、t分布随机邻域嵌入(t-SNE)**等。
有监督的问题更容易解决,因为它们可以很容易地进行评估。我们将在以下章节中阅读更多关于评估技术的内容。然而,评估无监督算法的结果是具有挑战性的,并且需要大量的人为干扰或启发式。在这本书中,我们将主要关注有监督的数据和模型,但这并不意味着我们将忽视无监督的数据问题。

大多数时候,当人们从数据科学或机器学习开始时,他们会从非常著名的数据集开始,例如Titanic数据集或Iris数据集,它们是监督问题。在泰坦尼克号数据集中,你必须根据人们的机票等级、性别、年龄等因素来预测泰坦尼克号上的人的生存。同样,在虹膜数据集中,我们必须根据萼片宽度、花瓣长度、萼片长度和花瓣宽度等因素来预测花的种类。
无监督数据集可能包括用于客户细分的数据集。例如,您有访问您的电子商务网站的客户的数据,或者有访问商店或购物中心的客户的信息,您希望将它们细分或聚类到不同的类别中。无监督数据集的另一个例子可能包括信用卡欺诈检测或只是对几个图像进行聚类。
大多数时候,也可以将有监督的数据集转换为无监督的数据,以查看绘制时的情况。
例如,让我们看看图3中的数据集。图3显示了MNIST数据集,这是一个非常流行的手写数字数据集,它是一个有监督的问题,在这个问题中,你会得到数字的图像和与之相关的正确标签。你必须建立一个模型,当只提供图像时,它可以识别哪一个数字。
该数据集可以很容易地转换为无监督设置,用于基本可视化。


让我们来看看这是怎么做到的。首先也是最重要的是导入所有必需的库。
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
from sklearn import datasets
from sklearn import manifold
%matplotlib inline
我们使用matplotlib和seaborn进行绘图,使用numpy处理数值数组,使用panda从数值数组创建数据帧,使用scikit-learn(sklearn)获取数据并执行t-SNE。
导入后,我们需要下载数据并单独读取,或者使用sklearn的内置函数为我们提供MNIST数据集。
data = datasets.fetch_openml(
'mnist_784',
version=1,
return_X_y=True
)
pixel_values, targets = data
targets = targets.astype(int)
在代码的这一部分中,我们使用sklearn数据集获取了数据,我们有一个像素值数组和另一个目标数组。由于目标是字符串类型的,我们将它们转换为整数。
p i x e l _ v a l u e s pixel\_values pixel_values是形状为70000x784的二维数组。有70000个不同的图像,每个图像的大小为28x28像素。平坦化28x28给出784个数据点。
我们可以通过将样本重塑为原始形状,然后使用matplotlib绘制样本来可视化该数据集中的样本。
single_image = pixel_values[1, :].reshape(28, 28)
plt.imshow(single_image, cmap='gray')
此代码将绘制如下图像:

tsne = manifold.TSNE(n_components=2, random_state=42)
transformed_data = tsne.fit_transform(pixel_values[:3000, :])
此步骤创建数据的t-SNE转换。我们只使用两个组件,因为我们可以在二维环境中很好地可视化它们。在这种情况下, t r a n s f o r m e d _ d a t a transformed\_data transformed_data是形状为3000x2(3000行2列)的数组。这样的数据可以通过在数组上调用pd.dataframe转换为pandas的DataFrame。
tsne_df = pd.DataFrame(
np.column_stack((transformed_data, targets[:3000])),
columns=["x", "y", "targets"]
)
tsne_df.loc[:, "targets"] = tsne_df.targets.astype(int)
在这里,我们从一个numpy数组创建一个pandas数据帧。共有三列:x、y和target。x和y是t-SNE分解的两个分量,target是实际数量。这为我们提供了一个数据帧,它看起来像图6中所示的数据帧。
x | y | targets | |
---|---|---|---|
0 | -5.281551 | -28.952768 | 5 |
1 | -26.105896 | -68.069321 | 0 |
2 | -42.503582 | 35.580391 | 4 |
3 | 38.893967 | 26.663395 | 1 |
4 | -14.770573 | 35.433247 | 9 |
5 | 63.997231 | -1.102326 | 2 |
6 | –6.551701 | 9.943600 | 1 |
7 | 20.086042 | -44.003902 | 3 |
8 | -0.806248 | 12.682267 | 1 |
9 | -1.481194 | 45.506077 | 4 |
最后,我们可以使用seaborn和matplotlib绘制它。
grid = sns.FacetGrid(tsne_df, hue="targets", size=8)
grid.map(plt.scatter, "x", "y").add_legend()
这是可视化无监督数据集的一种方法。我们也可以在同一个数据集上进行k-means聚类,看看它在无监督环境中的表现。一个一直存在的问题是如何在k-均值聚类中找到最优的聚类数量。没有正确的答案。你必须通过交叉验证找到数字。交叉验证将在本书后面讨论。请注意,上面的代码是在jupyter笔记本上运行的。
在这本书中,我们将使用jupyter进行简单的事情,如上面的例子和绘图。对于本书中的大部分内容,我们将使用python脚本。你可以选择你想要使用的,因为结果是一样的。
MNIST是一个有监督的分类问题,我们将其转换为无监督的问题,只是为了检查它是否给出了任何类型的好结果,很明显,我们用t-SNE分解确实得到了好结果。如果我们使用分类算法,结果会更好。它们是什么以及如何使用它们?让我们在下一章中看看它们。