《Python机器学习及实践:从零开始通往Kaggle竞赛之路》笔记

第一章 简介篇

1.1 机器学习综述

所谓具备“学习”能力的程序都是指它能够从不断地从经历和数据中吸取经验教训,从而应对未来的预测任务。这种对未知的预测能力叫做泛化力(Generalization)

1.1.1 任务(Task)

监督学习、无监督学习。

监督学习:分类问题、回归问题。

无监督学习:数据降维(Dimensionality Reduction)、聚类问题(Clustering)

1.1.2 经验(Experience)

1.1.3 性能(Performence)

经典的肿瘤分类的栗子。

1.2 Python编程库

NumPy & SciPy、Matplotlib、Scikit-learn、Pandas、Anaconda

1.3 Python环境配置

1.4 Python编程基础

Python数据类型

数字、布尔值、字符串、元组、列表、字典。

基础篇

2.1 监督学习经典模型

  1. 准备训练数据
  2. 抽取所需要的特征,形成特征向量
  3. 把特征向量连同对应的标记/目标一并送入学习算法中,训练出一个预测模型。
  4. 采用同样的特征抽取方法作用于新测试数据,得到用于测试的特征向量。
  5. 使用预测模型对这些待测试的特征向量进行预测并得到结果。

2.1.1 分类学习

最基础的是二分类(Binary Classification)问题,判断是非;除此之外还有多类分类、多标签分类问题。

2.1.1.1 线性分类器
  • 模型介绍:假设特征与分类结果存在线性关系。
    • 为了映射到[0,1]区间上,用逻辑斯蒂函数替换原有函数关系。$g(z)=\cfrac1{1+e^{-z}}$
    • 当使用一组m个用于训练的特征向量X和其对应的分类目标y,我们希望在这组训练集可以取到极大似然估计的概率L($\omega$,b),或者说,至少要在训练集上如此。
  • 数据描述
    • 缺失值问题广泛存在于现实数据中,是ML任务无法回避的问题。
    • 对数据进行预处理。
  • 编程实现
  • 性能测评
    • 准确率(Accuracy)
    • 召回率(Recall)= $\cfrac{(True\ positive)}{(True\ positive) + (False\ negative)}$,正确结果占总发生的数量
    • 精确率(Precision)= $\cfrac{(True\ positive)}{(True\ positive) + (False\ positive)}$,正确结果占总判断对的数量。
    • F1指标(F1 measure) = $\cfrac2{\cfrac1{Precision}+\cfrac1{Recall}}$,两个指标的调和平均数。调和平均数可以对召回率和准确率更加接近的模型给予更高的分数。
    • 对于本例中,我们更关心召回率,就是应该被正确识别的恶性肿瘤的百分比。
  • 特点分析
    • 这里使用的模型包括LogisticRegression和SGDClassifier。
2.1.1.2 支持向量机(分类)
  • 模型介绍
    • 由于分类模型要作用在未知分布的测试数据上,因此我们更关注如何最大限度的为位置分布的数据提供足够的待预测空间
    • 支持向量机分类器(Support Vector Classifier),根据训练样本的分布,搜索所有可能的线性分类器中的最佳的那个。
    • 决定直线位置的是其中两个空间间隔最小的两个不同类别的数据点,把这种可以用来真正帮助决策最优线性分类模型的数据点叫做“支持向量机”。
  • 数据描述
    • 手写数字分类
    • 使用像素矩阵的时候,习惯将2D的图片像素矩阵逐行首尾拼接为1D的像素特征向量。(但是这样会丢失一些结构化的数据)
  • 编程实践
  • 性能测评
    • 多类别性能指标的评估:把其他的类别看作阴性样本,便可以创造出10个二分类任务。
  • 特点分析
    • 可以在海量甚至高维度的数据中,筛选对预测任务最为有效的少数训练样本。节省内存,提高模型的预测性能;但要付出更高的计算代价。
