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 ……..
- Approaching (Almost) Any Machine Learning Problem | Abhishek Thakur—翻译
- Approaching (Almost) Any Machine Learning Problem
- Approaching (Almost) Any Machine Learning Problem
- 《MACHINE LEARNING YEARNING》翻译——开篇
- 《Machine Learning In Action》翻译
- Note for video Machine Learning and Data Mining——The Learning Problem
- OpenCV: Machine Learning Overview翻译心得
- MLY翻译 -- 1.Why Machine Learning Strategy?
- Machine Learning—Online Learning
- Machine Learning—决策树
- Machine Learning Foundation Lecure 01 The Learning Problem 学习笔记
- Andrew NG 《machine learning》week 3,class5 —Solving the Problem of Overfitting
- 1. Why Machine Learning Strategy 为什么需要机器学习策略(《MACHINE LEARNING YEARNING》翻译)
- 翻译 《Pattern Recognition and Machine Learning》(PRML)的前言
- MLY翻译 -- 4.Scale drivers machine learning progress
- Machine Learning—AdaBoost algorithm
- Machine Learning—Linear Regression
- Machine Learning cs299 problem 3 Regulation C++ code
- Maven学习总结系列二:Maven的安装和配置
- 洛谷P2633 Count on a tree
- Linux基础指令学习01
- 191. Number of 1 Bits
- 做市商业务是个啥
- Approaching (Almost) Any Machine Learning Problem | Abhishek Thakur—翻译
- Decorator
- 冒泡排序 选择排序 递归思想
- 移动端网页制作
- ArcMap欧氏距离工具提取图像骨架线
- C++——黑白棋(状态改变)
- RSA算法详解
- 如何管理Spark Streaming消费Kafka的偏移量(三)
- 求最大公约数与最小公倍数(穷举)