到目前为止,我们已经学习了大概有八种机器学习的算法,其中有解决分类问题的,有解决回归问题的。这些算法其实没有谁是最好的,谁不好之说,反而应该将这些算法集合起来,发挥他们的最大价值。比如我们买东西或看电影之前,多少都会咨询身边的朋友,或去网上看看买家的评价,然后我们才会根据口碑好坏,或评价好坏决定买还是不买,看还是不看。在机器学习中,同样有这样的思路,这就是重要的集成学习。

集成学习

机器学习中的集成学习就是将选择若干算法,针对同一样本数据训练模型,然后看看结果,使用投票机制,少数服从多数,用多数算法给出的结果当作最终的决策依据,这就是集成学习的核心思路。下面我们先手动模拟一个使用集成学习解决回归问题的的示例:

閱讀全文 »

这篇笔记我们来看看决策树的另一种划分方式基尼系数和决策树中的超参数,以及决策树的缺陷。

基尼系数

在一开始我们使用Scikit Learn中提供的决策树分类器时,DecisionTreeClassifier有一个参数criterion,我们之前传入了entropy,也就是表示此时决策树使用信息熵方式。由此可知,决策树应该不止信息熵一种方式,所以这一节来看看决策树的另一种方式,基尼系数。

其实基尼系数和信息熵的思路基本是一致的,只是判定数据随机性度量的公式不一样,那么基尼系数的公式为:

$$G = 1 - \sum_{i=1}^k p_i^2$$

同样用之前的例子代入公式看一下:

$$\{\frac 1 3,\frac 1 3,\frac 1 3\}$$

将上面的数据类别占比信息代入公式后可得:

$$G = 1-(\frac 1 3)^2-(\frac 1 3)^2-(\frac 1 3)^2=0.6666$$

再换一组数据类别占比信息:

$$\{\frac 1 {10},\frac 2 {10},\frac 7 {10}\}$$

代入公式后可得:

$$G = 1-(\frac 1 {10})^2-(\frac 2 {10})^2-(\frac 7 {10})^2=0.46$$

可见基尼系数同样反应了数据不确定性的度量。这里就不再使用代码对基尼系数的方式进行模拟了,其实只需要将信息熵的公式换成基尼系数的既可。

閱讀全文 »

这篇笔记我们来看看机器学习中一个重要的非参数学习算法,决策树。

什么是决策树

上图是一个向银行申请信用卡的示例,图中的树状图展示了申请人需要在银行过几道关卡后才能成功申请到一张信用卡的流程图。在图中树状图的根节点是申请人输入的信息,叶子节点是银行作出的决策,也就相当于是对申请者输入信息作出的分类决策。从第一个根节点到最后一个叶子节点经过的根节点数量称为树状图的深度(depth)。上图示例中的树状图从第一个根节点申请人是否办理过信用卡,到最后一个发放信用卡叶子节点共经过了三个根节点,所以深度为3。那么像这样使用树状图对输入信息一步步分类的方式就称为决策树方式。

我们再来看一个问题,上图中每一个根节点的输入信息都可以用来做判断分类,但是机器学习的样本数据都是数字,那么此时如果做判断呢?我们先来使用Scikit Learn中提供的决策树直观的看一下通过决策树对样本数据的分类过程和分类结果。

閱讀全文 »

SVM处理非线性问题

我们在 机器学习笔记八之多项式回归、拟合程度、模型泛化 中讲过线性回归通过多项式回归方法处理非线性问题,同样SVM也可以使用多项式方法处理非线性问题。

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets

# 使用datasets提供的方法构建非线性数据
X, y = datasets.make_moons()

我们可以使用datasets提供的make_moons()函数生成非线性数据,默认为100行2列的矩阵,既100个样本数据,每个样本数据2个特征。可以使用n_samples参数指定样本数据数量。我们将其绘制出来看看:

plt.scatter(X[y==0, 0], X[y==0, 1])
plt.scatter(X[y==1, 0], X[y==1, 1])
plt.show()

可以看到make_moons()默认生成的数据绘制出的图像是两个规整的半月牙曲线。但是作为样本数据有点太规整了,所以我们可以使用noise参数给生成的数据增加一点噪音:

X, y = datasets.make_moons(noise=0.15)

plt.scatter(X[y==0, 0], X[y==0, 1])
plt.scatter(X[y==1, 0], X[y==1, 1])
plt.show()

可以看到,增加了噪音后虽然数据点较之前的分布分散随机了许多,但整体仍然是两个半月牙形状。下面我们就在SVM的基础上使用多项式来看看对这个样本数据决策边界的计算:

from sklearn.preprocessing import PolynomialFeatures, StandardScaler
from sklearn.svm import LinearSVC
from sklearn.pipeline import Pipeline

首先我们需要引入我们用到的几个类:

  • 多项式自然要用到之前讲过的PolynomialFeatures类。
  • 数据归一化需要用到StandardScaler类。
  • 同样需要用到Pipeline将多个过程封装在一个函数里,所以要用到Pipeline类。
閱讀全文 »

这一篇笔记主要讲机器学习算法中一个重要的分类算法,支撑向量机(Support Vector Machine)。它背后有严格的数学理论和统计学理论支撑的,这里我们只对它的原理和应用做以介绍,更深层次的数学理论有兴趣可以查阅其他资料。

什么是SVM

上面的图展示的是一个二分类问题,在逻辑回归的笔记中,我们知道了决策边界,图中橘黄色的直线就是决策边界,它看似很好的将样本数据的不同分类区分开了。我们在多项式回归的笔记中,讲过模型泛化的问题,一个模型的好坏程度很大程度上是体现了模型泛化能力的好坏,也就是对未知样本的预测能力。

如果新来一个样本数据A,按照决策边界划分它是被分为了蓝色分类,可事实真的是如此吗,因为点A和红色分类的点非常近,很有可能点A是属于红色分类的。所以上图中的决策边界可能并不是最优的,那最优的决策边界应该是什么样的呢?

上面的决策边界之所以有缺陷,是因为它和红色类别的点太近了,当然肯定也不能和蓝色的点太近了,所以我们希望这条决策边界离红色分类和蓝色分类都尽可能的远,才能很好的避免上面出现的问题。

想要决策边界离红蓝两个分类都尽可能的远,也就是红蓝分类两边离决策边界最近的点的距离要远,并且两边的点到决策边界的距离要相等,这才说明决策边界是不偏不倚的,如上图所示。

过红蓝两边离决策边界最近的点画两条直线,并且平行于决策边界,那么就确定了一个区域,在这个区域内不应该再有任何数据点出现。那么SVM就是尝试寻找这个区域中间那条最优的决策边界。这个区域边界上的点称为支撑向量,换句话说,是支撑向量定义出了这个区域,那么最优的决策边界也是由支撑向量决定的,这也是支撑向量机这个名称的由来。

如上图所示,由支撑向量确定的区域之间的距离称为Margin。那么SVM要做的事情就是最大化Margin,既将问题转化为了求最优解的问题。

以上对SVM的解释是基于线性可分问题的基础上,也就是能确确实实找到一条直线作为决策边界,这种问题称为Hard Margin SVM,但是很多真实的情况是线性不可分的,这类问题称为Soft Margin SVM,这两类问题都是支撑向量机可以处理的,但基础还是Hard Margin SVM。

閱讀全文 »