写点什么

机器学习完整路径

作者:木南曌
  • 2023-08-17
    上海
  • 本文字数:3306 字

    阅读完需:约 11 分钟

一个机器学习项目从开始到结束大致分为 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 类来选择特征。

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

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

from sklearn.feature_selection import SelectKBestfrom 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 SelectKBestfrom sklearn.feature_selection import chi2 #选择K个最好的特征,返回选择特征后的数据SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)
复制代码


数据降维

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

构建特征集和标签集

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

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

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

选择算法并建立模型

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

模型的参数

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

深度学习

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


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

集成学习

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

训练模型

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


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

模型的评估和优化

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


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


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

用户头像

木南曌

关注

还未添加个人签名 2018-10-28 加入

还未添加个人简介

评论

发布
暂无评论
机器学习完整路径_机器学习_木南曌_InfoQ写作社区