机器学习笔记

本人学习机器学习的笔记,重点记录对一些概念的简单理解,不会太涉及具体的代码实现以及数学推导。 目前包含的的图书有

  • 实用机器学习(Real-World Machine Learning) ISBN 978-7-111-56922-0
  • 将随着自己的学习逐步添加

数据可视化

_images/2-11.png

马赛克图(Mosaic plots)

  1. 如果没有关系, 则水平分割大体在Y轴的未知(所有的分割线在一条平行直线上)。若存在强关系,则水平分割将会很多。
  2. 大负残差(低于期望值)以深色阴影表示, 大正残差(高于期望)以浅色阴影表示
_images/2-13.png

盒图(Box plots)

四分位图(quartile): 最小值,25%,中间值,75%和最大值

单个变量的盒图对于分布中心、扩展和偏移十分有用,还可以发生离群值的存在
并行显示,可以比较分布情况

当发现分布高度偏移(离群值多),则需要进行简单的转换(如平方根)

_images/2-14.png

密度图(Density plots)

密度图在可视化单数字多分布式比较容易。
需要留意密度图中的次要“起伏”,对他们的研究可保证充分理解他们的性质,并作为特征工程进一步的指导
_images/2-16.png

散点图(Scatter plots)

_images/2-17.png

数据预处理

缺失数据处理

_images/2-9.png

特征选择

平衡特征集数量的实用方法

  1. 包含所有你认为对目标变量有预测的特征。选择一种模型,如果准确性足够,则停止。
  2. 否则,扩大特征集,包含关系较弱的一些。选择另一模型并评估准确性。性能足够,则停止
  3. 否则,从扩大的特征集开始,运行特征选择算法来选择最好的、最有预测性的特征集的子集

前向选择

对于较小的特征集,或者需要允许的循环次数较少时(如,模型准确性增长迅速、平稳),在实用中还是很有效的

_images/5-9.png

反向消除

有些算法,对于太小的特征集表现不佳,反向消除是较好的选择

_images/5-10.png

特征选择的可视化方法

画出执行过程的垂直条形图

_images/5-11.png

特征工程 —— 时间

时间日期基础特征

  1. 一天中的几点
  2. 一周中的第几天
  3. 一年中的第几个月
  4. 一小时中的第几分钟
  5. 一年中的第几季度

经典时间序列(每xx, xx内)

简单特征

直接忽略时间轴,只分析测量的分布 1. 平均值 —— 可以提示时间序列平均值趋势的平均值或中间值 1. 扩散值 —— 分布的扩散性, 如标准差、平均绝对偏差或四分位差,可以反映测量的整体变化趋势 1. 离散值 —— 正常范围外的频率(如比平均大两倍、3倍或4倍的标准差),在很多情况下有很强的预测能力 1. 分布性 —— 时间序列测量的边缘分布的高阶特效估计(如偏差或峰度),或者更进一步对命名分布进行统计测试(如标准或统一性),在某些情况下比较有预测力

计算窗口统计:指定时间窗口内的前汇总指标
窗口差异:一个窗口到下一个窗口的差异

高级特性

1-自相关特性: 原时间序列与自身左移一个时间空格(没有重叠的部分被移除)的时间序列相关联。 Python StatsModels模块

傅里叶分析(Fourier analysis): 常用工具,将时间序列分解为一系列频率下的正弦和余弦函数的和,可以发现周期性结构。时间序列的分解结果是其自身的分量频谱密度,称为周期图(periodogram)。scipy.signal.periodogram。可以通过取最值,某个阈值的比例之类的方式提取特征。

经典时间序列模型把时间序列中的每个值描述成时间序列过去值得函数: * 自回归(AR)模型 —— 每个值被建模成最后\(p\)个值得线性组合,\(p\)是要估计的自由参数 * 自回归移动平均(ARMA)模型 —— 每个值为AR模型与移动平均(MA)模型的和, MA模型是前\(q\)年误差项的线性组合 * CARCH模型 —— 使用ARMA描述时间序列中的随机噪音,财务常用 * 隐马尔可夫模型(HMM) —— 描述隐藏状态中抽取时间序列的观测值的概率模型,遵循马尔可夫过程

可以被用于: * 把模型的预测值(和预测差异)作为特征 * 把每个模型的最佳参数作为特征 * 计算模型你拟合的统计值(如均方误差)作为特征

点过程(也称事件流)

计算简单的窗口和统计差异

用泊松过程和非齐次泊松过程来描述即将到来的时间发生率h

特征工程——文本

需要注意,大部分的机器学习算法不能很好的处理稀疏数据

词袋模型

