目录

一、数据预处理

1.异常值处理

2.缺失值处理

3.不均衡样本-数据采样

1.欠采样(undersampling)

2.过采样(oversampling)

3.阈值移动

4.基于聚类的过采样方法

4.时间类型数据处理

5.文本类型数据处理

6.数据有偏分布处理

1.Box-Cox

2.使倾斜分布对称

3.非线性关系转换成线性

二、特征处理

1.标准化、归一化处理

1.标准化

2.区间缩放法

3.归一化

2.连续特征离散化

1.定量特征二值化

2.数据分桶

3.基于聚类分析的方法

4.使用GDBT

3.离散特征连续化

1.定性特征哑编码

2.特征嵌入

4.数据转换

(1)多项式转换

(2)对数变换

总结

三、特征构造

四、特征选择(也属于特征降维)

1.特征选择的定义

2.特征选择的方法

过滤式

包裹式

嵌入式

3.特征选择在python中的实现方法

1)VarianceThreshold

2)SelectKBest

3)RFE

4)SelectFromModel

五、特征降维

1.线性降维

1.主成分分析法(PCA)

2.线性判别分析法(LDA)

3.矩阵分解(SVD)


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

特征工程一般包括特征使用特征获取特征处理特征选择特征监控

特征工程的处理流程为首先去掉无用特征,接着去除冗余特征,如共线特征,并利用存在的特征、转换特征、内容中的特征以及其他数据源生成新特征,然后对特征进行转换(数值化、类别转换、归一化等),最后对特征进行处理(异常值、最大值、最小值、缺失值等),以符合模型的使用。

一、数据预处理

1.异常值处理

一般采用删除转换填充区别对待等方法进行处理。

  • 删除:如果是由输入误差、数据处理误差引起的异常值,或者异常值很小,则可以直接删除
  • 转换:数据转换可以消除异常值,如对数据取对数会减轻由极值引起的变化
  • 填充:一般采用平均值、中值、预测模型填充等等
  • 区别对待:如果存在大量的异常值,则应该在统计模型中区别对待。其中一个方法是将数据分为两个不同的组,异常和非异常的分别归为一组,且两组分别建立模型,最终将两组的输出合并

2.缺失值处理

1.不处理(针对类似 XGBoost 等树模型,有些模型有处理缺失的机制,所以可以不处理);
2.删除(缺失数据太多);
3.插值补全,包括均值/中位数/众数/建模预测/多重插补/压缩感知补全/矩阵补全等;
4.分箱,缺失值一个箱;

下面介绍具体方法:

  • fillna填充
#分组均值补充
age_group_mean = combined.groupby(['Sex', 'Pclass', 'Title'])['Age'].mean().reset_index()
#使用平均值填充。
combined['Fare'].fillna(combined['Fare'].mean(), inplace=True)
#Embarked:只有两个缺失值,使用众数填充。
combined['Embarked'].fillna(combined['Embarked'].mode(), inplace=True)
# 删除重复值
data.drop_duplicates()
# dropna()可以直接删除缺失样本,但是有点不太好# 填充固定值
train_data.fillna(0, inplace=True) # 填充 0
data.fillna({0:1000, 1:100, 2:0, 4:5})   # 可以使用字典的形式为不用列设定不同的填充值train_data.fillna(train_data.mean(),inplace=True) # 填充均值
train_data.fillna(train_data.median(),inplace=True) # 填充中位数
train_data.fillna(train_data.mode(),inplace=True) # 填充众数train_data.fillna(method='pad', inplace=True) # 填充前一条数据的值,但是前一条也不一定有值
train_data.fillna(method='bfill', inplace=True) # 填充后一条数据的值,但是后一条也不一定有值"""插值法:用插值法拟合出缺失的数据,然后进行填充。"""
for f in features: train_data[f] = train_data[f].interpolate()train_data.dropna(inplace=True)"""填充KNN数据:先利用knn计算临近的k个数据,然后填充他们的均值"""
from fancyimpute import KNN
train_data_x = pd.DataFrame(KNN(k=6).fit_transform(train_data_x), columns=features)# 还可以填充模型预测的值
  • SimpleImputer类处理缺失值

3.不均衡样本-数据采样

