机器学习笔记

数学知识

  • 线性代数: 矩阵/张量乘法、求逆,奇异值分解/特征值分解,行列式,范数等;
  • 统计与概率: 概率分布,独立性与贝叶斯,最大似然(MLE)和最大后验估计(MAP)等;
  • 信息论: 基尼系数,熵(Entropy)等;
  • 优化: 线性优化,非线性优化(凸优化/非凸优化)以及其衍生的求解方法如梯度下降、牛顿法、基因算法和模拟退火等;
  • 数值计算: 上溢与下溢,平滑处理,计算稳定性(如矩阵求逆过程);
  • 微积分: 偏微分,链式法则,矩阵求导等;

评估方法

  • 留出法

    “留出法”(hold-out)直接将数据集D划分为两个互斥的集合,分别作为训练集S和测试集T,即D=S υ T,S ∩ T=Φ。在S上训练出模型后,用T来评估其测试误差,作为对泛化误差的估计。常见做法是将大约2/3~4/5的样本用于训练,剩余样本用于测试。

  • 交叉验证法

    “交叉验证法”(cross validation)先将数据集D划分为k个大小相似的互斥子集,即,
    每个子集Di都尽可能保持数据分布的一致性,即从D中通过分层采样得到,然后,每次用k-1个子集的并集作为训练集,余下的那个子集作为测试集这样就可获得k组训练/测试集,从而可进行k次训练和测试,最终返回的是这k个测试结果的均值。通常把此过程称为“k折交叉验证”(k-fold cross validation)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Examples
--------
>>> import numpy as np
>>> from sklearn.cross_validation import train_test_split
>>> X, y = np.arange(10).reshape((5, 2)), range(5)
>>> X
array([[0, 1],
[2, 3],
[4, 5],
[6, 7],
[8, 9]])
>>> list(y)
[0, 1, 2, 3, 4]

>>> X_train, X_test, y_train, y_test = train_test_split(
... X, y, test_size=0.33, random_state=42)
...
>>> X_train
array([[4, 5],
[0, 1],
[6, 7]])
>>> y_train
[2, 0, 3]
>>> X_test
array([[2, 3],
[8, 9]])
>>> y_test
[1, 4]
  • 自助法

支持向量机

支持向量机通俗导论(理解SVM的三层境界)

决策树

决策树算法原理上
决策树算法原理下

ID3算法(信息增益)的不足

熵度量了事物的不确定性,越不确定的事物,它的熵就越大
a) ID3没有考虑连续特征,比如长度,密度都是连续值
b) 在相同条件下,取值比较多的特征比取值少的特征信息增益大
c) ID3算法对于缺失值的情况没有做考虑
d) 没有考虑过拟合的问题

C4.5算法(信息增益比)改进

a) 不能处理连续特征, C4.5的思路是将连续的特征离散化
b) 引入一个信息增益比的变量IR(X,Y),它是信息增益和特征熵的比值
c) 一是在样本某些特征缺失的情况下选择划分的属性,二是选定了划分属性,对于在该属性上缺失特征的样本的处理
d) 引入了正则化系数进行初步的剪枝

C4.5算法的不足

1) 决策树算法非常容易过拟合,因此对于生成的决策树必须要进行剪枝
2) C4.5生成的是多叉树,即一个父节点可以有多个节点。很多时候,在计算机中二叉树模型会比多叉树运算效率高。如果采用二叉树,可以提高效率
3) C4.5只能用于分类,如果能将决策树用于回归的话可以扩大它的使用范围
4) C4.5由于使用了熵模型,里面有大量的耗时的对数运算,如果是连续值还有大量的排序运算。如果能够加以模型简化可以减少运算强度但又不牺牲太多准确性的话,那就更好了。

CART算法(基尼系数)

基尼系数代表了模型的不纯度,基尼系数越小,则不纯度越低,特征越好

决策树优缺点

  • 决策树算法的优点:

    1)简单直观,生成的决策树很直观。
    2)基本不需要预处理,不需要提前归一化,处理缺失值
    3)使用决策树预测的代价是O(log2m)。 m为样本数。
    4)既可以处理离散值也可以处理连续值。很多算法只是专注于离散值或者连续值。
    5)可以处理多维度输出的分类问题。
    6)相比于神经网络之类的黑盒分类模型,决策树在逻辑上可以得到很好的解释
    7)可以交叉验证的剪枝来选择模型,从而提高泛化能力。
    8) 对于异常点的容错能力好,健壮性高。

  • 决策树算法的缺点:

    1)决策树算法非常容易过拟合,导致泛化能力不强。可以通过设置节点最少样本数量和限制决策树深度来改进。
    2)决策树会因为样本发生一点点的改动,就会导致树结构的剧烈改变。这个可以通过集成学习之类的方法解决。
    3)寻找最优的决策树是一个NP难的问题,我们一般是通过启发式方法,容易陷入局部最优。可以通过集成学习之类的方法来改善。
    4)有些比较复杂的关系,决策树很难学习,比如异或。这个就没有办法了,一般这种关系可以换神经网络分类方法来解决。
    5)如果某些特征的样本比例过大,生成决策树容易偏向于这些特征。这个可以通过调节样本权重来改善。

随机森林示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 随机森林

from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
import pandas as pd
import numpy as np

iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['is_train'] = np.random.uniform(0, 1, len(df)) <= .75
df['species'] = pd.Categorical.from_codes(iris.target, iris.target_names)

train, test = df[df['is_train']==True],d df[df['is_train']==False]

features = df.columns[:4]
clf = RandomForestClassifier(n_jobs=2)
y, _ = pd.factorize(train['species'])
clf.fit(train[features], y)

preds = iris.target_names[clf.predict(test[features])]
pd.crosstab(test['species'], preds, rownames=['actual'], colnames=['preds'])

# test = test.copy()
# test.loc[:,'pred'] = preds