2.1.1.3 朴素贝叶斯(Naive Bayes)
  • 模型介绍

    • 构造的基础是贝叶斯理论
    • 各维度上特征被分类的条件概率之间是独立的。
    • $P(y = c_i |x)$为特征向量x属于类别$c_i$的概率。
    • $$P(y | x) = \cfrac{P(x|y)P(y)}{P(x)}$$
    • 寻找y∈{$c_1$,$c_2$,…,$c_k$}中P(y|x)最大的,考虑到P(x)对于同一个样本都是相同的,因此可以忽略不计。
    • 如果没有特殊假设,需要对$k*2^n$个可能的参数进行估计;但是由于特征类别条件独立假设,只需要估计2kn个参数。
    • 为了估计每个参数的概率,采用$P(x_n=1|y=c_k) = \cfrac{P(x_n=1,y=c_k)}{P(y=c_k)} = \cfrac{(x_n=1,y=c_k)}{(y=c_k)}$公式,把频率近似于概率计算。
  • 数据描述

    • 朴素贝叶斯模型有着广泛的实际应用环境,特别是在文本分类的任务中。

    • 使用经典的20类新闻文本作为实验数据。

      • 1
        2
        3
        from sklearn.datasets import fetch_20newsgroups
        #从互联网下载数据过来
        news = fetch_20newsgroups(subset = 'all')
  • 性能测评

  • 特点分析

    • 广泛应用于互联网文本分类任务。
    • 由于特征条件独立假设,使得估计参数规模大幅度减小
    • 但无法将各个特征之间的联系李考量在内,使得该模型在其他数据特征关联性强的分类任务上性能不佳。
2.1.1.4 K近邻(分类)
  • 模型介绍
    • “近朱者赤,近墨者黑”
    • 最通俗的解释就是:寻找特征空间距离最近的K个已标记样本作为参考。
    • K值的不同,会产生不同的分类器。
  • 数据描述
    • 利用K近邻算法对生物物种进行分类,使用“鸢尾(Iris)”数据集。
    • 在分割数据样本的时候,一定要随机
  • 特点分析
    • K近邻算法没有参数训练的过程,属于无参数模型
    • $O(n^2)$的复杂度
2.1.1.5 决策树
  • 模型介绍:

    • 决策树描述非线性关系。
    • 决策树节点(node)代表数据特征;每个节点下的分支对应特征值的分类;决策树的所有叶子节点(leaf)显示模型的决策结果。
    • 不同特征组合搭建多层决策树的情况,就需要考虑特征节点的选取顺序。常用的度量包括信息熵(Information Gain)基尼不纯性(Gini Imprity)
  • 数据描述

    • 利用泰坦尼克号的数据,预测遇难与生还

    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      import pandas as pd
      titanic = pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')
      titanic.head()
      x = titanic[['pclass','age','sex']]
      In [11]: y = titanic['survived']
      In [12]: x.info()
      <class 'pandas.core.frame.DataFrame'>
      RangeIndex: 1313 entries, 0 to 1312
      Data columns (total 3 columns):
      pclass 1313 non-null object
      age 633 non-null float64
      sex 1313 non-null object
      dtypes: float64(1), object(2)
      memory usage: 30.9+ KB
      #对空缺的数据进行补充。
      In [13]: x['age'].fillna(x['age'].mean(),inplace=True)
  • 特点分析

    • 决策树在模型描述上有巨大的优势。
    • 决策树的推断逻辑非常直观,具有清晰的可解释性,也方便了模型的可视化。
2.1.1.6 集成模型(分类)
  • 模型介绍
    • 综合考量多个分类器的预测结果,从而做出决策。
    • 一种是利用相同的训练数据同时搭建多个独立的分类模型,通过投票的方式,少数服从多数的原则做出最终的分类决策。
      • 随机森林分类器(Random Forest Classifier),在相同训练数据上同时搭建多棵决策树。每一颗决策树随机选取特征。
    • 另一种是按照一定次序搭建多个分类模型。这些模型之间彼此存在依赖关系。每一个后续模型的加入都需要对集成模型的综合性能有所贡献
  • 性能测评
    • 一般而言,工业界经常使用随机森林分类模型作为基线模型(Baseline System)。
  • 特点分析
    • 集成模型是实战中最常用的,可以整合多种模型,或者多次就一种模型进行建模。耗费时间更多,但是往往具有更高的性能和更好的稳定性。

