机器学习笔记¶
本人学习机器学习的笔记,重点记录对一些概念的简单理解,不会太涉及具体的代码实现以及数学推导。 目前包含的的图书有
- 实用机器学习(Real-World Machine Learning) ISBN 978-7-111-56922-0
- 将随着自己的学习逐步添加
特征选择¶
平衡特征集数量的实用方法¶
- 包含所有你认为对目标变量有预测的特征。选择一种模型,如果准确性足够,则停止。
- 否则,扩大特征集,包含关系较弱的一些。选择另一模型并评估准确性。性能足够,则停止
- 否则,从扩大的特征集开始,运行特征选择算法来选择最好的、最有预测性的特征集的子集
特征工程 —— 时间¶
时间日期基础特征¶
- 一天中的几点
- 一周中的第几天
- 一年中的第几个月
- 一小时中的第几分钟
- 一年中的第几季度
经典时间序列(每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) —— 描述隐藏状态中抽取时间序列的观测值的概率模型,遵循马尔可夫过程
可以被用于: * 把模型的预测值(和预测差异)作为特征 * 把每个模型的最佳参数作为特征 * 计算模型你拟合的统计值(如均方误差)作为特征
特征工程——文本¶
需要注意,大部分的机器学习算法不能很好的处理稀疏数据
词袋模型¶
划分和转换 (tokenization and transformation)
向量化
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)
- 通过词袋计数,构建词语-文档模型,行为属于,列为文档
- tf-idf或其他标准化方法,避免高频词,获得最值得词语-文档矩阵\(A\)
- 奇异值分解(SVD),将词语-文档\(A\)分解为\(T\)术语-概念矩阵 \(S\)奇异值 \(D\)概念-文档矩阵
- 选择最顶端的\(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是图像的解析度\)
高级形状特征
skimgae.feature.hog
当图像中的物体方向变化太大时,HOG工作得不好
降维
主成分分析(PCA), 新图片的特征由与主成分图像的“距离”产生,可以用与每个主成分图像相关的数字表示。 为了使问题更有意义,可以使用尽可能多的主要成分
*PCA是线性算法*, 不能表示本质上是非线性的数据。由很多PCA的拓展和其他非线性的降维方式,如扩散映射(diffusion maps)
参数调优¶
强力网络搜索(grid search)¶
- 选择要最大化的评价指标
- 选择算法
- 选择需要调整的参数,以及每个参数的一组测试值
- 定义调整参数数组之间的笛卡尔积作为网络。例如,参数1为[50,100,1000], 参数2位[10,15],则网络为[(50,10),(50,15),(100,10),(100,15),(1000,10),(1000,15)]。即以需要调整的参数构成不同坐标轴构成的网格
- 对每一个组合,进行训练预测计算评价指标
- 选择指标最大化的参数组合
可以通过搜索网格的等高线来判断和调整网格参数

4-25 网格等高线
- 最大值在网格的边界, 必须扩大网格重新开始
- 可判断出某个参数高度敏感(如图中gamma), 需要增加该参数的力度
- 最大值出现在0附件(图中gamma), 以指数标识(如\(10^{-4}\)、\(10^{-3}\)、\(10^{-2}\)、\(10^{-1}\))表示更明智
模型评估——分类¶
通过绘制决策边界对分类器可视化十分有利,给定两个特征就可以绘制出分类边界
ROC曲线与AUC指标¶
通常将AUC直接画到ROC曲线图上

模型评估——回归¶
画出预测值和真实值的散点图是评估指标的基础。 对角线为最佳模型
指标¶
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}\)
评价指标应尽量与要解决的问题保持一致
总览¶
算法名称 | 类型 | 应用 | 线性/非线性 | 是否需要规范化 | 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 |