机器学习中典型工作流程

读取和清洗数据

将现实世界中得到的数据(如文本和图像)格式化为算法可以处理的格式(数字特征)。

见另一篇Blog:

机器学习中样本数据预处理

一句话,数据决定了你的任务是成功和失败。

探索和理解输入数据

通常需要统计学和基础数学知识,引入一个概念:探索性数据分析(Exploratory Data Analysis, EDA )。

见Blog:

机器学习探索性数据分析

分析如何最好的将数据呈现给学习算法

特征工程(feature engineering)

一个简单算法在精心选择的特征上的效果要比一个漂亮算法在较差的特征上的效果还要好

通常好特征的目标是在重要的地方取不同值,而在不重要的地方不变。有时需要借助背景知识通过直觉来判断哪些是好特征。能否自动地把好特征选出来 -> 特征选择(feature selection)

删除低方差的特征
from sklearn.feature_selection import VarianceThreshold
单变量特征选择
from sklearn.feature_selection import SelectKBest
X_new = SelectKBest(chi2, k=2).fit_transform(X, y)

scikit-learn:
- 回归: f_regression, mutual_info_regression
- 分类: chi2, f_classif, mutual_info_classif

递归特征消减

给定一个外部估计器,它为特征赋值(例如,线性模型的系数),递归特性消除(RFE)是通过递归地考虑越来越小的特性集来选择特性。首先,评估人员在初始的特性集上进行训练,并且通过一个coef_属性或通过一个feature_importances_属性获得每个特性的重要性。然后,最不重要的特性从当前的特性集中删除。这个过程在修剪器上递归地重复,直到最终达到所需的特特征数量。

通过模型进行特征选择
  • L1-based feature selection

  • Tree-based feature selection

将特征选择嵌入pipeline
from sklearn.feature_selection import SelectFromModel
from sklearn.svm import LinearSVC
from sklearn.ensemble import RandomForestClassifier

clf = Pipeline([
  ('feature_selection', SelectFromModel(LinearSVC(penalty="l1"))),
  ('classification', RandomForestClassifier())
])
clf.fit(X, y)

使用sklearn.svm.LinearSVC与sklearn.feature_selection.SelectFromModel结合来评估要素重要性并选择最相关的特征。

选择正确的模型和学习算法

基础概念:
  • 泛化能力(generalization ability)是指学习方法对未知数据的预测能力。
  • 过拟合(over-fitting)是指学习时选择的模型所包含的参数过多,以致于出现这一模型对已知数据预测的很好,但对于未知数据预测的很差的现象。可以说模型选择旨在避免过拟合并提高模型的预测能力。
  • 正则化(regularization)是模型选择的典型方法。是结构风险最小化策略的实现,在经验风险上加上一个正则化项或罚项。
  • 奥卡姆剃刀(Occam’s razor)应用于模型选择:在所有可能选择的模型中,能够很好地解释一直数据并且简单的才是最好的模型。
  • No Free Lunch:一种算法只是针对某一问题来说是最好的。

深思熟虑,权衡性能和功能。统计学习方法三要素:

  • 模型(model):所要学习的条件概率分布P(Y|X)或决策函数Y=f(X)
  • 策略(strategy):损失函数和风险函数
  • 算法(algorithm):最优化
Pipeline

这可以用来将多个估计量链化合一。因为在处理数据时,通常有着一系列固定的步骤,比如特征选择、归一化和分类,此时这个方法将非常有用。

>>> from sklearn.pipeline import Pipeline
>>> text_clf = Pipeline([('vect', CountVectorizer()),
...                      ('tfidf', TfidfTransformer()),
...                      ('clf', MultinomialNB()),
... ])

>>> text_clf.fit(twenty_train.data, twenty_train.target)
GridSearch

超参数在参数估计中是不直接学习的,在scikit-learn库中,超参数会作为参数传递给估计类的构造函数,然后在超参数空间中搜索最佳的交叉验证分数在构建参数估计量时提供的任何参数都是可以用这种方式进行优化的。

>>> from sklearn.model_selection import GridSearchCV
>>> parameters = {'vect__ngram_range': [(1, 1), (1, 2)],
...               'tfidf__use_idf': (True, False),
...               'clf__alpha': (1e-2, 1e-3),
... }

>>> gs_clf = GridSearchCV(text_clf, parameters, n_jobs=-1)
>>> gs_clf = gs_clf.fit(twenty_train.data, twenty_train.target)

