机器学习完整路径

一个机器学习项目从开始到结束大致分为 5 步,分别是定义问题、收集数据和预处理、选择算法和确定模型、训练拟合模型、评估并优化模型性能。是一个循环迭代的过程,优秀的模型都是一次次迭代的产物。

定义问题

要剖析业务场景,设定清晰的目标,同时还要明确当前问题属于哪一种机器学习类型。

收集数据和预处理

收集数据

数据来源有多种形式,根据业务问题进行搜集和整合。

数据探索和可视化

通过散点图来观察特征和指标间的分布,推测之间的关系。

数据清洗

1、处理缺失的数据。(补充、剔除)
2、处理重复的数据。
3、处理错误的数据。
4、处理不可用的数据。

特征工程

特征工程是一个专门的机器学习子领域,它是数据处理过程中最有创造力的环节,特征工程做得好不好,非常影响机器学习模型的效率。特征工程就是指优化数据集的特征,使机器学习算法更起作用的过程。数据和特征决定了机器学习的上限,而模型和算法只是无限逼近这个上限而已
摒弃掉冗余的特征、降低特征的维度,能使机器学习模型训练得更快。

特征构建(特征衍生)

特征构建是整个特征工程领域最具创造力的部分,也是我觉得在数据预处理环节中最有意思的地方。因为它完全没有一定之规,全凭借你的经验、领域知识和创造力。

  • 特征扩展
    使用特征值扩展的方式衍生多个标注类型的特征,也可以理解为离散化。对于分类变量,直接one-hot编码;对于数值型特征,离散化到几个固定的区间段,然后用one-hot编码。

  • 特征组合
    指将两个或多个输入特征通过数学运算进行组合。分为如下几种情况:

  • 数值运算:如对特征进行加,减,乘,除
  • 特征交叉 :对多个特征进行交叉组合,或做交,并,补,笛卡尔集等运算。 暴力交叉,暴力交叉可能产生稀疏问题。
  • 合成特征
    合成特征的思想很简单,通过将单独的特征进行组合(相乘或求笛卡尔积)而形成的合成特征。是一种让线性模型学习到非线性特征的方式,包括以下类型:
  • 将一个特征与其本身或其他特征相乘(称为特征组合)。比如属性 A 有三个特征,属性 B 有两个特征,笛卡尔积后就有六个组合特征。
  • 两个特征相除。
  • 对连续特征进行分桶,以分为多个区间分箱。

说明: 合成特征与特征组合区别在于:特征组合广义上包含合成特征,合成特征则改变了特征的线性关系,属于无中生有。

  • 自动衍生
    包括自动衍生工具和深度衍生的方法,可以缩减时间成本,构建维度更广更全面的新生特征。具体可以参考自动化衍生工具 Featuretools。
特征编码
  • 独热编码(One-HotEncoding)
    用于将分类特征的每个元素转化为一个可直接计算的数值,也即特征值数字化。独热编码采用N位状态寄存器来对N个可能的取值进行编码,每个状态都由独立的寄存器来表示,并且在任意时刻只有其中一位有效。
    独热编码的优点:能够处理非数值属性;在一定程度上扩充了特征;编码后的属性是稀疏的,存在大量的零元分量。

  • 标签编码(LabelEncoder)
    针对离散变量,将离散型的数据转换成 0 到 n − 1 之间的数,这里 n 是一个列表的不同取值的个数,可以认为是某个特征的所有不同取值的个数。注意:会按照特离散变量值的ASCII码进行排序编码递增,不能自定义编码顺序。

  • 序列编码(Ordinal Encoding)
    适用于离散变量值具有内在顺序的场景,比如学历。需要手动自定义字典映射到[0, n-1]的整数。

  • 频数编码(Count Encoding)
    针对离散变量,将类别特征替换为类别的统计频次。可能会碰到下面的问题,需要谨慎使用:

  • 训练集和测试集上某字段分布不一样,那预测结果就会出问题;
  • 有些变量的频次可能是一样的,将会自动合并这些类别,需要小心处理。
  • 均值编码(Mean Encoding)
    针对离散变量,当这个特征的取值非常多的场景下,均值编码能极大提升模型的性能。例如:IP 地址、邮箱、家庭住址、手机号等。思路是用特征值的平均值来替换具体的类别。
