Approaching (Almost) Any Machine Learning Problem | Abhishek Thakur—翻译

来源:互联网 发布:微信载入数据失败 编辑:程序博客网 时间:2024/06/06 00:21

数据

在建立机器学习模型之前,已有数据j必需被转换成一个表格形式。这个过程是花费时间最长也是最难的,具体流程图如下:
这里写图片描述
Data Munging:数据清洗
Data Conversion:数据转换
现在数据挖掘模型就可以应用在数据表格上了。数据表格是数据挖掘或者机器学习数据最常见的表现形式。现在我们有一个数据表格,数据表格中有数据X和其对应的标签y。标签根据问题类型可以是一列或者多列。

标签种类

标签有很多种类型,比如:
单列标签,二进制(分类问题)
单列标签,实数(回归问题,预测一个值)
多列标签,二进制(分类问题,一个sample属于一类,但是有不同的属性)
多列标签,实数(回归问题,预测多个值)
多标签(分类问题,一个sample可以同时属于好多个类)

评价指标

必须要知道怎么评价我们的结果啊~balala~例如,在一个倾斜的二元分类问题中,我们通常AUC来评价(具体评价指标可以看看https://www.zhihu.com/question/30643044)在多标签(回归问题)或者多种类型分类问题中,我们一般选择交叉熵或多类对数损失和平均平方误差。

基本库:
numpy
scipy
pandas
scikit-learn
xgboost(树)
keras(神经网络)
matplotlib
tqdm

机器学习框架

这里写图片描述
图片中的粉色线条是最常用的流程。在我们把数据提取简化成一个表格形式之后,我们可以开始建立机器学习模型了。
第一步是通过Labels明确问题的类型。balala~~~就是上面讲的那些~一旦我们确定了问题的类型,我们把数据分成两个部分,一个training set和一个validation set。如下图:
这里写图片描述
备注:数据的分割必须根据labels。任何分类问题,通过分分层分割(stratified splitting)。在python中,用scikit-learn非常简单的啦

from sklearn.cross_validation import StratifiedKFold eval_size = 0.10kf = StratifiedKFold(y,round(1. / eval_size))train_indices,valid_indices=next(iter(kf))X_train,y_train = X[train_indices],y[train_indices]X_valid,y_valid = X[valid_indices],y[valid_indices]

回归问题中,一个简单的K-Fold 分割就可以了。

from sklearn.cross_validation import KFold eval_size = 0.10kf = KFold(y,round(1. / eval_size))train_indices,valid_indices=next(iter(kf))X_train,y_train = X[train_indices],y[train_indices]X_valid,y_valid = X[valid_indices],y[valid_indices]

上述代码中我选择了10%的数据作为validation set,你可以选择任何大小的数据。
数据分割完成后,可以把它仍在一边。任何对operation data的操作都需要应用到validation set中。也就是说,validation set需要和operation set合并到一起进行操作。数据分割的目的是为了防止数据过拟合。
下一步就是数据中变量值得定义。一般的处理过程中有三种变量。数值变量、分类变量和文本内的变量。
(https://www.kaggle.com/c/titanic/data).
在这个例子中,是否存活就是这个label。这里有两种方法处理分类数据:

from sklearn.preprocessing import LabelEncoder    lbl_enc=LabelEncoder()    lbl_enc.fit(xtrain[categorical_features])    xtrain_cat = lbl_enc.transform(xtrain[categorical_features])
ohe = OneHotEncoder()ohe.fix(xtrain[categorical_features])xtrain_cat = ohe.transform(xtrain[categorical_features])

记住要在使用OneHotEncoder之前把这些分类转换成数字(不是特别懂)
。。。。。。
如果您只在训练集上应用这些矢量,请确保将其转储到硬盘驱动器,以便稍后在验证集上使用它。

下一步就是stacker module了。stacker module 不是一个模型栈,而是一个特征栈。不同的特征可以用一个模型栈结合。
你可以用numpy hstack 或者 sparse hstack对所有特征进行水平堆栈。

import numpy as npfrom scipy import sparseX = np.hstack((x1,x2,...))X = sparse.hstack((x1,x2,...))

也可以用FeatureUnion module 如果想使用PCA或者其他特征选择。

from sklearn.pipeline import FeatureUnionfrom sklearn.decomposition import PCAfrom sklearn.feature_selection import SelectKBestpca=PCA(n_components=10)skb = SelectKBest(k=1)combined_features = FeatureUnion([('pca',pca),('skb',skb)])

在我们把所有的特征搞定之后,我们就可以上machine learning model了。 在这个阶段,您应该选择的模型应该是基于集成树的模型。这些模型包括:
RandomForestClassifier
RandomForestRegressor
ExtraTreesClassifier
ExtraTreesRegressor
XGBClassifier
XGBRegressor
我们不可以用线性模型因为数据并没有归一化。为了使用线性模型,我们可以用Normalize 或者StandardScaler。
这些标准化方法只适用于密集特性,如果应用于稀疏特性,则不会得到很好的结果。也就是说,我们可以在稀疏矩阵上应用标准标量,而不用使用平均值(参数:with_mean = False)。
如果上述步骤得到一个好的模型,我们就看到了胜利的曙光,否则不要进行下一步。。。
下个步骤是分解方法。LDA和QDA变换非常的麻烦,不作具体介绍。针对高维数据,PCA用来分解数据。图像处理时,一般简化成10-15个components,如果希望简化后质量提升,就增加components的数目。(对于我们可以处理的数据,我们尽量不使用PCA)

from sklearn.decomposition import PCApca = PCA(n_components=12)pca.fit(xtrain)xtrain = pca.transform(xtrain)

对于text数据,在把text数据转换成稀疏矩阵之后,使用SVD,代码如下:

from sklearn.decomposition import TruncatedSVDsvd = TruncatedSVD(n_components=120)svd.fix(xtrain)xtrain = svd.trainform(xtrain)

通常用SVD方法的components数量在120-200之间。可能会提高表现,但是并不是一定的并且会花费跟多的时间。
下一步:scaling of the datasets
规范过或者扩展过的特征可以被送到machine learning model或者feature selection modules中了。

有很多中特征选择的方法啦,最常见的一种就是greedy feature selection。我们选择一个特征,训练一个模型,在一个固定评价指标基础上进行评价。然后增加和移动特征,记录模型的表现。最后选择表现最好的特征。以AUC为评价指标的greedy feature selection一个实现:
https://github.com/abhishekkrthakur/greedyFeatureSelection.
必需注意的是这个方法并不是完美的,必需根据需求进行改进。
另一个更快的方法就是可以根据logit模型的系数,或者我们可以训练一个随机森林来选择最佳特征,然后再用其他机器学习模型来使用它们。

clf = RamdomForestClassifier(n_estimators=100,n_jobs=-1)clf.fit(X,y)X_selected = clf.transform(X)

记住要保持低数量的估计量和最小优化的hyper参数,这样你就不会过度拟合。
特征选择还可以用Gradient Boosting Machine完成。如果我们使用xgboost而不是在scikit- learn中实现GBM,那就很好了,因为xgboost的速度快得多,伸缩性也更大。

params = {}model = xgb.train(params,dtrain,num_boost_round=100)sorted(model.get_fscore().items(),key = lambda t:-t[1])

还可以用
RandomForestClassifier
RandomForestRegressor
Xgboost
还有一种非常流行的方法是使用chi-2

from sklearn.feature_selection import SelectKBestfrom sklearn.feature_selection import chi2skb = SelectKBest(chi2,k=20)skb.fit_transform(X,y)

在这里,我们使用chi2与SelectKBest一起从数据中选择20个特性。这也成为我们想要优化的一个超参数,以改进我们的机器学习模型的结果。
别忘了把你在所有步骤中使用的变换都倒出来。需要它们来评估验证集上的性能。
下一步(或中间)主要步骤是模型选择+超参数优化。
我们一般使用以下几种machine learning model:
Classification:
Random Forest
GBM
Logistic Regression
Naive Bayes
Support Vector Machines
k-Nearest Neighbors
Regression
Random Forest
GBM
Linear Regression
Ridge
Lasso
SVR
接下来,就是practice ……..

阅读全文
0 0
原创粉丝点击