零基础入门数据挖掘-Task3 特征工程

前言

零基础入门数据挖掘-Task1 赛题理解
零基础入门数据挖掘-Task2 数据分析
时间:2020.03.28


内容介绍

今天讲一下特征工程,梳理一下自己的思路。特征工程对于机器学习来说是重中之重,在对数据有了较深的理解分析之后,在大家选的模型及参数基本雷同的情况下,如何进一步提高模型性能,你需要特征工程。

数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。

前期阶段,我们对数据进行了预处理,这也可以算做简单的特征工程。我们对powerlog以及分箱处理,过滤掉一些相关系数高的匿名特征,删除类别不平衡的特征,例如:sellerofferType以及creatDate中的年份等。我们还创建了一些有趣的新特征,例如:根据相对时间计算出来使用时间used_time,由于数据本身月份存在00月份异常,我们把异常月份处理成了空值。接下来,我们系统地研究一下特征工程,以期掌握更多的特征处理技术,挖掘出更多有意义的特征,让我们开始吧!

数据清洗

这一部分的内容主要承接上一篇文章中数据分析的部分,我把它称为数据预处理,因为这个在数据分析的前期阶段就可以简单的完成。虽然它也属于特征工程的一部分,但在这里,我们把它拎出来系统讨论一下。

对数据进行预处理,一般常用的两种数据类型为:

  • 结构化数据。结构化数据可以看作是关系型数据库的一张表,每列都有清晰的定义,包含了数值型和类别型两种基本类型;每一行数据表示一个样本的信息。
  • 非结构化数据。主要是文本、图像、音频和视频数据,其包含的信息无法用一个简单的数值表示,也没有清晰的类别定义,并且每个数据的大小互不相同。

本文为契合二手车交易价格预测赛题,主要介绍结构化数据的预处理方法。

缺失值

  • 不处理(针对类似 XGBoost、LightGBM 树模型)
  • 删除(缺失数据太多)
  • 插值补全,包括均值/中位数/众数/建模预测/多重插补/压缩感知补全/矩阵补全(R-SVD)/最近邻补全/手动补全等
  • 分箱,缺失值一个箱
  • 高维映射(One-hot)

缺失值鉴别统计,可以使用:

.info()
.isnull().sum()

本赛题中:

  • notRepairedDamage不走寻常路,需要分析数据类型来判断
  • power为0,按照道理来说也应该算是缺失值

异常值

  • 通过箱线图(或 3-Sigma)分析删除异常值
  • Box-Cox 转换(处理有偏分布)
  • 利用模型进行离群点检测:聚类、K近邻、One Class SVM、Isolation Forest

异常值对于回归问题来说是非常严肃的,“近朱者赤近墨者黑”,异常值在这里把这句话演绎的非常出色。模型如果对异常值拟合,结果不言而喻,将会严重带偏模型预测趋势。

异常值的检测:

# 可以通过查看数据统计信息来判断
.describe()
# 可以通过对数据可视化查看数据分布来判断
.plot.hist() #直方图
.boxplot() #箱型图
箱型图

这种方法是利用箱型图的四分位距(IQR)对异常值进行检测,也叫Tukey‘s test。箱型图的定义如下:
boxplot
四分位距(IQR)就是上四分位与下四分位的差值。而我们通过IQR的1.5倍为标准,规定:超过上四分位+1.5倍 IQR 距离,或者下四分位-1.5倍 IQR 距离的点为异常值。这里,可以通过.quantile()实现具体的四分位数、十分位数等的划分。

3∂原则

这个原则有个条件:数据需要服从正态分布。在 3∂ 原则下,异常值如超过 3 倍标准差,那么可以将其视为异常值。正负3∂ 的概率是 99.7%,那么距离平均值 3∂ 之外的值出现的概率为P(|x-u| > 3∂) <= 0.003,属于极个别的小概率事件。如果数据不服从正态分布,也可以用远离平均值的多少倍标准差来描述。如下图所示:
3-Sigma

Box-Cox 变换

平方根变换和对数变换都可以推广为 Box-Cox 变换:

λ ≠ 0 λ≠0 λ=0时, x j = x λ − 1 λ x_j = \frac{x^λ-1}{λ} xj=λxλ1 ;
λ = 0 λ=0 λ=0时, x j = l n ( x ) x_j = ln(x) xj=ln(x) .

此时,我们能够知道,当 λ = 0 λ=0 λ=0时为对数变换;当 λ = 0.5 λ=0.5 λ=0.5时,为平方根变换的平移形式;当 λ = 0.75 λ=0.75 λ=0.75时,为Box-Cox变换。 λ < 1 λ<1 λ<1,可以压缩高端值; λ > 1 λ>1 λ>1,起到相反的作用。