正确的评估性能

基础概念:
  • 训练集(training set)用于运行你的学习算法。
  • 开发集(development set)用于调整参数,选择特征,以及对学习算法作出其它决定。有时也称为留出交叉验证集(hold-out cross validation set)。
  • 测试集(test set)用于评估算法的性能,但不会据此决定使用什么学习算法或参数。

开发集和测试集的使命就是引导你的团队对机器学习系统做出最重要的改变。合理地设置开发集和测试集,使之近似模拟可能的实际数据情况,并处理得到一个好的结果。

建立开发集和测试集
  • 选择作为开发集和测试集的数据,应当与你预期在将来获取并良好处理的数据有着相同的分布,但不需要和训练集数据的分布一致。
  • 开发集和测试集的分布应当尽可能一致。
  • 为你的团队选择一个单值评估指标进行优化。需要考虑多项目标时,不妨将它们整合到一个表达式里(比如对多个误差指标取平均),或者定义满意度指标和优化指标。
  • 机器学习是一个高速迭代的过程:在最终令人满意的方案出现前,你可能要尝试很多想法。
  • 拥有开发集、测试集和单值评估指标可以帮你快速评估一个算法,从而加速迭代过程。
  • 当你探索一个全新的应用时,尽可能在一周内建立你的开发集、测试集和指标,而在成熟的应用上则可以花费更长的时间。
  • 传统的 70% / 30% 训练集/测试集划分对大规模数据并不适用,实际上开发集和测试集的比例会远低于 30%。
  • 开发集的规模应当大到能够检测出算法精度的细微改变,但也不用太大;测试集的规模应该大到能够使你对系统的最终性能作出一个充分的估计。
  • 当开发集和评估指标不再能给团队一个正确的导向时,就尽快修改它们:(i) 如果你在开发集上过拟合,则获取更多的开发集数据。(ii) 如果开发集和测试集的数据分布和实际关注的数据分布不同,则获取新的开发集和测试集。 (iii) 如果评估指标不能够对最重要的任务目标进行度量,则需要修改评估指标。
留存数据和交叉检验

我们真正想做的事情是衡量模型对新样本的泛化能力。所以,应该使用训练中未出现的数据来评估模型的性能。

  • 留存数据:将数据分成两部分,一部分用于训练模型,一部分用于测试模型效果
  • 交叉验证(cross-validation): 如K折交叉验证,把数据分成K份,每次训练分别把其中一份数据拿出去,在留存数据上测试这些模型的效果,最后取平均值。生成数据折的时候,需要谨慎地保持数据分布的平衡
    • 去一法(leave-one-out):交叉验证的一个极端。从训练集中拿出一个样本,并在缺少这个样本的数据上训练一个模型,然后看模型是否能对这个样本正确分类。主要问题是针对每个样本都需要学习一个全新的模型,工作量随数据量变大而增加。
实践指导:
  • 开发集和测试集应该服从同一分布
  • 使用单值评估指标进行优化。当你在多个分类器之间进行抉择时,使用单值评估指标将帮助你更快速地作出决定。它能给出一个清楚的分类器性能排名,从而帮助明确团队后续的处理方向。
  • 优化指标和满意度指标。如:在限定的运行时间(满意度指标)范围内最大化分类器的准确率(优化指标)。或许会考虑设置N-1个“满意度”指标,即要求它们满足一定的值,然后定义一个“优化”指标。
  • 误差分析:根据开发集样本评估想法。误差分析(Error Analysis) 指的是检查算法误分类的开发集样本的过程,以便你找到造成这些误差的原因。这将帮助你确定项目优先级并且获得关于新方向的灵感。

机器学习初学者常犯错误的地方,如:
- 使用了与训练相同的数据来测试你的方法(简单的错误)
- 使用了不平衡的训练数据(Hard)


任何复杂系统都是由基础工程构成的,尤其是算法出现问题时,增量地搭建系统可以确保我们及时找出问题出现的位置和原因。

机器学习实践:
- 把精力从算法转移到数据上(也不尽然,这是从数据挖掘的角度上来谈的)
- 正确设置实验的重要性

《Building Machine Learning Systems with Python》

《Machine Learning in Action》

《Machine Learning Yearning》

http://blog.kaggle.com

http://scikit-learn.org/stable/

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值