特征选择

在一个数据集中,每个特征在标签预测或分类过程中发挥的作用其实都不同,我们需要选择有意义的特征输入机器学习的算法和模型进行训练。对于那些没作用和作用小的数据,我们就可以删掉,来降低数据的维度,节省模型拟合时的计算空间。通常来说,从两个方面考虑来选择特征:

  • 特征是否发散:如果一个特征不发散,例如方差接近于 0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用。

  • 特征与目标的相关性:这点比较显见,与目标相关性高的特征,应当优选选择。

自动特征选择工具,klearn 的 feature_selection 模块中,有很多自动特征选择工具。SelectKBest 的原理和使用都非常简单,它是对每个特征和标签之间进行统计检验,根据 X 和 y 之间的相关性统计结果,来选择最好的 K 个特征,并返回。

过滤法
  • 方差选择法

使用方差选择法,先要计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征。使用 feature_selection 库的 VarianceThreshold 类来选择特征。

from sklearn.feature_selection import VarianceThreshold

# 方差选择法,返回值为特征选择后的数据
# 参数threshold为方差的阈值,小于该值会被过滤
VarianceThreshold(threshold=3).fit_transform(iris.data)
  • 相关系数法

使用相关系数法,先要计算各个特征对目标值的相关系数以及相关系数的 P 值。用 feature_selection 库的 SelectKBest 类结合相关系数来选择特征。

from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonr

#选择K个最好的特征,返回选择特征后的数据
#第一个参数为计算评估特征是否好的函数,该函数输入特征矩阵和目标向量,输出二元组(评分,P值)的数组,数组第i项为第i个特征的评分和P值。在此定义为计算相关系数
#参数k为选择的特征个数
SelectKBest(lambda X, Y: array(list(map(lambda x:pearsonr(x, Y)[0], X.T))).T, k=2).fit_transform(iris.data, iris.target)
  • 卡方检验

针对离散变量,经典的卡方检验是检验定性自变量对定性因变量的相关性。

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
 
#选择K个最好的特征,返回选择特征后的数据
SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)
包装法(Wrapper)
  • 递归特征消除法

使用一个基模型来进行多轮训练,每轮训练后,消除若干权重系数较低的特征,再基于新的特征集进行下一轮训练。

from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression

#递归特征消除法,返回特征选择后的数据
#参数estimator为基模型
#参数n_features_to_select为选择的特征个数
RFE(estimator=LogisticRegression(), n_features_to_select=2).fit_transform(iris.data, iris.target)
嵌入法(Embedded)

将特征选择嵌入到模型的构建过程中,具有包装法与机器学习算法相结合的优点,也具有过滤法计算效率高的优点。

  • 基于惩罚项的特征选择法

使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维。

from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression

#带L1惩罚项的逻辑回归作为基模型的特征选择
SelectFromModel(LogisticRegression(penalty="l1", C=0.1)).fit_transform(iris.data, iris.target)
  • 基于树模型的特征选择法
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import GradientBoostingClassifier

#GBDT作为基模型的特征选择
SelectFromModel(GradientBoostingClassifier()).fit_transform(iris.data, iris.target)
数据降维

当特征选择完成后,可以直接训练模型了,但是可能由于特征矩阵过大,导致计算量大,训练时间长的问题,因此降低特征矩阵维度也是必不可少的。

把多维特征压缩成低维的特征,也就是通过算法实现特征选择,减少特征的数目。常见的降维算法有两种:主成分分析法(PCA)和线性判别分析(LDA)。PCA 是一种无监督的降维方法,而 LDA 是一种有监督的降维方法。

  • 主成分分析法(PCA)
from sklearn.decomposition import PCA

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

#线性判别分析法,返回降维后的数据
#参数n_components为降维后的维数
LDA(n_components=2).fit_transform(iris.data, iris.target)

构建特征集和标签集

主要是针对监督学习,拆分出特征和标签。

拆分训练集、验证集和测试集

