机器学习完整路径
一个机器学习项目从开始到结束大致分为 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 地址、邮箱、家庭住址、手机号等。思路是用特征值的平均值来替换具体的类别。
特征选择
在一个数据集中,每个特征在标签预测或分类过程中发挥的作用其实都不同。对于那些没作用和作用小的数据,我们就可以删掉,来降低数据的维度,节省模型拟合时的计算空间。
自动特征选择工具,klearn 的 feature_selection 模块中,有很多自动特征选择工具。SelectKBest 的原理和使用都非常简单,它是对每个特征和标签之间进行统计检验,根据 X 和 y 之间的相关性统计结果,来选择最好的 K 个特征,并返回。
过滤法
方差选择法
使用方差选择法,先要计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征。使用 feature_selection 库的 VarianceThreshold 类来选择特征。
相关系数法
使用相关系数法,先要计算各个特征对目标值的相关系数以及相关系数的 P 值。用 feature_selection 库的 SelectKBest 类结合相关系数来选择特征。
卡方检验
针对离散变量,经典的卡方检验是检验定性自变量对定性因变量的相关性。
数据降维
把多维特征压缩成低维的特征,也就是通过算法实现特征选择,减少特征的数目。常见的降维算法有两种:主成分分析法(PCA)和线性判别分析(LDA)。PCA 是一种无监督的降维方法,而 LDA 是一种有监督的降维方法。
构建特征集和标签集
主要是针对监督学习,拆分出特征和标签。
拆分训练集、验证集和测试集
训练集用来训练模型,验证集用来模型调优,测试集用来评估模型性能。验证集,是模型训练过程中单独留出的样本集,它可以用于调整模型的超参数和用于对模型的能力进行初步评估。测试集,用来评估模最终模型的泛化能力。但不能作为调参、选择特征等算法相关的选择的依据。
选择算法并建立模型
最常用的算法工具包是 scikit-learn,简称 sklearn,它是使用最广泛的开源 Python 机器学习库,堪称机器学习神器。
模型的参数
内部参数和外部参数。内部参数是属于算法本身的一部分,不用我们人工来确定,刚才提到的权重 w 和截距 b,都是线性回归模型的内部参数;而外部参数也叫做超参数,它们的值是在创建模型时由我们自己设定的。
深度学习
最基本、最简单的神经网络就是逻辑回归模型。神经网络需要对数据进行归一化的操作。
深度学习特别擅长处理非结构化的数据。传统的模型需要先做各种各样的特征工程,让数据变得“计算机友好”,再输入模型进行学习。而深度学习模型则可以自动进行特征提取,因此就省略掉了手工做特征工程的环节。
集成学习
集成学习的核心思想是训练出多个模型并将这些模型进行组合。根据分类器的训练方式和组合预测的方法,集成学习中两种最重要的方法就是:降低偏差的 Boosting 和降低方差的 Bagging。
训练模型
训练模型就是用训练集中的特征变量和已知标签,根据当前样本的损失大小来逐渐拟合函数,确定最优的内部参数,最后完成模型。
在模型训练的过程中,控制模型的复杂度,防止过拟合。比如决策树的最大深度,和回归模型的正则化。
模型的评估和优化
在验证集或者测试集进行模型效果评估的过程中,我们则是通过最小化误差来实现超参数(模型外部参数)的优化。
如果模型的评估分数不理想,我们就需要回到第 3 步,调整模型的外部参数,重新训练模型。要是得到的结果依旧不理想,那我们就要考虑选择其他算法,创建全新的模型了。如果很不幸,新模型的效果还是不好的话,我们就得回到第 2 步,看看是不是数据出了问题。
对于过拟合的讨论,我们多限于监督学习的应用范围,也就是回归和分类两大类问题。当然,也有人认为无监督学习中也存在过拟合现象,但是无监督学习中的过拟合被讨论的不多。
评论