从业场景抽象出问题—>数据获取/采集—>数据清洗—>探索性数据分析—>特征工程 ( 数据采样、特征处理、特征降维[ 特征选择 or 线性降维 ] )—>选择和应用场景以及数据类型相符的机器学习模型
数据采集:哪些数据丢最后的预测结果有帮助?能否采集到这类数据?线上实时计算时数据获取是否快捷?
数据清洗:最后机器学习模型预测结果的好坏 肯定取决于 原材料——数据 的好坏。数据清洗就是要去除“脏”数据。
特征降维之前还可能做的事情:
数据采样【正对样本类别不平衡问题】、特征处理【标准化、归一化、二值化、哑编码、缺失值、数据转换…】
数据在采集、清洗过后,正负样本有可能是不均衡的。所以要进行数据采样,采样的方式有随机采样 和 分层抽样。
但是随机采样存在隐患,因为随机采样得到的数据很不均匀,因此更多的是根据特征进行分层抽样。
★正负样本不平衡的处理办法:
正样本>负样本,样本量大的话,可以采用下采样。
样本量不大的话,可以使用上采样,如:图像识别中的 镜像 和 旋转;修改损失函数,设置样本权重。
【周志华 《机器学习》3.6节有介绍】
学习链接:https://mp.weixin.qq.com/s/tG9igr5dXawr_ZDWnLwRgg
网上对于 标准化、归一化这两个词的解释,以及代表的含义 五花八门…这里干脆用 feature scaling 统一起来。
feature scaling 的两个原因:
如果将每一个样本按列排放,即,每一列代表一个样本,每一行代表一个特征维度(和我们平常用的反过来)。那么,前三种方法都是逐行操作,即,对所有样本的特定特征维度进行操作,变化主要体现在特征上。最后一种方法是对一个个样本,逐列进行操作。
前三种都可以看作是去量纲的方法【因为分子分母相除,单位消失】,降低特征尺度的影响,可以看作是某种尺度无关操作。但是,最大最小值缩放对outliers比较敏感。outliers对后者的影响与outliers数量和数据集大小有关,outliers越少,数据集越大,影响越小。
最后一种除以长度,把所有样本映射到单位球上,可以看作是某种长度无关操作。【计算余弦距离、内积相似度时需要】
观察上图,standardization是不会消除变量之间的线性相关性的。
多重共线性指的是特征变量彼此线性相关。
特征变量之间如果存在多重共线性 该如何处理?
PCA是一个解决办法,PCA 降维后,得到的特征的相关性会降低。但是,PCA会丢掉特征的可解释性。【可以计算PCA前后特征的方差膨胀因子VIF,看看是否是这样。】
特征选择是建模中常用的降维手段,比较暴力,直接将不重要特征删除。
缺点:造成信息丢失,不利于模型精度。【与之形成对比的是PCA、LDA等降维方式。】
主要标准有两个:
注:在进行特征工程之前,需要进行特征的设计,因为没有特征又何来的特征选择?项目提供的数据集特征不一定就能直接作为模型训练的特征,需要对具体场景进行理解、建模,得到合理的特征,毕竟“数据决定了机器学习模型能力的上限”。
使用统计的方式对特征进行打分排名。
优点:有统计学理论分析保证。
缺点:独立考虑每个特征与目标相关性,忽略不同特征之间关联性。【与之对比的是wrapper和embedded等特征选择方式。】
简介:
用于 连续型 与 连续型 变量的相关性分析。所以主要用于回归模型,各个 特征与目标之间 的线性相关性。
属于过滤式(filter)特征筛选。pearson相关系数描述两个变量间的相关性,即两个变量在随时间变化过程中,是同向变化,还是反向变化,还是其他。同向变化,即正相关,pearson系数接近1;反向变化即负相关,pearson系数接近-1;其他变化Pearson系数刻画不出来【只能刻画线性相关】,pearson系数接近0。
spearman相关系数刻画两个变量之间是否有单调关系。定义为两个变量秩统计量的pearson相关系数。
操作:
可以筛选与target,pearson相关系数大于0.5的特征;或者,依据相关系数进行特征排序,取前几名。
说明:
相关系数主要用于判别线性相关,对于target变量如果存在更复杂的函数形式的影响,建议使用树模型的特征重要性去筛选。
简介:
用于 类别型 与 类别型 变量的相关性分析。所以主要用于分类模型。
卡方统计量公式:
X α 2 = Σ i ( O i − E i ) 2 E i \mathcal{X}_{\alpha}^2=\Sigma_i \frac{(O_i - E_i)^2}{E_i} Xα2=ΣiEi(Oi−Ei)2
其中, α \alpha α代表自由度,O代表观察值,E代表期望值。
理论具体可以看这篇:https://blog.csdn.net/weixin_44360866/article/details/127108754
操作:
可以筛选与target,卡方值大的特征。
为什么是筛选卡方值大的?因为卡方值很大,就拒绝原假设,原假设是两变量之间无关。
简介:
用于 类别型 与 类别型 变量的相关性分析。所以主要用于分类模型。
有关信息论的基础可以看:https://blog.csdn.net/weixin_44360866/article/details/126304210
两个随机变量X,Y互信息的定义思路就是:已知Y后,X的不确定性减少了多少。因此,可以用来衡量两个变量之间相互依赖程度的度量。
公式:
I ( X , Y ) = Σ x ∈ X Σ y ∈ Y p ( x , y ) l o g p ( x , y ) p ( x ) p ( y ) I(X,Y)=\Sigma_{x\in \mathcal{X}\Sigma_{y\in \mathcal{Y}}} p(x,y){\rm log}\frac{p(x,y)}{p(x)p(y)} I(X,Y)=Σx∈XΣy∈Yp(x,y)logp(x)p(y)p(x,y)
两个变量独立时,联合概率等于边际概率的乘积,所以log里面的值都等于1,log1为0,因此,互信息为0.
优缺点:
MIC要比相关系数general,不管是什么函数的相关关系,都能识别。
不需要标准化/归一化,不同数据集可以直接识别。
线性相关性有时不如pearson相关系数强。独立性检测不如dcor(距离相关系数)。用于大规模探索性分析会产生太多错误判例。
操作:
可以看到公式中设计计算两个变量的概率分布。具体数据集中,使用频率代替概率。【蒙特卡洛思想】
计算各个特征和target的MIC,进行排名,选前几名。
图例:
简介:
属于过滤式特征选择。
不同于上面依照——与目标的相关性程度,这个评价标准进行特征选择,方差选择法根据——特征自身的发散程度,进行特征选择。
发散程度越大的变量,提供的信息越多。而方差就是衡量变量发散程度的一个指标。
变量的方差大家都会算,不放公式了。
操作:
根据阈值选择方差大于阈值的特征。
注:不同的特征单位不同,所以不能直接根据方差进行特征筛选。需要进行归一化 or 标准化 后再用。
更加常用的是变异系数。
也称相对标准差、标准偏差系数
为了针对单位不一致时,可以更加准确地说明两组数据的离散程度,就引入了相对标准差,只需要用标准差除以均值。
公式:
1.总体CV: C V = σ μ CV = \frac{\sigma}{\mu} CV=μσ
2.样本CV: C V = S X ˉ CV = \frac{S}{\bar{X}} CV=XˉS
将机器学习的模型训练过程与特征筛选过程融为一体,在模型训练完成之后便可得出哪些特征是有用的,哪些是没用的。
但是,只有特定的模型能够用来做特征选择。
目前常用的有两种:
树的集成算法最著名的有 随机森林Random Forest、梯度提升树Gradient Boosting Decision Tree.
随机森林属于Bagging,使用自助采样Bootstrap,可以并行训练 ;GBDT属于Boosting,每一轮训练一棵树,且改善前一轮的结果,所以不能并行,使用的是前向分步算法的优化框架。
随机森林具有很好的抵抗过拟合的特性,参数(决策树的个数)对预测能力的影响较小,调参比较容易,一般设置一个较大的数。
GBDT理论丰富,一般性能更加有优势。
关于GBDT:
https://blog.csdn.net/weixin_44360866/article/details/127143440
GBDT详细原理:https://blog.csdn.net/yangxudong/article/details/53872141
关于随机森林:https://wap.sciencenet.cn/blog-3431904-1263043.html?mobile=1
随机森林做特征选择:https://zhuanlan.zhihu.com/p/404691931
RF是通过包外OOB误差率来计算特征重要程度的。
GBDT做特征选择:https://zhuanlan.zhihu.com/p/344052390
GBDT是计算 每一个树中,与特征相关的节点减少了多少平方损失,然后相加 作为特征重要程度的。
其实只要是树 or 森林,就可以按照上面GBDT的思路计算特征重要程度。所以,XGboost、lightGBM也可以用来计算特征重要程度。
【再附上XGboost的学习链接:https://zhuanlan.zhihu.com/p/142413825
lightGBM文档:https://lightgbm.readthedocs.io/en/latest/index.html
lightGBM学习链接:https://www.biaodianfu.com/lightgbm.html】
注意:GBDT中的树一定是回归树!!
只提供代码进行举例:
未完待续…