机器学习框架
为了从实用角度了解机器学习框架,我专门学习Abhishek Thakur发表在Kaggle上的热门文章Approaching (Almost) Any Machine Learning Problem,并参考一篇翻译文章【干货】Kaggle热门 | 用一个框架解决所有机器学习难题和一篇整理文章一个框架解决几乎所有机器学习问题并作总结。
整个机器学习过程可以分为如下几步:
- 处理数据
- 识别问题
- 分割数据
- 数据转化
- 特征组合
- 特征优化
- 特征选取
- ML模型选取
- 超参数选取
- 评估
1.处理数据
为了让机器学习模型能使用数据集(Dataset )中的数据,我们需要把数据转化成一个列表(Tabular)的形式。这是最消耗时间,也是最困难的。有一些研究者称,自己有60%--70%的时间都花在了数据清洗、处理(筛选)和转换上。
2. 识别问题类型(Types of Problem)
列表中的标签定义了所要解决的问题,例如:
- 单行,二进制值(分类问题,一个样本只属于一个种类,且种类总数只有2个)
- 单行,真值(回归问题,预测唯一值)
- 多行,二进制值(分类问题,一个样本属于一个分类,但是有2个或者多个种类)
- 多行,真值(回归问题,预测多值)
- 多个标签(分类问题,一个样本可以属于不同的种类)
3. 分割数据
把数据分为两个不同的部分,如下图描述,一部分是训练数据,另一部分是检验数据。这个过程使用Scikit-learn能轻易地做到。
另一种说话,数据分成训练集(Training Set)[X_train,Y_train]、验证集(Validation set)[X_Valid,Y_Valid]。使用测试集(Test Set)[X_test,Y_test]进行评估。
对数据集的理解,这里有个非常形象的类比
训练集 → 题解大全
验证集 → 模拟考试
测试集 → 高考!
回归任务中可使用一个简单的K-Fold分割
4. 数据转化
将数据转化成模型需要的形式。
待处理的数据有3种,分别为数值数据(Numerical Data)、分类数据(Categorical Data)、文本数据(Text Data)。
数值数据不需要任何的处理;分类数据可以转换为标签(Convert to labels),进一步可以二值化(Binarize);把文本转化数值。
5.特征组合
堆叠储存器(Stacker)并不是一个模型stacker,而是一个特征stacker。不同的特征可以被结合起来,用到Stacker模块中。
可以使用numpyhstack或者sparse hstack把所有的特征水平堆叠起来,这取决你拥有的是稀疏或者紧密特征。
可以通过FeatureUnion模块来实现,防止要求其他的处理步骤,比如 pca 或者特征选择。
在这一阶段,你唯一可用的模型应该是基于集成树(ensemble tree)的。这些模型包括:
- RandomForestClassifier
- RandomForestRegressor
- ExtraTreesClassifier
- ExtraTreesRegressor
- XGBClassifier
- XGBRegressor
由于还没有被标准化,我们在上面的特征中不能使用线性模型。要使用线性模型,你可以从scikit-learn上使用Normalizer或StandardScaler。这些规范化的方法只有在紧密特征中才起作用,在稀疏特征中不会有好的效果。
6.特征优化
这一步是为了进一步优化特征,可以用以下算法:
- 主成分分析(Principal Component Analysis,PCA) 是一种分析、简化数据集的技术。用于减少数据集的维数,同时保持数据集中的对方差贡献最大的特征。
- 线性判别式分析(Linear Discriminant Analysis, LDA)利用投影矩阵将高维样本投影到低维空间中来减小样本点的维数,且投影过程中使用了类别信息,被视为一种经典的降维技术。
- 二次判别分析(quadratic discriminant analysis,QDA)
- 奇异值分解(Singular Value Decomposition,SVD)是线性代数中一种重要的矩阵分解,它总能找到标准化正交基后方差最大的维度,因此用它进行降维去噪。
特征选取
特征的选择,有多种方式可以实现。
最常见的是贪婪特征的选择(正向或反向)。在贪婪特征的选择上,我们选择一个特征,训练一个模型并用一个修正的评估值来评估模型的性能。我们不断增加或者移除一个又一个特征,并逐步记录模型的表现。随后,我们选出得分最高的特征。必须说明的是,这种方法并不是完美的,需要根据要求改变或修正。
记得保持较少数量的Estimator,并对超参数进行最小优化,这样你就不会过度拟合。
特征的选择也可以通过Gradient Boosting Machines来实现。如果我们使用xgboost而不是在 scikit-learn中使用GBM时,效果会很好。因为xgboost速度更快、可扩展性更高。
我们也可以使用RandomForestClassifier 、RandomForestRegressor 和xgboost,在稀疏数据集中进行特征选择。
另一个较为流行的方法是基于chi-2的特征选择。
其他更快的特征选择方法包括:从一个模型中选择最佳的特征。我们可以观察一个逻辑模型的稀疏,或者训练一个随机森林,来选择最佳的特征,然后在其他的机器学习模型上使用。
7. ML模型选取(ML Model Selection)
主要使用以下算法:
分类:
- Random Forest
- GBM
- Logistic Regression
- Naive Bayes
- Support Vector Machines
- k-Nearest Neighbors
回归:
- Random Forest
- GBM
- Linear Regression
- Ridge
- Lasso
- SVR
8. 超参数选取(Hyper parameter selector)
参考如下表格
RS*指不能确定合适的值
9. 评估
对于任何机器学习难题,我们必须知道要怎样评估自己的研究结果,或者说,评估的价值和对象是什么。
为了防止二进制分类中的负偏(skewed)的问题,我们通常会选择在运行特征曲线(ROC AUC 或者简单的 AUC)的接收器(receiver)下方区域进行评估。
在多标签和多类型分类难题中,我们通常选择分类交互熵,或者多类型的 log loss ,以及在回归问题中降低平方误差。
内容回顾
机器学习相关资料
python库管理软件:Anaconda
数据处理:Pandas
各种机器学习模型:Scikit-learn
最好梯度提升库:xgboots
神经网络:keras
绘图:matplotlib
监控进度:tqdm