采集、清洗过数据以后,正负样本是不均衡的,采取措施:负样本过采样训练多个模型后求平均调整模型的损失函数样本比例的权重等。

采样的方法有随机采样和分层抽样。但是随机采样会有隐患,因为可能某次随机采样得到的数据很不均匀,更多的是根据特征采用分层抽样。  

正负样本不平衡处理办法:

正样本 >> 负样本,且量都挺大 => 采用下采样(downsampling)的方法

正样本 >> 负样本,量不大 =>  可以采用以下方法采集更多的数据:

    1)上采样(oversampling),比如图像识别中的镜像和旋转

    2)修改损失函数(loss function)设置样本权重

不平衡数据集介绍和处理方法

1.欠采样(undersampling)

欠采样(undersampling)法是去除训练集内一些多数样本,使得两类数据量级接近,然后在正常进行学习。

缺点:放弃了很多反例,这会导致平衡后的训练集小于初始训练集。而且如果采样随机丢弃反例,会损失已经收集的信息,往往还会丢失重要信息。

基本的算法如下:

def undersampling(train, desired_apriori):# Get the indices per target valueidx_0 = train[train.target == 0].indexidx_1 = train[train.target == 1].index# Get original number of records per target valuenb_0 = len(train.loc[idx_0])nb_1 = len(train.loc[idx_1])# Calculate the undersampling rate and resulting number of records with target=0undersampling_rate = ((1-desired_apriori)*nb_1)/(nb_0*desired_apriori)undersampled_nb_0 = int(undersampling_rate*nb_0)print('Rate to undersample records with target=0: {}'.format(undersampling_rate))print('Number of records with target=0 after undersampling: {}'.format(undersampled_nb_0))# Randomly select records with target=0 to get at the desired a prioriundersampled_idx = shuffle(idx_0, n_samples=undersampled_nb_0)# Construct list with remaining indicesidx_list = list(undersampled_idx) + list(idx_1)# Return undersample data frametrain = train.loc[idx_list].reset_index(drop=True)return train

因为对应具体的project,所以里面欠采样的为反例,如果要使用的话需要做一些改动。

欠采样改进方法1

但是我们可以更改抽样方法来改进欠抽样方法,比如把多数样本分成核心样本和非核心样本,非核心样本为对预测目标较低概率达成的样本,可以考虑从非核心样本中删除而非随机欠抽样,这样保证了需要机器学习判断的核心样本数据不会丢失。
举例来说依然是预测用户注册这个目标,我们可以将跳出率为100%的用户名下的所有会话都可以划分为非核心样本,因为跳出用户包含的信息量非常少(其他行为特征为空),将此部分用户样本排除可以最大可能的保留更多原始数据信息。

欠采样改进方法2

欠采样法若随机丢弃反例,可能会丢失一些重要信息。为此,周志华实验室提出了欠采样的算法EasyEnsemble利用集成学习机制,将反例划分为若干个集合供不同学习器使用,这样对每个学习器来看都进行了欠采样,但在全局来看却不会丢失重要信息。其实这个方法可以再基本欠采样方法上进行些许改动即可:

def easyensemble(df, desired_apriori, n_subsets=10):train_resample = []for _ in range(n_subsets):sel_train = undersampling(df, desired_apriori)train_resample.append(sel_train)return train_resample

PS: 对于类别不平衡的时候采用CV进行交叉验证时,由于分类问题在目标分布上表现出很大的不平衡性。如果用sklearn库中的函数进行交叉验证的话,建议采用如StratifiedKFold 和 StratifiedShuffleSplit中实现的分层抽样方法,确保相对的类别概率在每个训练和验证折叠中大致保留。

2.过采样(oversampling)

过采样(oversampling)是对训练集内的少数样本进行扩充,既增加少数样本使得两类数据数目接近,然后再进行学习。

简单粗暴的方法是复制少数样本,缺点是虽然引入了额外的训练数据,但没有给少数类样本增加任何新的信息,非常容易造成过拟合。

过采样改进方法1

通过抽样方法在少数类样本中加入白噪声(比如高斯噪声)变成新样本一定程度上可以缓解这个问题。如年龄,原年龄=新年龄+random(0,1)

过采样代表算法:SMOTE 算法