划分和转换 (tokenization and transformation)

tokenization
拆分后每个分组称为n-grams. 2个组合bigrams, 3个组合trigrams是出了单个unigrams之外常用的组合
transformation
处理大小写,取词干(stemming)、自定义数字、标点符号和特征字符处理等

向量化

Tips:通常删除终止词的做法是,删除出现次数高于阈值的所有单词(典型选择是90%)

主题建模

词频逆向文件频率(tf-idf)

\(tf - idf(term, doc, docs) = count(term in doc)\frac{count(docs)}{count(docs with term)}\)

tf计次的常用方法有:

  • 单词在文档中出现的次数
  • 二进制版,出现记1,否则为0
  • 对数版 (\(1 + \log[tf]\))

潜在语义索引LSI (或称潜在语义分析LSA)

  1. 通过词袋计数,构建词语-文档模型,行为属于,列为文档
  2. tf-idf或其他标准化方法,避免高频词,获得最值得词语-文档矩阵\(A\)
  3. 奇异值分解(SVD),将词语-文档\(A\)分解为\(T\)术语-概念矩阵 \(S\)奇异值 \(D\)概念-文档矩阵
  4. 选择最顶端的\(N\)个奇异值,取\(D\)中对应的行产生\(N\)个特征

对于新文档, \(D = A^TTS^{-1}\)产生新的特征, 其中\(A^T\)为使用字典对新文档的单词计数(或tf-idf)

概率方法(probablilistic methods)

pLSA是用概率对LSA进行模拟,一个广泛使用的版本是潜在狄利克雷分析(LDA),它基于一个假设:文档可以由较小的主题集进行描述,以及任意术语(单词)都可以归结为一个主题。 在实际使用中对于各种数据集LDA都表现的很好。

内容拓展

跟踪链接

通过深入跟踪文本中的web链接构建更大的文本语料库

基于知识的拓展

检测文本中的命名实体,并利用在线的命名实体知识库来扩展原始文本信息。

文本元特征(meta-features)

如主题标签,收藏zhuan’fa’shu

特征工程——图像特征

简单特征

直接将像素和颜色信息转为数组

颜色特征

计算每种颜色通道中简单的统计值, 如平均值、中值、色调、标准差、偏度和峰度。 对于RGB就有\(6\times3=18\)个特征

色彩范围

颜色范围 定义
红色范围(red range) 红色通道中最大值减去最小值的差值
红蓝范围(red-to-blue range) \(红色范围 / (蓝色通道中最大值减去最下值+1)\)
蓝绿范围(blue-to-green range) \((蓝色通道中最大值减去最下值)/(路色通道中最大值减去最下值+1)\)
红绿范围(red-to-green range) \(红色范围/(路色通道中最大值减去最下值+1)\)

图像元数据特征

特征 定义
制造商(manufacturer) 相机制造商
方向(orientation) 照相机的方向(横向或纵向)
日期-时间(date-time) 拍摄时间(可用日期时间的相关提取方式)
压缩方式(compression) 图像的压缩方式(JPEG或未压缩)
解析度(resolution) 在宽高空间中像素的数量
长宽比(aspect ratio) 通过划分高度和宽度分辨率表示的度量
曝光时间(exposure time) 曝光秒数
光圈(aperture) 表示光圈的\(f\)值(如2.8或4.0)
闪光灯(flash light) 闪光灯是否打开
焦距(focal length) 镜头到焦点的距离

提取物体和形状

边缘检测

常用Sobel和Ganny边缘检测算法, 可使用scikit-image库来完成

提取到边缘之后,最简单的特征是计算边缘数目(也可计算局部边缘数目),计算公式:

\(edge\_score = \frac{\sum edges}{res_x \times res_y},其中edges是边缘图像,res是图像的解析度\)

高级形状特征

方向梯度直方图(HOG),常同来检测图片中的人脸和特定动物
可以直接使用skimgae.feature.hog

当图像中的物体方向变化太大时,HOG工作得不好

降维

主成分分析(PCA), 新图片的特征由与主成分图像的“距离”产生,可以用与每个主成分图像相关的数字表示。 为了使问题更有意义,可以使用尽可能多的主要成分

*PCA是线性算法*, 不能表示本质上是非线性的数据。由很多PCA的拓展和其他非线性的降维方式,如扩散映射(diffusion maps)

参数调优

模型评估——分类

通过绘制决策边界对分类器可视化十分有利,给定两个特征就可以绘制出分类边界 3-7 决策边界

混淆矩阵(Confusion matrix)

_images/4-14.png
_images/4-19.png

ROC曲线与AUC指标

