机器学习(十一):机器学习的流程

这是一篇机器学习的介绍,本文不会涉及公式推导,主要是一些算法思想的随笔记录。
适用人群:机器学习初学者,转AI的开发人员。
编程语言:Python
操作系统:Windows

关于机器学习的流程,大的方向都比较类似,基本都是需求分析特征工程训练调参部署上线四个大步骤,细分下来会有些不同,各个步骤顺序也会稍有不同,下面将自己实际项目中采用的机器学习步骤、各个步骤用到的知识点进行总结分享给大家:

需求分析

明确问题类型

下面是自己画的一张目前问题类型的图:
机器学习(十一):机器学习的流程
实际机器学习中,大部分都是分类问题,其次是回归问题,即以监督学习为主;如果数据量很大(几百万以上)或者数据是非结构化数据,比如文本、图片等等,可能需要采用深度学习,这篇文章不考虑深度学习的情况。

明确问题规模与数据分布

在进行机器学习前,知道数据的规模,比如,我需要用三个月的数据作为训练集,那么,这三个月数据量有多少?如果是二分类问题(常见),正样本和负样本又是多大的比例,可以先做一些数据分析的工作,比如这批数据符合什么分布,可以先对数据有初步的认识,这有助于我们建立模型,建议采用pandas进行数据分析。

除此之外,还要明确是不是时序型数据,如果是时序型数据,明确取数的实际窗口(取哪几个月数据,其中那些数据是训练集、哪些是测试集)。

选择工具

采用什么语言?什么框架?什么IDE等等。

  • 语言:Python
  • IDE:PyCharm
  • 数据分析:机器学习三剑客(Numpy\Matplotlib\Pandas)
  • 机器学习框架:Scikit-learn
  • 集成环境:Anaconda
  • 跨平台上线:PMML

特征工程

机器学习和深度学习相比,复杂的特征工程是必不可少的(深度学习大大简化了特征工程的流程),而且特征工程与具体的问题息息相关。

数据与特征决定了机器学习的上限,而模型与算法只是无限逼近这个上限而已。——《Python深度学习》

特征收集

采数之前,先要明确要哪些数据,关于数据的来源,可以依据以下两点:

主观选择

特征主要分两类:

  • 静态特征:性别、年龄、手机号码归属地、身份证归属地
  • 动态特征(行为数据):浏览产品次数、逗留详情页数据等埋点数据

业务流程

  1. 明确整个过程中涉及到的操作
  2. 查询流程中涉及的表
  3. 询问涉及的页面及埋点数据

根据以上步骤,可以获得启发,找到更多特征。

特征筛选(sklearn.feature_selection)

经过上述步骤,确定特征时候,接下来要进行特征的筛选,特征的筛选可以从两个角度进行决策:

人工判断(重要性、缺失率)

特征的筛选主要从重要性、缺失率两方面进行考虑:
机器学习(十一):机器学习的流程

借助数学

卡方检验

用方差来衡量某个观测频率和理论频率之间差异性的方法:

from sklearn.feature_selection import SelectKBest,chi2
#选择k个最好的特征,返回选择特征后的数据
X_feature = SelectKBest(chi2,k=5).fit_transform(X,y)
print(X_feature.scores_)
print(X_feature.pvalues_)
相关系数法

衡量变量之间的线性相关性

from scipy.stats import pearsonr
基于树模型的特征选择法(GBDT)
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import GradientBoostingClassifier
SelectFromModel(GradientBoostingClassifier()).fit_transform(X,y)
XGBoost

可以借助XGBoost的plot_importance(),画出特征重要性直方图。

降维
主成分分析PCA
from sklearn.decomposition import PCA
#主成分分析法,返回降维后的数据
#参数n_components为主成分数目
PCA(n_components=2).fit_transform(X,y)
线性判别分析LDA
from sklearn.lda import LDA
#线性判别分析法,返回降维后的数据
#参数n_components为降维后的维数
LDA(n_components=2).fit_transform(X,y)

数据预处理(Pandas)

数据预处理主要包括异常值处理、去重、特征编码、归一化处理等,后续会单独写一篇博客详细介绍。

训练调参

训练调参是所有机器学习(包括深度学习)最核心的部分,后续也会单独写一篇博客详细介绍。这里主要说明一下涉及的内容:交叉验证、学习曲线、网格搜索、误差分析、模型解释几部分。

部署上线

模型训练好,进入使用阶段,根据实际需要,通过python训练好的机器学习模型(.m,.model等),如果直接进行预测(如果给出一批用户名单,之间获取特征数据,然后通过模型给出预测结果值和概率),是最方便的;

但实际场景中,很多是需要将模型部署至服务器,进行实时预测(这种实时有一定的时差,主要在于特征数据并不能实时获取),如果部署上线,就要考虑跨平台的问题,针对目前很多web应用,都是基于java框架的,那么就需要java能够解析python训练出的模型文件,这时候就要借助一个第三方语言工具—— PMML(预测模型标记语言),针对这个语言的详细介绍和使用,后续也会单独写一篇博客。