SMOTE[Chawla et a., 2002]是通过对少数样本进行插值来获取新样本的。比如对于每个少数类样本a,从 a最邻近的样本中选取 样本b,然后在对 ab 中随机选择一点作为新样本。

3.阈值移动

这类方法的中心思想不是对样本集合做再平衡设置,而是对算法的决策过程进行改进

举个简单的例子,通常我们对预测结果进行分类时,当预测 y( y 代表正类可能性) 值>0.5时,判定预测结果为正,反之为负。规定决策规则

不难发现,只有当样本中正反比例为1:1时,阈值设置为0.5才是合理的。如果样本不平衡决策规则需要进行变更,另  m+ 代表正例个数, m-  代表负例个数,改进决策规则

因为训练集是总体样本的无偏采样,观测几率就代表真实几率,决策规则中  代表样本中正例的观测几率,只要分类器中的预测几率高于观测几率达到改进判定结果的目标。

4.基于聚类的过采样方法

4.时间类型数据处理

1.连续的时间差值法

即计算出所有样本的时间到某一个未来时间之间的数值差距,这样这个差距是UTC的时间差,从而将时间特征转化为连续值。

2.将一个时间转化为离散特征

根据时间所在的年,月,日,星期几,小时数,将一个时间特征转化为若干个离散特征,这种方法在分析具有明显时间趋势的问题比较好用。

5.文本类型数据处理

参看文本预处理

(1)词袋

直接把文本数据丢给模型,模型是无法解释的,因此需要把文本型的数据用数值表示。去掉停用词,标点符号,留下表达实际含义的词组成列表,在词库中映射稀疏向量。

from sklearn.feature_extraction.text import CountVectorizer

(2)把词袋中的词扩充到 n-gram

它的思想是:在整个语言环境中,句子T的出现概率是由组成T的N个词组成的。

(3)使用TF-IDF方法   参看TF-IDF算法

from sklearn.feature_extraction.text import TfidfVectorizer

(4)word2vec将词转化为词向量(NLP)

6.数据有偏分布处理

1.Box-Cox

连续型变量不满足正态分布时,可以使用Box-Cox变换。这一变换可以使线性回归模型在满足线性、正态性、独立性及方差齐性的同时,又不丢失信息。

Box-Cox变换的一般形式为:

boxcox变换的应用必须先分析输入X的分布是哪一种偏斜: X分布左偏,则应该应用lambda = 0的变换; X分布右偏,则应该应用lambda > 1的变换.

Box-Cox变换实现两项工作:做变换、确定lambda的值(也就是boxcox()函数返回的前两个参数)

boxcox是将数据分布正态化,使其更加符合后续对数据分布的假设。

boxcox可以降低skewness值,达到接近正态分布的目标。

注意:在使用Box-Cox变换之前,需要对数据做归一化处理

具体实现

from scipy.stats import boxcox
boxcox_transformed_data = boxcox(original_data)

2.使倾斜分布对称

对于向右倾斜的分布,对变量取平方根或立方根或对数

对于向左倾斜的分布,对变量取平方或立方或指数

(说明:向右倾斜的分布,是右边的尾部偏长)

(1)对数变换:对变量取对数,可以更改变量的分布形状。其通常应用于向右倾斜的分布,缺点是不能用于含有零或负值的变量

(2)取平方根或立方根:变量的平方根和立方根对其分布有波形的影响。取平方根可用于包括零的正值,取立方根可用于取值中有负值(包括零)的情况

3.非线性关系转换成线性

将非线性变量的关系转换为线性关系更容易理解,其中对数变换是最常用的一种方式

二、特征处理

1.标准化、归一化处理

1.标准化

零 - 均值标准化(Z - score)

from sklearn.preprocessing import StandardScaler