ROC曲线:FPR(假正率)为X轴,TPR(真正率)为Y轴。由不同阈值为点所构成的曲线
AUC: ROC曲线的线下面积, 越大分类效果越好

通常将AUC直接画到ROC曲线图上

_images/4-20.png

模型评估——回归

画出预测值和真实值的散点图是评估指标的基础。 对角线为最佳模型 4-22 散点图

指标

RMSE(均方根误差,MSE的平方根)。优点是结果与计算的值有相同的单位,缺点是和问题规模有关,不容易在不同的数据集上进行比较

\(RMSE = \frac{1}{\sqrt{n}}\sqrt{\sum [y_i - f(x_i)]^2} = \sqrt{\frac{散点图中点到模型线的距离的平方和}{测试集数量}}\)

\(R^2\)指标:具有相对性,在0~1之间。模型越好,越接近1

\(R^2 = \frac{\sum [y_i - f(x_i)]^2}{\sum [y_i - mean(y)]^2}\)

评价指标应尽量与要解决的问题保持一致

检验残差

残差: 预测值与真实值之间的距离。理想的残差值在0附近分布均匀

_images/4-24.png

总览

算法名称 类型 应用 线性/非线性 是否需要规范化 scikit-learn
线性回归(linear regression) 回归 对一个或多个数量的特征对标量目标进行建模。 虽然回归计算线性组合,但如果特征与目标间的关系已知或可以猜测,则特征可以通过非线性函数进行转换. 线性 .linear_model.LinearRegression
逻辑回归(logistic regression) 分类 基于数量特征对观测值进行分类,预测目标类别或目标类别的概率. 线性 .linear_model.LogisticRegression
SVM 分类/回归 基于高维空间分离的分类,预测目标分类,目标分类的概率需要另外计算。使用部分数据进行回归,性能高度依赖于数据. 线性 .svm
核函数SVM(SVM with kernel) 分类/回归 支持多种非线性模型的支持向量机 非线性 .svm
K-近邻算法(k-nearest neighbors) 分类/回归 通过训练集与测试样本之间的“最短距离”(如欧氏距离)计算目标变量。对于分类,由训练目标进行“投票”。对于回归,计算训练目标的平均值。预测基于数据的一个”局部”子集,但对于某些数据集精度很高 非线性 .neighbors.KNeighborsClassifier
.neighbors.KNeighborsRegressor
决策树(decision tree) 分类/回归 基于测试数据的属性值把训练数据迭代的分成数据子集,并产生预测目标的决策树。产生易于理解的模型,但随机森林和增强算法的错误率更低 非线性 .tree.DecisionTreeClassifier()
.tree.DecisionTreeRegressor()
随机森林(random forest) 分类/回归 决策树的“集合”用于产生比单个决策树更强的预测,对于分类,多个决策树进行“投票”。对于回归,对他们的结果求平均 非线性 .ensemble.RandomForestClassifier
.ensemble.RandomForestRegressor
增强算法(boosting) 分类/回归 对于多数方法,增强算法通过调整权值降低泛化错误,对于误分类或(对于回归)较大残差的样本加大权重 非线性 .ensemble.GradientBoostingClassifier
.ensemble.GradientBoostingClassifier
朴素贝叶斯算法(Native Bayes) 分类 一个简单的、可拓展的分类算法,适用于文本分类任务(如垃圾邮件分类)。它假定特征间都是互相独立的(因此称为朴素的),但事实上这种情况很少,但算法在特定的场合工作得很好。它利用贝叶斯定力,但不是统计领域中使用的“贝叶斯” 非线性 .naive_bayes
神经网络(neural network) 分类/回归 用于通过反向传播算法来估计基于大量输入的未知函数。通常比其他方法更复杂,计算量更大,但是对于一般的问题更强大 非线性 .neural_network
XGBoost 分类/回归 增强决策树算法的高度优化和可拓展版本
http://xgboost.readthedocs.io/en/latest/
Vowpal Wabbit 分类/回归 结合了各种算法的在线机器学习程序,不要求所有数据驻留内存,以快速处理大数据著称。只有一种输入格式,并且通常以命令行的方式运行。
https://github.com/JohnLangford/vowpal_wabbit/wiki/Tutorial

Tips

对数概率

发生率 \(Odds(A) = P(A)/P(~A) = A的概率/非A的概率\)

\(\log(Odds(A))\)即为A的对数概率

对数概率接近\(-\infty\)表示不可能事件,接近\(\infty\)表示明确发生。:math:`=0`表示明为随机事件

对数概率不像概率被限定在\([0,1]\)之间, 使计算变的更简单。