本赛题:

  • pricepower偏尾分布,可以采用logBox-Cox处理

参考代码为:

# log(x+1)
np.log1p(x)
# 反向操作
np.expm1(x)
# Box-Cox
from scipy import stats
stats.boxcox(x, lmba=0.75)

其它内容可以参考:特征工程之数据预处理

特征缩放

  • 归一化(转换到 [0,1] 区间)
  • 正则化(L1、L2范数)
  • 针对幂律分布,可以采用公式 l o g ( 1 + x 1 + m e d i a n ) log(\frac{1+x}{1+median}) log(1+median1+x)

归一化(Normalization),这里不仅仅是对特征,实际上对于原始数据也可以进行归一化处理,它是将特征(或者数据)都缩放到一个指定的大致相同的数值区间内。

常用的两种归一化方法:

  • 线性函数归一化(Min-Max Scaling)。它对原始数据进行线性变换,使得结果映射到[0, 1]的范围,实现对原始数据的等比缩放,公式如下:
    X n o r m = X − X m i n X m a x − X m i n X_{norm} = \frac{X-X_{min}}{X_{max}-X_{min}} Xnorm=XmaxXminXXmin
  • 零均值归一化(Z-Score Normalization)。它将原始数据映射到均值为 0,标准差为 1 的标准正态分布上。公式如下:
    z = x − μ σ z =\frac{x-μ}{σ} z=σxμ

通过梯度下降法求解的模型是需要归一化的,这包括线性回归、逻辑回归、支持向量机、神经网络等模型。但决策树模型不需要,以 C4.5 算法为例,决策树在分裂结点时候主要依据数据集 D 关于特征 x 的信息增益比,而信息增益比和特征是否经过归一化是无关的,归一化不会改变样本在特征 x 上的信息增益。

正则化(regularization) 是将样本或者特征的某个范数(如 L1、L2 范数)缩放到单位 1。

计算方法为:

  • 对样本首先计算 L p L_p Lp 范数,然后每个属性值除以其 L p L_p Lp 范数。

正则化的过程是针对单个样本的,对每个样本将它缩放到单位范数。归一化是针对单个属性的,需要用到所有样本在该属性上的值。

通常如果使用二次型(如点积)或者其他核方法计算两个样本之间的相似性时,该方法会很有用。

本赛题:

  • power对其取 log,再做Min-Max归一化
  • kilometer直接Min-Max归一化
  • 一般会服从长尾分布,可以取 log 再做归一化,减少精度损失
  • 可以对used_time、匿名变量归一化

特征编码

  • 序号编码(Ordinal Encoding)
  • 独热编码(One-hot Encoding)
  • 离散化:分桶
  • 二进制编码
  • 二元化

序号编码用于数据间有一定的大小关系,这样序号的大小具有其特定的含义;独热编码通常用于处理类别间不具有大小关系的特征。

决策树模型不推荐对离散特征进行 one-hot。 主要有两个原因:

一、会产生样本切分不平衡问题:本来特征是红的白的绿的,现在变为是否红的、是否白的、是否绿的。只有少量样本为 1,大量样本为 0。这种特征的危害是:

  • 本来节点的划分增益还可以,但是拆分后的特征,占总样本的比例小的特征,无论增益多大,乘以该比例之后会很小,占比例大的特征其增益也几乎为 0,影响模型学习。

二、影响决策树学习:决策树依赖的是数据的统计信息,one-hot 会把数据切分到零散的小空间上,在这些零散的小空间上,统计信息是不准确的,并且围绕小部分数据展开,有过拟合倾向。

其本质在于,特征的预测能力被人为的拆分成多份,每一份与其他特征竞争最优划分节点时都会失败,所以特征的重要性会比实际值低。

PS:如果类别特征比较多的话,可以去使用 CatBoost;如果想用 one-hot 试验的话可以使用类别数量小的。

独热编码通常只有部分维度是对分类、预测有帮助的,需要借助特征选择来降低维度。

常见的特征工程包括:
特征工程介绍

特征工程

进行了基本的特征处理之后,接下来介绍特征提取、特征选择、特征构造这三个重要工作,在我个人看来,这是目前特征工程里难度比较大的地方。

特征提取

特征提取一般是在特征选择之前,它提取的对象是原始数据。

