前言
本文由Searchmetrics公司高级数据科学家Abhishek Thakur提供。
一个中等水平的数据科学家每天都要处理大量的数据。一些人说超过60%到70%的时间都用于数据清理、数据处理及格式转化,以便于在之后应用机器学习模型。这篇文章的重点便在后者—— 应用机器学习模型(包括预处理的阶段)。此文讨论到的内容来源于我参加的过的数百次的机器学习竞赛。请大家注意这里讨论的方法是大体上适用的,当然还有很多被专业人士使用的非常复杂的方法。
接下来会使用到python。
数据
在应用机器学习模型之前,所有的数据都必须转换为表格形式。如下图所示,这个过程是最耗时、最困难的部分。
此处输入图片的描述
转换完成之后,便可以将这些表格数据灌入机器学习模型。表格数据是在机器学习或是数据挖掘中最常见的数据表示形式。我们有一个数据表,x轴是样本数据,y轴是标签。标签可以是单列可以是多列,取决于问题的形式。我们会用X表示数据,y表示标签。
标签的种类
标签会定义你要解决何种问题,有不同的问题类型。例如:
单列,二进制值(分类问题,一个样本仅属于一个类,并且只有两个类)
单列,实数值(回归问题,只预测一个值)
多列,二进制值(分类问题,一个样本属于一个类,但有两个以上的类)
多列,实数值(回归问题,多个值的预测)
多个标签(分类问题,一个样本可以属于几个类)
评估指标
对于任何类型的机器学习问题,我们都一定要知道如何评估结果,或者说评估指标和目的是什么。举例来说,对于不均衡的二进制分类问题,我们通常选择受试者工作特征曲线下面积(ROC AUC或简单的AUC);对于多标签或多类别的分类问题,我们通常选择分类交叉熵或多类对数损失;对于回归问题,则会选择均方差。
我不会再深入的讲解不同的评估指标,因为根据问题的不同会有很多不同的种类。
库
开始尝试机器学习库可以从安装最基础也是最重要的开始,像numpy和scipy。
查看和执行数据操作:pandas(http://pandas.pydata.org/)
对于各种机器学习模型:scikit-learn(http://scikit-learn.org/stable/)
最好的gradient boosting库:xgboost(https://github.com/dmlc/xgboost)
对于神经网络:keras(http://keras.io/)
数据绘图:matplotlib(http://matplotlib.org/)
监视进度:tqdm(https://pypi.python.org/pypi/tqdm)
Anaconda操作简单而且帮你准备好了这些,可是我没有使用,因为我习惯自己配置和自由使用。当然,决策在你手中。
机器学习总体框架
2015起,我开始制作一个自动机器学习框架,还在完善过程中,很快就会发布。下图所示的框架图就是这篇文章中将会提到的基础框架:
此处输入图片的描述
上面展示的这个框架里面,粉红色的线就是一些通用的步骤。在处理完数据并把数据转为数据框格式后,我们就可以进行机器学习过程了。
确定问题
确定要研究的问题,也就是通过观察标签的类别确定究竟是分类还是回归问题。
划分样本
第二步是将所有的样本划分为训练集(training data)和验证集(validation data)。过程如下:
https://pic2.zhimg.com/v2-7e153d8877ffb6b6549888cacf8ebea5_b.png
划分样本的这一过程必须要根据标签来做。比如对于一个类别不平衡的分类问题,必须要用分层抽样的方法,比如每种标签抽多少,这样才能保证抽出来的两个样本子集分布类似。在Python中,我们可以用scikit-learn轻松实现。
对于回归问题,那么一个简单的K折划分就足够了。但是仍然有一些复杂的方法可以使得验证集和训练集标签的分布接近,这个问题留给读者作为练习。
上面我用了样本全集中的10%作为验证集的规模,当然你可以根据你的样本量做相应的调整。
划分完样本以后,我们就把这些数据放在一边。接下来我们使用的任何一种机器学习的方法都要先在训练集上使用然后再用验证集检验效果。验证集和训练集永远都不能掺和在一起。这样才能得到有效的评价得分,否则将会导致过拟合的问题。
识别特征
一个数据集总是带有很多的变量(variables),或者称之为特征(features),他们对应着数据框的维度。一般特征的值有三种类型:数值变量、属性变量和文字变量。我们用经典的泰坦尼克号数据集来示例。
在这里生还(survival)就是标签,船舱等级(pclass)、性别(sex)和登船港口(embarked)是属性变量。而像年龄(age)、船上兄弟姐妹数量(sibsp)、船上父母孩子数量(parch)是数值变量。而姓名(name)这种文字变量我们认为这和生还与否没什么关系,所以我们决定不考虑。
首先处理数值型变量,这些变量几乎不需要任何的处理,常见的方式是正规化(normalization)。
处理属性变量通常有两步:
把属性变量转变为标签
此处输入图片的描述
把标签转变为二元数值
此处输入图片的描述
由于泰坦尼克号数据集没有很好的文字变量来示范,那么我们就制定一个通用的规则来处理文字变量。把所有的文字变量组合到一起,然后用某种算法来处理并转变为数字
此处输入图片的描述
我们可以用CountVectorizer
此处输入图片的描述
或者TfidfVectorizer来实现
此处输入图片的描述
一般来说第二种方法往往比较优越,下面代码框中所展示的参数长期以来都取得了良好的效果。
image_1cqiejkvliv41tcq1vrppfthnv48.png-35.2kB
如果你对训练集数据采用了上述处理方式,那么也要保证对验证及数据做相同处理。
特征融合
此处输入图片的描述
特征融合是指将不同的特征融合,要区别对待密集型变量和稀疏型变量。
此处输入图片的描述
并且还可以通过FeatureUnion模块实现,如果有其他处理步骤,如PCA或特征选择(我们将在本文后面访问分解和特征选择)。
此处输入图片的描述
当我们把特征融合好以后,可以开始机器学习的建模过程了,在这里我们都是选择以决策树为基学习器的集成算法,主要有:
RandomForestClassifier RandomForestRegressor ExtraTreesClassifier ExtraTreesRegressor XGBClassifier XGBRegressor
但是不能直接把没有经过规范化的数值变量直接用线性模型拟合,可以用scikitlearn里面的规范化(Normalized)和标准化(StandardScaler)命令分别对密集和稀疏的数据进行相应的处理。
这些归一化方法只适用于稠密特征,对稀疏特征应用效果不佳。是的,可以在稀疏矩阵上应用StandardScaler,而无需使用平均值(参数:WITE_MEST=FALSE)。
如果以上步骤给出了一个“好的”模型,我们可以进行超参数的优化,如果没有,我们可以进行以下步骤并改进我们的模型。
接下来的步骤包括分解方法:
此处输入图片的描述
简单起见,这里不考虑LDA和QDA。对于高维数据来说,PCA是常用的降维方式,对于图像数据一般我们选用1015组主成分,当然如果模型效果会提升的话也可以选择更多的主成分。对于其他类型的数据我们一般选择5060个主成分。(只要我们能够处理现有的数值数据,我们就倾向于避免PCA)。
此处输入图片的描述
对于文本数据,将文本转换为稀疏矩阵后,进行奇异值分解(SVD)。SVD的一种变异叫做TruncatedSVD,可以在科学学习中找到。
此处输入图片的描述
一般在TF-IDF中SVD主成分的数目大约在120~200之间,但是也可以采用更多的成分,但是相应的计算成本也会增加。
在特征降维之后我们可以进行建模的训练过程了,但是有的时候如果这样降维后的结果仍不理想,可以进行特征选择:
此处输入图片的描述
特征选择也有很多实用的方法,比如说常用的向前或向后搜索。那就是一个接一个地把特征加入模型训练,如果加入一个新的特征后模型效果不好,那就不加入这一特征。直到选出最好的特征子集。对于这种方法有一个提升的方式是用AUC作为评价指标,当然这个提升也不是尽善尽美的,还是需要实际应用进行改善和调整的。
还有一种特征选择的方式是在建模的过程中就得到了最佳特征子集。比如我们可以观察logit模型的系数或者拟合一个随机森林模型从而直接把这些甄选后的特征用在其它模型中。
此处输入图片的描述
在上面的处理中应该选择一个小的estimator数目这样不会导致过拟合。还可以用梯度提升算法来进行特征选择,在这里我们建议用xgboost的库而不是sklearn库里面的梯度提升算法,因为前者速度快且有着更好的延展性。
此处输入图片的描述
对于稀疏的数据集我们可以用随机森林、xgboost或卡方等方式来进行特征选择。下面的例子中我们用了卡方的方法选择了20个特征出来。当然这个参数值20也是可以进一步优化的。
此处输入图片的描述
模型选择和参数调整
一般而言,常用的机器学习模型有以下几种,我们将在这些模型中选择最好的模型:
分类问题
随机森林
梯度提升算法(GBM)
Logistic回归
朴素贝叶斯分类器
支持向量机
k临近分类器
回归问题随机森林
梯度提升算法(GBM)
线性回归
岭回归
Lasso
SVR
下表中展示了每种模型分别需要优化的参数,这其中包含的问题太多太多了。究竟参数取什么值才最优,很多人往往有经验但是不会甘愿把这些秘密分享给别人。但是在这里我会把我的经验跟大家分享。
此处输入图片的描述
RS*是指没有一个确切的值提供给大家。
在我看来,严格地说,我的观点是,上面的模型将优于任何其他模型,而且我们不需要评估任何其他模型。
下面是上述过程的一个总结,主要是强调一下要保留训练的结果用来给验证集验证,而不是重新用验证集训练!
此处输入图片的描述
并将它们分别应用于验证集:
此处输入图片的描述
上述规则和框架在我所处理的大多数数据集中都表现得很好。当然,对于非常复杂的任务,它也失败了。没有什么是完美的,我们不断改进我们所学到的东西。就像机器学习一样。
作者:nicco773
链接:https://www.jianshu.com/p/19c040fcf7ee
共同学习,写下你的评论
评论加载中...
作者其他优质文章