训练集用来训练模型,验证集用来模型调优,测试集用来评估模型性能。
验证集,是模型训练过程中单独留出的样本集,它可以用于调整模型的超参数和用于对模型的能力进行初步评估。
测试集,用来评估模最终模型的泛化能力。但不能作为调参、选择特征等算法相关的选择的依据。

选择算法并建立模型

最常用的算法工具包是 scikit-learn,简称 sklearn,它是使用最广泛的开源 Python 机器学习库,堪称机器学习神器。

模型的参数

内部参数和外部参数。内部参数是属于算法本身的一部分,不用我们人工来确定,刚才提到的权重 w 和截距 b,都是线性回归模型的内部参数;而外部参数也叫做超参数,它们的值是在创建模型时由我们自己设定的。

深度学习

最基本、最简单的神经网络就是逻辑回归模型。神经网络需要对数据进行归一化的操作。

深度学习特别擅长处理非结构化的数据。传统的模型需要先做各种各样的特征工程,让数据变得“计算机友好”,再输入模型进行学习。而深度学习模型则可以自动进行特征提取,因此就省略掉了手工做特征工程的环节。

集成学习

集成学习的核心思想是训练出多个模型并将这些模型进行组合。根据分类器的训练方式和组合预测的方法,集成学习中两种最重要的方法就是:降低偏差的 Boosting 和降低方差的 Bagging。

训练模型

训练模型就是用训练集中的特征变量和已知标签,根据当前样本的损失大小来逐渐拟合函数,确定最优的内部参数,最后完成模型。

在模型训练的过程中,控制模型的复杂度,防止过拟合。比如决策树的最大深度,和回归模型的正则化。

模型的评估和优化

在验证集或者测试集进行模型效果评估的过程中,我们则是通过最小化误差来实现超参数(模型外部参数)的优化。

如果模型的评估分数不理想,我们就需要回到第 3 步,调整模型的外部参数,重新训练模型。要是得到的结果依旧不理想,那我们就要考虑选择其他算法,创建全新的模型了。如果很不幸,新模型的效果还是不好的话,我们就得回到第 2 步,看看是不是数据出了问题。

对于过拟合的讨论,我们多限于监督学习的应用范围,也就是回归和分类两大类问题。当然,也有人认为无监督学习中也存在过拟合现象,但是无监督学习中的过拟合被讨论的不多。

模型评估方法

机器学习模型预测误差情况通常是评估的重点,我们主要对回归和分类模型的评估方法进行介绍。

回归模型的误差评估指标

评估回归模型的误差,比较简单的思路,可以对真实值与预测值的差异“取正”后求平均。

  • 均方误差(MSE) 均方误差(MSE)为实际值与预测值的差值取平方求平均。
  • 均方根误差(RMSE) 对MSE的开根号
  • 平均绝对误差(MAE)是预测值与真实值之间的误差取绝对值的平均

分类模型的误差评估指标

  • 混淆矩阵
    混淆矩阵
  1. 准确率(accuracy)即所有的预测正确(TP+TN)的占总数(TP+FP+TN+FN)的比例;
  2. 查准率(precision)是指分类器预测为 Positive 的正确样本(TP)的个数占所有预测为Positive样本个数(TP+FP)的比例;
  3. 查全率(recall)是指分类器预测为 Positive 的正确样本(TP)的个数占所有的实际为Positive样本个数(TP+FN)的比例。
  4. 错误率是指分类器预测为 Positive 的错误样本(FP)的个数占所有实际为Negtive样本个数(FP+TN)的比例;
  5. ROC 曲线,即以错误率为 X 轴,查全率为 Y轴。我们通过求解ROC曲线下的面积,也就是AUC(Area under Curve),AUC可以直观的评价分类器的好坏,通常介于0.5和1之间,值越大越好。

模型的稳定性评估指标

我们通常用群体稳定性指标(Population Stability Index,PSI), 衡量未来的(测试集)样本及模型训练样本评分的分布比例是否保持一致,以评估模型的稳定性。

PSI计算以训练样本的模型评分作为稳定性的参考点(预期分数占比),衡量未来的实际预测分数(实际分布占比)的误差情况。计算公式为 SUM(各分数段的 (实际占比 - 预期占比)* ln(实际占比 / 预期占比) )

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值