前言:特征工程是机器学习的重点,他直接影响着模型的好坏。
数据收集
在进行机器学习之前,收集数据的过程中,我们主要按照以下规则找出我们所需 要的数据:
- 业务的实现需要哪些数据? 基于对业务规则的理解,尽可能多的找出对因变量有影响的所有自变量数据。
- 数据可用性评估 在获取数据的过程中,首先需要考虑的是这个数据获取的成本; 获取得到的数据,在使用之前,需要考虑一下这个数据是否覆盖了所有情况以及这个数 据的可信度情况。
- 数据源
用户行为日志数据:记录的用户在系统上所有操作所留下来的日志行为数据 业务数据:
商品/物品的信息、用户/会员的信息......
第三方数据:爬虫数据、购买的数据、合作方的数据.... - 数据储存
一般情况下,用于后期模型创建的数据都是存在在本地磁盘、关系型数据库或者 一些相关的分布式数据存储平台的。 本地磁盘 MySQL Oracle HBase HDFS Hive
数据清洗
- 预处理
在数据预处理过程主要考虑两个方面,如下: 选择数据处理工具:关系型数据库或者Python 查看数据的元数据以及数据特征:一是查看元数据,包括字段解释、数据来源等一 切可以描述数据的信息;另外是抽取一部分数据,通过人工查看的方式,对数据本 身做一个比较直观的了解,并且初步发现一些问题,为之后的数据处理做准备。 - 格式内容错误数据清洗
时间、日期、数值、半全角等显示格式不一致:直接将数据转换为一类格式即可,该问 题一般出现在多个数据源整合的情况下。
内容中有不该存在的字符:最典型的就是在头部、中间、尾部的空格等问题,这种情况 下,需要以半自动校验加半人工方式来找出问题,并去除不需要的字符。
内容与该字段应有的内容不符:比如姓名写成了性别、身份证号写成手机号等问题。 - 去除不需要的数据
一般情况下,我们会尽可能多的收集数据,但是不是所有的字段数据都是可以应 用到模型构建过程的,也不是说将所有的字段属性都放到构建模型中,最终模型 的效果就一定会好,实际上来讲,字段属性越多,模型的构建就会越慢,所以有 时候可以考虑将不要的字段进行删除操作。在进行该过程的时候,要注意备份原 始数据。 - 关联性验证
如果数据有多个来源,那么有必要进行关联性验证,该过程常应用到多数据源合 并的过程中,通过验证数据之间的关联性来选择比较正确的特征属性,比如:汽 车的线下购买信息和电话客服问卷信息,两者之间可以通过姓名和手机号进行关 联操作,匹配两者之间的车辆信息是否是同一辆,如果不是,那么就需要进行数 据调整。
数据不平衡
image.png- 设置损失函数的权重,使得少数类别数据判断错误的损失大于多数类别数据判断 错误的损失,即当我们的少数类别数据预测错误的时候,会产生一个比较大的损 失值,从而导致模型参数往让少数类别数据预测准确的方向偏。可以通过scikitlearn中的class_weight参数来设置权重。
- 下采样/欠采样(under sampling):从多数类中随机抽取样本从而减少多数类别 样本数据,使数据达到平衡的方式。
*采用数据合成的方式生成更多的样本,该方式在小数据集场景下具有比较成功的 案例。常见算法是SMOTE算法,该算法利用小众样本在特征空间的相似性来生 成新样本。
特征转换
特征转换主要指将原始数据中的字段数据进行转换操作,从而得到适合进行算法 模型构建的输入数据(数值型数据),在这个过程中主要包括但不限于以下几种数 据的处理:
文本数据转换为数值型数据
缺省值填充
定性特征属性哑编码
定量特征属性二值化
特征标准化与归一化
- 文本特征属性转换
机器学习的模型算法均要求输入的数据必须是数值型的,所以对于文本类型的特 征属性,需要进行文本数据转换,也就是需要将文本数据转换为数值型数据。常 用方式如下:
词袋法(BOW/TF)
TF-IDF(Term frequency-inverse document frequency)
HashTF
Word2Vec(主要用于单词的相似性考量) - 缺省值填充
缺省值是数据中最常见的一个问题,处理缺省值有很多方式,主要包括以下四个 步骤进行缺省值处理:
确定缺省值范围
去除不需要的字段
填充缺省值内容
重新获取数据
注意:最重要的是缺省值内容填充。 - 哑编码
哑编码(OneHotEncoder):对于定性的数据(也就是分类的数据),可以采用N位 的状态寄存器来对N个状态进行编码,每个状态都有一个独立的寄存器位,并且 在任意状态下只有一位有效;是一种常用的将特征数字化的方式。比如有一个特 征属性:['male','female'],那么male使用向量[1,0]表示,female使用[0,1]表示。
示例:
#-*- conding:utf-8 -*-
'''
亚编码,先把特征转为数字,再进行亚编码处理
'''
import numpy as np
import matplotlib as mpl
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import OneHotEncoder
path = "car.data"
data = pd.read_csv(path, header=None)
#查看数据
for i in range(7):
print(np.unique(data[i]))
#将字符串转化为数字,用pd.Categorical
# pd.Categorical(data)
x=data.apply(lambda x:pd.Categorical(x).codes)
print(x.head(5))
#进行亚编码操作,toarray()方法转化为数组
en=OneHotEncoder()
x = en.fit_transform(x)
print(x.toarray())
print(en.n_values_)
#在进行转化
df=pd.DataFrame(x.toarray())
print(df.head(5))
- 二值化
二值化(Binarizer):对于定量的数据(特征取值连续)根据给定的阈值,将其进 行转换,如果大于阈值,那么赋值为1;否则赋值为0
注意:二值化非常常用,对每个特征按照不同阈值进行拆分,再进行合并
延伸为多值花,设定多个阈值。 -
标准化(z-score)
标准化:基于特征属性的数据(也就是特征矩阵的列),获取均值和方差,然后将 特征值转换至服从标准正态分布。计算公式如下:
-
区间缩放法
区间缩放法:是指按照数据的取值范围特性对数据进行缩放操作,将数据缩放到 给定区间上,常用的计算方式如下:
-
正则化
正则化:和标准化不同,正则化是基于矩阵的行进行数据处理,其目的是将矩阵 的行均转换为“单位向量”,l2规则转换公式如下:
- 比较
标准化的目的是为了降低不同特征的不同范围的取值对于模型训练的影响;比如对于同 一个特征,不同的样本的取值可能会相差的非常大,那么这个时候一些异常小或者异常 大的数据可能会误导模型的正确率;另外如果数据在不同特征上的取值范围相差很大, 那么也有可能导致最终训练出来的模型偏向于取值范围大的特征,特别是在使用梯度下 降求解的算法中;通过改变数据的分布特征,具有以下两个好处:1. 提高迭代求解的收 敛速度;2. 提高迭代求解的精度
归一化对于不同特征维度的伸缩变换的主要目的是为了使得不同维度度量之间特征具有 可比性,同时不改变原始数据的分布(相同特性的特征转换后,还是具有相同特性)。和 标准化一样,也属于一种无量纲化的操作方式。
正则化则是通过范数规则来约束特征属性,通过正则化我们可以降低数据训练处来的模 型的过拟合可能,和之前在机器学习中所讲述的L1、L2正则的效果一样。在进行正则化 操作的过程中,不会改变数据的分布情况,但是会改变数据特征之间的相关特性。 备注:广义上来讲,标准化、区间缩放法、正则化都是具有类似的功能。在有一些书籍 上,将标准化、区间缩放法统称为标准化,把正则化称为归一化操作。
简单来说
标准化会改变数据的分布情况,归一化不会,标准 化的主要作用是提高迭代速度,降低不同维度之间影响权重不一致的问题。
增维
- 多项式扩展
多项式数据变换主要是指基于输入的特征数据按照既定的多项式规则构建更多的 输出特征属性,比如输入特征属性为[a,b],当设置degree为2的时候,那么输出 的多项式特征为[1, a, b, a^2, ab, b^2] - 核函数
- GBDT+LR
认为每个样本在决策树落在决策树 的每个叶子上就表示属于一个类别, 那么我们可以进行基于GBDT或者随 机森林的维度扩展,经常我们会将其 应用在GBDT将数据进行维度扩充, 然后使用LR进行数据预测,这也是我 们进行所说的GBDT+LR做预测
降维
以后再说
特征选择
当做完特征转换后,实际上可能会存在很多的特征属性,比如:多项式扩展转换、文本 数据转换等等,但是太多的特征属性的存在可能会导致模型构建效率降低,同时模型的 效果有可能会变的不好,那么这个时候就需要从这些特征属性中选择出影响最大的特征 属性作为最后构建模型的特征属性列表。
在选择模型的过程中,通常从两方面来选择特征:
特征是否发散:如果一个特征不发散,比如方差解决于0,也就是说这样的特征对于样本的 区分没有什么作用。
特征与目标的相关性:如果与目标相关性比较高,应当优先选择。
特征选择的方法主要有以下三种:
- Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择 阈值的个数,从而选择特征;常用方法包括方差选择法、相关系数法、卡方检验、 互信息法等。
- Wrapper:包装法,根据目标函数(通常是预测效果评分),每次选择若干特征或 者排除若干特征;常用方法主要是递归特征消除法。
- Embedded:嵌入法,先使用某些机器学习的算法和模型进行训练,得到各个特征 的权重系数,根据系数从大到小选择特征;常用方法主要是基于惩罚项的特征选择 法。
把以上进行一个汇总,如下图:
我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan
网友评论