目的:自动地构建新的特征,将原始数据转换为一组具有明显物理意义(比如 Gabor、几何特征、纹理特征)或者统计意义的特征。

  1. PCA(Principal Component Analysis,主成分分析):PCA 是降维最经典的方法,它旨在是找到数据中的主成分,并利用这些主成分来表征原始数据,从而达到降维的目的。通过 PCA ,就可以将方差较小的特征给抛弃。PCA 是一种线性降维方法,这也是它的一个局限性。不过也有很多解决方法,比如采用核映射对 PCA 进行拓展得到核主成分分析(KPCA),或者是采用流形映射的降维方法,比如等距映射、局部线性嵌入、拉普拉斯特征映射等,对一些 PCA 效果不好的复杂数据集进行非线性降维操作。
  2. LDA(Linear Discriminant Analysis,线性判别分析):LDA 是一种有监督学习算法,相比较 PCA,它考虑到数据的类别信息,而 PCA 没有考虑,只是将数据映射到方差比较大的方向上而已。因为考虑数据类别信息,所以 LDA 的目的不仅仅是降维,还需要找到一个投影方向,使得投影后的样本尽可能按照原始类别分开,即寻找一个可以最大化类间距离以及最小化类内距离的方向。
  3. ICA(Independent Component Analysis,独立成分分析):PCA特征转换降维,提取的是不相关的部分,ICA独立成分分析,获得的是相互独立的属性。ICA算法本质寻找一个线性变换 z = Wx,使得z 的各个特征分量之间的独立性最大。通常先采用 PCA 对数据进行降维,然后再用 ICA 来从多个维度分离出有用数据。PCA 是 ICA 的数据预处理方法。

本赛题:

  • 可以对匿名特征{ v i v_i vi}进行降维操作
  • 首先,可以计算累计方差贡献率,其表示PCA保留数据内容的性能
  • 其次,选择合适的维度进行PCA降维处理

代码如下:

# 选择合适的维度进行PCA降维处理
v_cols = ['v_{}'.format(i) for i in range(15)]
data_v = data[v_cols]
pca = PCA(9, svd_solver='randomized')
pca_v = pca.fit_transform(data_v)

特征选择

目的:降低噪声,平滑预测能力和计算复杂度,增强模型预测性能。

  1. 过滤式(Filter):先用特征选择方法对初识特征进行过滤然后再训练学习器,特征选择过程与后续学习器无关。
    a) Relief/方差选择/相关系数/卡方检验/互信息法
  2. 包裹式(Wrapper):直接把最终将要使用的学习器的性能作为衡量特征子集的评价准则,其目的在于为给定学习器选择最有利于其性能的特征子集。
    a) Las Vegas Wrapper(LVM)
  3. 嵌入式(Embedding):结合过滤式和包裹式方法,将特征选择与学习器训练过程融为一体,两者在同一优化过程中完成,即学习器训练过程中自动进行了特征选择。
    a) LR+L1或决策树

最简单的特征选择方法是:去掉取值变化小的特征,就像本赛题中删除offerTypeseller

过滤式评价:

  • 优点是计算时间上比较高效,而且对过拟合问题有较高的鲁棒性
  • 缺点是倾向于选择冗余特征,即没有考虑到特征之间的相关性

包裹式评价

  • 优点是直接针对特定学习器进行优化,考虑到特征之间的关联性,因此通常包裹式特征选择比过滤式特征选择能训练得到一个更好性能的学习器
  • 缺点是由于特征选择过程需要多次训练学习器,故计算开销要比过滤式特征选择要大得多

大多数时候用的是嵌入式特征选择方法,常用的方法包括:

  • 利用正则化,如 L 1 L_1 L1, L 2 L_2 L2范数,主要应用于如线性回归、逻辑回归以及支持向量机(SVM)等算法;
  • 使用决策树思想,包括决策树、随机森林、Gradient Boosting 等。

常见的嵌入式选择模型有:

  • 在 Lasso 中,λ 参数控制了稀疏性:
    如果 λ 越小,则稀疏性越小,被选择的特征越多;
    相反 λ 越大,则稀疏性越大,被选择的特征越少。
  • 在 SVM 和 逻辑回归中,参数 C 控制了稀疏性:
    如果 C 越小,则稀疏性越大,被选择的特征越少;
    如果 C 越大, 则稀疏性越小,被选择的特征越多。

特征构造

目的:增强数据表达,添加先验知识。

  1. 统计量特征:
    a) 计数、求和、比例、标准差;
  2. 时间特征:
    a) 绝对时间、相对时间、节假日、双休日;
  3. 地理信息:
    a) 分桶;
  4. 非线性变换:
    a) 取 log/平方/根号;
  5. 数据分桶:
    a) 等频/等距分桶、Best-KS 分桶、卡方分桶;
  6. 特征组合

话不多说,想要了解更详细的内容可以查看我的参考文档。之后,我们直接根据赛题,对特征进行梳理,实战出真知。

参考

Datawhale 零基础入门数据挖掘-Task3 特征工程
机器学习缺失值处理方法汇总


— End —

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值