机器学习问题处理框架
机器学习算法工程技能:
先看一张问题处理的流程图:
上面的框架图主要包括问题处理的流程和主要的方法,本人觉得总结的相当好。
应用算法解决Kaggle问题,一般具有一下步骤:
- 第一步:识别问题
- 第二步:分离数据
- 第三步:构造提取特征
- 第四步:组合数据
- 第五步:分解
- 第六步:选择特征
- 第七步:选择算法进行训练
利用Python做数据分析时,可以使用以下集成的包:
- Anaconda 包含大部分数据科学分析所用的包
- pandas 将数据转为Dataframe进行处理
- scikit-learn 包含机器学习算法模型
- matplotlib 画图包
- xgboost 集成决策树
- keras/Tensorflow/Pytorch 深度学习框架
- tqdm 进度条
- Community/IGraph/networkX 社团检测相关包
第一步:识别问题
首先明确这个问题是回归还是分类。通过问题和数据可以判断出来,一般情况下数据由X和Label组成,Label可以一列或者多列,可以使二进制数或者实数,当Label为二进制数时,问题属于分类问题,当它为实数时,问题属于回归。
第二步:分离数据
可以根据下图利用数据集:
将数据分为Training Data和Validation Data。
Training Data用来训练模型,用Validation Data来检验这个模型的表现,否则通过各种调节参数,模型可以在Training Data上表现较好,但是在实际数据集上效果很差,就会产生过拟合现象。
在scikit-learn包中有工具可以直接验证模型:
分类问题使用:StrtifiedKFold
1 | from sklearn.cross_validation import StratifiedKFold |
回归问题使用:KFold
1 | from sklearn.cross_validation import KFold |
第三步:构造特征
在这一过程中需要将数据转化成模型需要的形式。
数据通常有三种类型:数字,类别,文字。
当数据是类别的形式时,需要将每一类提取出来作为单独一列,然后用二进制表示每条记录相应的值。例如:
record 1:性别 女
record 2:性别 女
record 3:性别 男
转化之后结果如下:
女 男 record 1: 1 0 record 2: 1 0 record 3: 0 1
这个过程也可以通过scikit-learn包实现:
1 | from sklearn.preprocessing import LabelEncoder |
或者
1 | form sklearn.preprocessing import OneHotEncoder |
第四步:组合数据
处理完数据的特征之后,需要将数据组合在一起。
如果数据是稠密的,可以使用numpy的hstack函数:
1 |
|
如果数据是稀疏的,可以使用sparse的hstack函数:
1 | from scipy import sparse |
将特征进行组合之后,可以使用如下算法模型:
- RandomForestClassifier
- RandomForestRegressor
- ExtraTreesClassifier
- ExtraTreesRegressor
- XGBClassifier
- XGBRegressor
不能使用线性模型,使用线性模型之前需要对数据进行正则化而不是上述预处理。按我理解线性模型是来拟合数据的而不是用来按属性分类的,所以需要正则化处理。
第五步:分解
为了进一步优化模型,可以使用一下方法对数据进行分解:
首先看一下框架中使用的数据分解方法:
PCA:主成分分析方法,是一种分析,简化数据集的技术。用于减少数据集的维数,同时保持数据集中的对方差贡献最大的特征。
1 | from sklearn.decomposition import PCA |
SVD:奇异值分解,是线性代数中一种重要的矩阵分解技术,它能找到标准化正交基后方差最大的维度,因此可以用它进行降维去噪。对于文字数据,在转化为稀疏矩阵之后,可以使用SVD。
1 | from sklearn.decomposition import TruncatedSVD |
第六步:选择特征
当特征数量越多时,分析特征、训练模型所需要的时间就越长,容易引起“维数灾难”,模型也会越复杂,推广能力也会下降,所以需要消除不相关或者是多余的特征。
常用的算法有完全搜索,启发式搜索和随机算法
常用的特征选择算法如下:
- Random Forest
1
from sklearn.ensemble import RandomForestClassifier
- xgboost
1
import xgboost as xgb
- chi-2(对于稀疏的数据)
1
2from sklearn.feature_selection import SelectKBset
form sklearn.feature_selection import chi2
选择完相关的系数后,接下来可以应用算法,常用的算法有:
分类算法:
- Random Forest
- GBM
- Logistic Regression
- Naive Bayes
- SVM
- K-nearest Neighbors
回归算法: - Random Forest
- GBM
- Linear Regression
- Ridge
- Lasso
- SVR
scikit-learn包中包含很多机器学习算法,不同算法性能比较如下图:
直接使用算法之后,一般精度不是非常好,此时可以使用参数调节的方法来提高性能,下表列出需要调节参数的算法:
调节完参数之后,并不是过程走完了,这时候需要去思考是什么原因造成精度低了,是哪些数据的深层意义还没有挖掘到,这个时候可以通过统计或者可视化再一次去探索数据,再走一遍上述的流程。
除了以上的流程之外,还需要将处理过程中的Transformer保存一下:
方便在validation数据集上应用: