原文链接:approaching almost any machine learning problem--abhishek thakur
前言
几乎每一个科学家日常之一是处理大量的数据。有人说几乎是60-70%的时间是花在数据清洗中,以及将数据转变为适合机器学习的格式。这篇文章主要集中在于第二部分,例如:运用机器学习以及包括前面的步骤。这里所讨论的内容是基于我参加几百场kaggle比赛的经验。必须指出的是,这里的讨论非常普遍,但非常有用,也可能存在非常复杂的方法,由专业人士练习。
本文使用python。
数据
在运用机器学习方法之前,数据应该被转化为表格形式。而这整个过程是最耗时也是最困难的,过程如下图所示:
机器学习而后使用这些表格数据。在机器学习以及数据挖掘中,表格数据是重现数据最通用的方法。当我们拥有一个数据表,行列中包括不同的数据样本,数据的变量以及对应的样本结果(Label,y)。这些样本结果可以是单列也可以是多列,这个取决于问题的类型。我们将变量命名为X以及标签命名为y。
标签的类型
这些标签了定义了问题,可以用多种类型,例如:
1)单列:二进制数据(对应分类问题,一个样本结果只属于一种分类,结果一般有两种类型);
2)单列:连续性数据(原文:real values)(对应回归问题,一个样本预测值只有一个);
3)多列:二进制数据(对应分类问题,而其中的样本只属于一类,但整体的样本结果是有超过两种类型的);
4)多列:连续性数据(对应回归问题,一个样本预测值只有多个值);
5)多标签:对应分类问题,一个样本属于几个类型。
评估指标
对于任何一种机器学习问题,我们必须知道如何去评估我们的结果,或者评估指标和对象是什么。类如对于二分类问题,通常选用ROC\AUC。在多标签或多类分类问题的情况下,我们在处理回归问题的情况下一般选择分类交叉熵或多类对数损失和均方误差(categorical cross-entropy or multiclass log loss and mean squarederror)。
我不会详细讨论不同的评估指标,因为我们可以有很多不同的类型,这取决于问题。
库(python)
为了开始安装我们的机器学习库,应该先安装基础且重要的,例如numpy和scipy。
1)查看和操作数据:pandas(http://pandas.pydata.org/)
2)拥有全部机器学习类型:scikit-learn(http://scikit-learn.org/stable/)
3)最好的梯度提升库:xgboost(https://github.com/dmlc/xgboost)
4)神经网络:keras(http://keras.io/)
5)数据可视化:matplotlib(http://matplotlib.org/
)
6)监控进度:tqdm(https://pypi.python.org/pypi/tqdm)
我不使用Anaconda(https://www.continuum.io/downloads)。它过于简单以及所有事情都帮你做好。但是我想要更多自由。选择权在于你。
机器学习框架
在2015年,我提出过一个自动机器学习的框架,如今她依旧在发展中,将会在后续公布。对于这篇文章,有着类似的框架基础。框架如下图所示:
在上图的框架中,粉红色线表示的是最通用的方法。我们需要将数据提取和修剪为一个表格型数据,在此之后,我们可以进行搭建机器学习模型。
最先的一步是识别问题。这一步可以通过查看标签。一个必须知道的事情是它是二分类问题、多分类或者多标签分类亦或是回归问题。在我们识别问题之后,我们开始切割数据为两个不同部分,一个是训练集另一个是测试集,如下图所示:
”必须“通过标签将数据分为训练集和测试集。在任何分类问题下,需要使用随机抽样。在python中,可以轻松使用scikit-learn进行切割:
在回归任务的情况下,简单的K折分割(K-Ford)就足够了。然而,有些复杂的方法往往会保持标签的分布对于训练和验证都是一样的,这留给读者练习。 image
在上面的例子中,我选择了eval_size或验证集的大小作为完整数据的10%,但是可以根据数据的大小选择这个值。
切割数据之后,留下数据,不要触碰它。任何在测试集上的操作要同时作用于训练集。训练集在任何情况下不要与测试集合并。这样做虽然会得到非常好的评估结果,会让建模者高兴,但将会建立一个严重过拟合的无用模型。
下一步是识别数据中的不同变量。这其中通常包括三种变量类型。也就是说i,数值型变量、分类变量以及文本变量。以非常常见的泰坦尼克为例子:
image
在这里,survival就是标签。我们已经在上一步中将训练数据中的标签分开了。然后,我们有pclass,sex,embarked。这些变量具有不同的类别,因此它们是分类变量。像age,sibsp,parch等变量是数值变量。name是一个包含文本数据的变量,但我不认为这是预测survival的有用变量。
首先将数值型变量分开,这些变量不需要任何处理,只需要将其规范化以及运用于机器学习模型。
这里有两种方式处理分类变量:
1)将分类变量转化为标签:
2)将标签转化为二进制变量(OneHotEncoder):
image
注意:在使用OneHotEncoder之前需要使用LabelEncoder将分类数据转化为数值
因为泰坦尼克号的数据没有文本变量的好例子,所以我们来制定处理文本变量的一般规则。我们可以将所有的文本变量合并为一个,然后使用一些对文本数据起作用的算法并将其转换为数字。
数据合并可以用下列方法:
image
我们可以使用CountVectorizer or TfidfVectorizer 作用于它:
image
or
image
TfidfVectorizer在多数计数的时候表现得要较好,下列参数是 TfidfVectorizer常常用到的:
image
如果您仅在训练集上应用这些向量化器,请确保将其转储到内存中,以便稍后在验证集上使用它。
image
接下来,我们来到堆垛机模块(Stacker)。堆垛机模块不是模型堆垛机,而是特征堆垛机。上述处理步骤之后的不同特征可以使用堆叠器模块进行组合。
image
你可以水平堆叠所有的功能之前,通过使用numpy的堆叠或sparse的堆叠进行进一步处理,这取决于你是否有密集或稀疏的功能。
image
如果还有其他处理步骤,例如pca或特征选择,我们也可以通过FeatureUnion模块来实现(我们将在本文稍后的部分中介绍分解和特征选择)。
image
一旦我们把这些特征叠加在一起,我们可以开始应用机器学习模型。在这个阶段只有你应该去的模型应该是基于集成树的模型。这些模型包括:
RandomForestClassifier
RandomForestRegressor
ExtraTreesClassifier
ExtraTreesRegressor
XGBClassifier
XGBRegressor
我们不能将线性模型应用于上述特征,因为它们没有被标准化。要使用线性模型,可以使用scikit-learn中的Normalizer或StandardScaler。
这些规范化方法只适用于密集的特征,如果应用于稀疏特征则不会给出非常好的结果。是的,可以在不使用均值(参数:with_mean = False)的情况下将StandardScaler应用于稀疏矩阵。
如果上面的步骤给出了一个“好”的模型,我们可以去优化超参数,如果没有,我们可以去下面的步骤和改进我们的模型。
接下来的步骤包括分解方法:
image
为了简单起见,我们将忽略LDA和QDA转换。对于高维数据,通常使用PCA来分解数据。对于图像以10-15个组件开始,只要结果的质量大大提高,就增加这个数量。对于其他类型的数据,我们最初选择50-60个组件(只要我们可以处理数字数据,我们倾向于避免PCA)。
对于文本数据,在将文本转换为稀疏矩阵之后,进行奇异值分解(SVD)。可以在scikit-learn中找到称为TruncatedSVD的SVD变体。
image
通常用于TF-IDF或计数的SVD组件的数量在120-200之间。以上任何数字都可能会提高性能,但不会大幅度降低计算能力。
在评估模型的进一步性能之后,我们转向数据集的缩放,以便我们也可以评估线性模型。然后可以将归一化或缩放的特征发送到机器学习模型或特征选择模块。
有多种方法可以实现特征选择。最常见的方式之一是贪婪的功能选择(向前或向后)。在贪心特征选择中,我们选择一个特征,训练一个模型,并在固定的评估指标上评估模型的性能。我们不断地添加和删除功能,并在每一步记录模型的性能。然后我们选择具有最佳评估分数的特征。以AUC作为评估指标的贪婪特征选择的一个实现可以在这里找到:https://github.com/abhishekkrthakur/greedyFeatureSelection.
必须指出的是,这个实现并不完美,必须根据需要进行修改/修改。
其他更快速的特征选择方法包括从模型中选择最佳特征。我们既可以查看logit模型的系数,也可以训练一个随机森林来选择最佳特征,然后在其他机器学习模型中使用它们。
image
请记住保持较少的估计量和最小的超参数优化,以免过度使用。
使用渐变增强机器也可以实现特征选择。如果我们在scikit-learn中使用xgboost而不是GBM的实现,这是很好的,因为xgboost更快更灵活。
我们也可以使用随机数森林或者随机数森林与xgboost的组合对变量进行筛选。
从正向稀疏数据集中选择特征的另一个流行方法是基于chi-2的特征选择,我们也在scikit-learn中实现了这一点。
image
在这里,我们使用chi2和SelectKBest从数据中选择20个特征。这也成为我们想要优化的超参数来改进我们的机器学习模型的结果。
不要忘记保存在任何步骤中使用任何种类的转换状态数据。您将需要他们评估验证集上的性能。
下一步(或中级)的主要步骤是模型选择+超参数优化:
image
我们通常在选择机器学习模型的过程中使用以下算法:
分类问题:
Random Forest
GBM
Logistic Regression
Naive Bayes
Support Vector Machines
k-Nearest Neighbors
回归问题:
Random Forest
GBM
Linear Regression
Ridge
Lasso
SVR
我应该优化哪些参数?我如何选择最接近最好的参数?这些是大多数人想到的几个问题。如果没有大量数据集的不同模型+参数的经验,就无法得到这些问题的答案。也有经验的人不愿意分享他们的秘密。幸运的是,我也有相当多的经验,我愿意放弃一些东西。
让我们分解超参数,使模型更聪明:
RS * =不能说出适当的值,要对这些超参数进行随机搜索。
在我看来,严格地说我的意见是,上述模式将超越任何其他模式,我们不需要评估任何其他模型。(。。。)
再次强调记住保存转换状态数据
image
并将它们分别应用于验证集:
image
上述规则和框架在我处理的大多数数据集中表现都非常好。当然,这个任务也很复杂。没有什么是完美的,我们继续改进我们学到的东西。就像机器学习一样。
网友评论