# 监督学习

\quad 监督学习,即机器学习输入 xx 到输出 yy 的过程,其中输出 yy 是有标签的。监督学习的两种主要类型是回归分类。回归类型就例如预测房价之类;分类类型就例如区分猫和狗之类。

# 无监督学习

\quad 无监督学习与监督学习不同之处就在于输出数据没有标签。一个话糙理不糙的例子是:你小时候见到了狗和猫两种动物,有人告诉你这个样子的是狗、那个样子的是猫,你学会了辨别,这是监督学习;你小时候见到了狗和猫两种动物,没人告诉你哪个是狗、哪个是猫,但你根据他们样子、体型等特征的不同鉴别出这是两种不同的生物,并对特征归类,这是无监督学习。
\quad 什么是特征归类?我们看一个具体例子,如图一所示,xx 轴为肿瘤的大小,yy 轴为患者的年龄,这两个参数为输入量。左侧图描述的是利用监督学习的分类模型,将良性肿瘤与恶行肿瘤区分开;右侧图描述的是利用无监督学习的特征归类,我们并不去告诉机器哪些是良性的、恶性的,即我们不给输出量贴标签,仅仅通过输入量背后隐藏的特征去实现特征归类。

\quad 无监督学习也不仅仅只有特征归类这种类型,常见的还有异常检测降维。异常检测好理解,而降维是指采用某种映射方法,将原高维空间中的数据点映射到低维度的空间中。

# 案例:KNN 分类鸢尾花数据集

# KNN 分类算法

\quad KNN 的全称是 K Nearest Neighbors,意思是 K 个最近的邻居。KNN 的原理就是当预测一个新的值 xx 的时候,根据它距离最近的 KK 个点是什么类别来判断 xx 属于哪个类别。更直观地理解可以看下图:


从上两图的例子中来看得出 KK 的取值是很重要的。

\quad 当然,上两图的例子的输入量有两个 XXYY,若有更多的变量也亦同理。而我们所寻找的最近的 “距离”,这个 “距离” 我们往往用欧几里得距离(简称欧氏距离),但根据情况也可以使用其他的距离函数,例如余弦距离、汉明距离和曼哈顿距离等。

# Python 实现 KNN 分类鸢尾花数据集

\quad Python 的 sklearn 包中有自带的数据集,其中就有一个 "iris" 的鸢尾花数据集。这个数据集告诉了我们 150 支鸢尾花的参数,包括了每支花的 sepal length、sepal width、petal length、petal width,以及每支花所属的类别(一共有三种类别)。我们将花的 4 种参数作为输入量,花的类别作为输出量,将 150 支花以 7:3 的比例分为训练集和测试集,利用 KNN 算法进行训练和测试。最终利用 metrics.accuracy_score () 计算准确率(该计算函数常用于二分类或者多分类中,预测得到的 label,跟真实 label 比较,计算准确率)。

import numpy as np
from sklearn import datasets #导入 sklearn 自带的数据集
from sklearn.model_selection import train_test_split #导入切分训练集、测试集模块
from sklearn.neighbors import KNeighborsClassifier #机器学习各种评价指标
from sklearn import metrics #导入
# 加载鸢尾花数据集,并分割成样本特征 X 和样本标签 Y
data = datasets.load_iris()
X, y = data.data, data.target
# 使用 train_test_split 把所有样本按 7:3 的比例分为测试样本、训练样本
# 同时 train_test_split 也会把数据的顺序也随机打乱
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
# 使用 test sample 给模型打分
model = KNeighborsClassifier(n_neighbors=5)
model.fit(X_train, y_train)
print('Accuracy on the train sample: ', metrics.accuracy_score( model.predict(X_train), y_train))
print('Accuracy on the test  sample: ', metrics.accuracy_score( model.predict(X_test), y_test))
-------------------------------------------------
结果:
Accuracy on the train sample:  0.9619047619047619
Accuracy on the test  sample:  0.9333333333333333