2.1.2 回归预测

2.1.2.1 线性回归器
  • 模型介绍
    • 希望线性回归模型的最小二乘预测的损失。
  • 性能测评
    • 最为直观的:平均绝对误差(Mean Absolute Error, MAE)均方误差(Mean Squared Error, MSE)
    • R-squared评价
      • $SS{res} = \sum\limits{i = 1}^m(y^i-f(\boldsymbol x^i))^2$
      • $R^2 = 1-\cfrac{SS{res}}{SS{tot}}$,$SS{tot}$代表测试数据真实值的方法;$SS{res}$代表回归值与真实值之间的平方差异(回归差异)。
  • 特点分析
    • 简单易用,常被用来作为大多数科学试验的基线系统。
2.1.2.2 支持向量机(回归)
  • 线性核函数
  • 多项式核函数
  • 径向基核函数
2.1.2.3 K近邻(回归)
  • 预测方式
    • 平均回归
    • 根据距离加权回归
2.1.2.4 回归树
  • 模型介绍
    • 回归树节点的数据类型不是离散的,是连续型
  • 特点分析
    • 优点:
      • 树模型可以解决非线性特征的问题。
      • 树模型不要求特征标准化统一量化,即数值型和类别型特征都可以直接被应用在树模型的构建和预测中。
      • 可以直观地输出决策结果。
    • 缺点:
      • 容易因为模型搭建过于复杂而失去对数据预测的精度(泛化力)。
      • 会因为数据细微的改变而发生较大的结构变化,预测稳定性较差。
      • 构建最佳的树模型是NP-hard问题,所以用贪婪算法智能找到一些次优解。
2.1.2.5 集成模型(回归)
  • 模型介绍
    • 极端随机森林(Extremely Randomized Trees):每当构建一棵树的分裂节点的时候,不会任意地选取特征;而是先随机收集一部分特征,然后利用信息熵和基尼不纯性等指标挑选最佳的节点特征。

2.2 无监督学习经典模型

无监督学习不需要对数据进行标记,可以帮助我们发现数据的“群落”,同时也可以寻找“离群”的样本;对于特征维度非常高的数据样本,可以对数据进行降维。

数据聚类

2.2.1.1 K均值算法
  • 模型介绍

    • 最经典、相对容易理解的模型。
    • 步骤:
      1. 随机布设K个特征空间内的点作为初始的聚类中心
      2. 对于每个数据的特征向量,从K个聚类中心中寻找距离最近的一个,并且把这个数据标记为从属于这个聚类中心
      3. 在所有数据都被标记过聚类中心后,根据数据新分配的类簇,重新对中心进行计算。
      4. 如果一轮结束,所有的数据点从属的聚类中心与上一次分配的没有变化,则可以停止。否则循环。
  • 数据描述

  • 性能测评

    • Adjusted Rand Index(ARI),评估的数据本身带有正确的类别信息。

    • 轮廓系数(Silhouette Coefficient),兼顾聚类的凝聚度(Cohesion)和分离度(Separation),取值范围为[-1,1]。

      1. 对于已聚类数据中的第i个样本$x^i$,计算其与同一个类簇内的所有其他样本距离的平均值,记作$a^i$,用来量化凝聚度。
      2. 选取$x^i$外的一个簇b,计算其与b中所有样本的平均距离,遍历所有其他簇,找到最近的这个平均距离,记作$b^i$,用于量化分离度。
      3. 对于样本$x^i$,轮廓系数 $sc^i = \cfrac{b^i - a^i}{max(b^i, a^i)}$
      4. 对所有样本X求出平均值,即为当前聚类结果的整体轮廓系数。

      如果$sc^i$小于0,说明簇内元素的平均距离大于最近的其他簇,聚类效果不好;如果$a^i$趋于0,或者$b^i$足够大,那么$sc^i$趋于1,说明聚类效果比较好。

  • 特点分析

    • 直观易懂非常实用
    • 两大缺陷:
      1. 容易收敛到局部最优解
      2. 需要预先设定簇的数量。
    • “肘部”观察法粗略地预估相对合理的类簇个数。利用拐点的特性判断K值。