公式:x =(x -

机器学习流程(三)-特征工程相关推荐

  1. 03_机器学习流程_特征工程

    二.特征工程(特征处理) 特征工程是将原始数据转换为更好的代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的预测的准确性. 1.环境配置 安装scikit-learn步骤:(前提需要Numpy ...

  2. 机器学习实战之特征工程

    机器学习实战与特征工程 1.机器学习概述 1.1 什么是机器学习 1.2 为什么要机器学习 1.3 机器学习应用场景 1.4 学习框架和资料的介绍 2.特征工程 2.1 特征工程介绍 2.1.1 数据 ...

  3. 机器学习中的特征工程——分类变量的处理

    出品 | CDA数据分析研究院,转载需授权 文章目录 分类变量 概念 判断 类型 少类别分类变量处理方法 独热编码(One-hot encoding) 虚拟编码(Dummy coding) 效应编码( ...

  4. 机器学习中的特征工程

    机器学习中的特征工程 什么是特征工程 数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已.特征工程指的是把原始数据转变为模型的训练数据的过程,它的目的就是获取更好的训练数据特征,使得机器 ...

  5. 机器学习处理流程、特征工程,模型设计实例

    作者:大树 更新时间:01.14 email:59888745@qq.com 数据处理,机器学习 回主目录:2017 年学习记录和总结 阿里天池 大航杯"智造扬中"电力AI大赛 的 ...

  6. 机器学习概述和特征工程

    机器学习笔记一 机器学习 概述 数据集的结构 特征工程 特征抽取 特征的预处理 数据降维 机器学习基础 机器学习开发流程 机器学习 概述 影响人工智能发展的因素 硬件的计算能力 数据的限制 算法的发展 ...

  7. 机器学习实战 | 自动化特征工程工具Featuretools应用

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/41 本文地址:https://www.showmeai.tech/article-d ...

  8. 第五课 机器学习中的特征工程

    本系列是七月算法机器学习课程笔记 文章目录 1 特征工程与意义 2 数据与特征处理 2.1数据采集 2.2 数据清洗 2.3 数据采样 2.4 特征处理 2.4.1 数值型 2.4.2 类别型 2.4 ...

  9. 百面机器学习——第一章特征工程

    特征工程:是对原始数据进行一系列工程处理,将其提炼为特征,作为输入供算法和模型使用.从本质上来讲,特征工程是一个表示和展现数据的过程.在实际工作中,特征工程旨在去除原始数据中的杂质和冗余,设计更高效的 ...

最新文章

  1. 参考文献必备神器:这个插件能快速知道收藏的论文是否靠谱
  2. 数据中台全景架构及模块解析
  3. 论手残党画交互原型的正确姿势
  4. FPA笔记六 计算EI/EO/EQ的功能点
  5. 到底要不要报考“通信工程”?
  6. 用CSS让文字居于div的底部
  7. idea 修改样式要编译_在IDEA中DEBUG Javac源码
  8. smote算法_SMOTE过采样框架+逻辑回归模型案例
  9. mysql字符串结束符_mysql常见字符串处理函数结束
  10. 技术沙龙|实力赋能开发者,助力企业从容应对数字化转型难题
  11. 小程序和vue语法对比_商城小程序对比传统电商的优势如何?
  12. 计算机word英语词汇大全,计算机专业英语词汇缩写大全
  13. 远程医疗监护系统开发
  14. 求ax2+bx+c=0方程的解,要求(1) a=0,不是二次方程。(2) b2-4ac=0,有两个相同的实根。(3)b2-4ac>0,有两个不等的实根。(4)b2-4ac<有两个共轭的复根
  15. Delphi Assigned 简单使用
  16. afn访问本地html,请求接口AFN报错1016,failed:unacceptablecontent-type:text/html解决办法...
  17. 【Docker】(五)使用bind mounts修改Docker容器中的Nginx配置文件
  18. 安防雷达STS1-13,3发32收的相控阵雷达
  19. web安全之信息刺探防范(下)
  20. MySQL细节篇02_modify和change的区别

热门文章

  1. 【推文】人间清醒VS梅花痣俏郎君
  2. 墙裂推荐!2019 年度数据库领域热点汇总
  3. 曾经拥有VS天长地久
  4. Elixir: Enum函数总结
  5. php花店销售系统代码_花店淡季来袭,新的业绩增长点到底在哪?
  6. 中医是如何辩证出脾胃湿热的?
  7. 电商商家玩抖音裂变营销,必须要知道的数据分析知识-下秒数据
  8. 穿上钢铁侠战衣变身钢铁侠,现代表示我做到了!
  9. 求求你别再写上千行的类了,试试 IDEA 这些牛逼的重构技巧吧
  10. Android Studio 线性布局Linearlayout的控件位置控制l属性Layout_margin失效问题解决