参考链接:approaching-almost-any-machine-learning-problem

机器学习算法工程技能:

先看一张问题处理的流程图:

上面的框架图主要包括问题处理的流程和主要的方法,本人觉得总结的相当好。

应用算法解决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
2
3
4
5
6
7
8
9
10
11
from sklearn.cross_validation import StratifiedKFold

eval_size=0.10

kf=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]

回归问题使用:KFold

1
2
3
4
5
6
7
8
9
10
11
from sklearn.cross_validation import KFold

eval_size=0.10

kf=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]

第三步:构造特征

在这一过程中需要将数据转化成模型需要的形式。

数据通常有三种类型:数字,类别,文字。

当数据是类别的形式时,需要将每一类提取出来作为单独一列,然后用二进制表示每条记录相应的值。例如:

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
2
3
4
5

import numpy as np

X=np.hstack((x1,x2,...))

如果数据是稀疏的,可以使用sparse的hstack函数:

1
2
3
from scipy import sparse

X=sparse.hstack((x1,x2,...))

将特征进行组合之后,可以使用如下算法模型:

  • 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
    2
    from 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数据集上应用:

联系作者