2.2.2 特征降维

特征维度非常高,无法借助领域知识人工构建有效特征;

无法用肉眼观察超过三个维度的特征。

2.2.2.1 主成分分析(Principal Component Analysis)
  • 模型介绍
    • 首先把原来的特征空间做映射,使的新的映射后特征空间数据彼此正交,这样可以通过主成分分析保留下具备区分性的低维数据特征。
    • 会损失一定的预测准确性,但是使用PCA可以压缩并降低维度。
  • 特点分析
    • 降维/压缩问题是选取数据具有代表性的特征,在保持数据多样性的基础上,规避掉大量的特征荣冗余和噪声。

进阶篇

3.1 模型实用技巧

并不能保证:

  1. 所有用于训练的数据特征都是最好的
  2. 学习得到的参数一定是最优的
  3. 默认配置下的模型总是最佳的

3.1.1 特征提升

特征抽取:逐条将原始数据转化为特征向量的形式,这个过程同时涉及对数据特征的量化表示;而特征筛选更进一步,在高维度、已量化的特征向量中选择对制定任务更有效的特征组合,提升性能。

3.1.1.1 特征抽取
  • 对于文字等类型的数据,不能直接处理,需要抽出成特征向量。
    • 结构化的数据,可以改成用0/1表示。
    • 词袋法(Bag of Words)
    • 词表(Vocabulary)
  • 特征数值的计算
    • CountVectorizer
      • 只考虑每种词汇在该条训练文本中出现的频率
    • TfidfVectorizer
      • 还包括这个词汇的文本条数的倒数(比如the可能就没那么重要,这种词成为停用词Stop Words
      • 停用词往往就被压制掉了
3.1.1.2 特征筛选

特征筛选与PCA对特征的重建略有不同:对于PCA而言,无法解释重建后的特征;但特征筛选不存在对特征值的修改,更加侧重于寻找那些对模型的性能提升较大的少量特征。

3.1.2 模型正则化

泛化力(Generalization)

3.1.2.1 欠拟合与过拟合
3.1.2.2 $L_1$范数正则化

正则化(Regularization)的目的在于提高模型在未知测试数据上的泛化力,避免过拟合。

在原优化目标的基础上,增加了参数向量的$L_1$范数,增加对参数的惩罚(Penalty)项。这样会让参数向量中的许多元素趋近于0,使大部分特征是去优化目标的贡献。被称为Lasso

3.1.2.3 $L_2$范数正则化

会让参数向量中的大部分元素都变得很小,压制了参数之间的差异性。称为Ridge

3.1.3 模型检验

3.1.3.1 留一验证
3.1.3.2 交叉验证

交叉验证(K-fold cross-validation)可以理解为从事了多次留一验证的过程。

3.1.4 超参数搜索

超参数的选择是无数的,我们也可以通过启发式的搜索方式对超参数组合进行调优。

3.1.4.1 网格搜索(GridSearch)
3.1.4.2 并行搜索

多线程并行搜索技术进行调优。

3.2 流行库/模型实践

3.2.1 自然语言处理包(NLTK)

3.2.2 词向量(Word2Vec)技术

3.2.3 XGBoost模型

利用多线程模型进行计算

3.2.4 Tensorflow

一个编程框架,另一个小东西叫skflow

  • 深度神经网络DNN:
    • 小心过拟合的问题

实战篇

4.1 Kaggle平台

提供数据分析及预测模型的竞赛平台。

  • kaggle提供可以线上编程的云平台,但资源有限,只有512MB的硬盘和20分钟的运算时间。
  • Kaggle会采用历史最好成绩做出最终的排名。

4.2 Titanic罹难乘客预测

4.3 IMDB影评得分估计

标有情感倾向的训练文件来进行预测。

倾向于自然语言处理(NLP)的内容。

4.4 MNIST手写体数字图片识别