《特征工程三部曲》之一:数据处理

时间:2022-03-05 19:13:17

要理解特征工程,首先要理解数据(Data)和特征(Feature)的概念

概念

  • 特征工程(Feature Engineering)

    • 其本质上是一项工程活动,它目的是最大限度地从原始数据中提取特征以供算法和模型使用。

特征工程在数据挖掘中有举足轻重的位置
数据领域一致认为:数据和特征决定了机器学习的上限,而模型和算法只能逼近这个上限而已。

  • 特征工程重要性:

    • 特征越好,灵活性越强;

    • 特征越好,模型越简单;

    • 特征越好,性能越出色;

好特征即使使用一般的模型,也能得到很好的效果!好特征的灵活性在于它允许你可以选择不复杂的模型,同时,运行速度也更快,也更容易理解和维护。

好的特征,即使参数不是最优解,模型性能也能表现很好,因此,不需要太多时间去寻找最优参数,大大的降低了模型的复杂度,使模型趋向简单。

模型的性能包括模型的效果,执行的效率及模型的可解释性。特征工程的最终目的就是提升模型的性能。

数据科学家通过总结和归纳,把特征工程划分为以下三个部分:

  • 特征工程包括:

    • 数据处理

    • 特征选择

    • 维度压缩

数据处理

数据处理的常用技巧

  • 量纲不一

  • 虚拟变量

  • 缺失值填充

数据处理——量纲不一

  • 量纲:就是单位,特征的单位不一致,特征就不能放在一起比较。

  • 解决量纲不一致的方法:标准化

    • 0-1标准化

    • Z标准化

    • Normalizer归一化

0-1标准化

是对原始数据进行线性变换,将特征值映射成区间为[0,1]的标准值中:

=

Z标准化

基于特征值的均值(mean)和标准差(standard deviation)进行数据的标准化。它的计算公式为:

=

标准化后的变量值围绕0上下波动,大于0说明高于平均水平,小于0说明低于平均水平。

Normalizer归一化

将每个样本缩放到单位范数(每个样本的范数为1),计算公式如下:

x¯=xni=1x2i

如何使用sklearn实现标准化

sklearn简介

  • sklearn

    • 全名Scikit-Learn,是基于Python的机器学习模块,基于BSD开源许可证,官网上可以找到相关sklearn的资源,模块下载,文档,历程等等;

    • sklearn的数据结构基于numpy和pandas;

    • sklearn的数据计算基于scipy;

    • sklearn的数据可视化基于matplotlib;

  • sklearn是在现有的数据分析,数据计算,数据可视化最好的包的基础上,搭建起来的最好python 机器学习的框架;

  • sklearn的六大基本功能

    • 分类

    • 回归

    • 聚类

    • 数据降维

    • 模型选择

    • 模型预处理

  • sklearn处理机器学习问题的三个步骤:

    • 数据准备与预处理

    • 模型选择与训练

    • 模型验证与参数调优

用sklearn实现标准化

#导入数据到data变量中
import pandas
data = pandas.read_csv('路径.csv')

#(一)Min-Max 标准化

from sklearn.preprocessing import MinMaxScaler
#初始化一个scaler对象
scaler = MinMaxScaler()
#调用scaler的fit_transform方法,把我们要处理的列作为参数传进去

data['标准化后的A列数据'] = scaler.fit_transform(data['A列数据'])
data['标准化后的B列数据'] = scaler.fit_transform(data['B列数据'])

#(二)Z-Score标准化 (可在scale中直接实现)

from sklearn.preprocessing import scale
data['标准化后的A列数据'] = scale(data['A列数据'])
data['标准化后的B列数据'] = scale(data['B列数据'])

# (三) Normalizer归一化

from sklearn.preprocessing import Normalizer
scaler = Normalizer()
#归一化可以同时处理多个列,所以[0]第一个进行赋值
data['归一化后的A列数据'] = scaler.fit_transform(data['A列数据'])[0]
data['归一化后的B列数据'] = scaler.fit_transform(data['B列数据'])[0]

数据处理——虚拟变量

  • 虚拟变量:也叫哑变量和离散特征编码,可用来表示分类变量、非数据因素可能产生的影响。

  • 虚拟变量的两种数据类型:

    • 离散特征的取值之间有大小的意义:例如:尺寸(L、XL、XXL)

    • 离散特征的取值之间没有大小的意义:例如:颜色(Red、Blue、Green)

  • 离散特征值有大小意义的虚拟变量处理

    • pandas.Series.map(dict)

      • 离散特征的取值之间有大小意义的处理函数,我们只需要把大小值以字典的方式,作为第一个参数传入即可;

        • (1) dict 映射的字典
  • 离散特征值没有大小意义的虚拟变量处理

    • pandas.get_dummies(data,prefix=None,prefix_sep=’_’,dummy_na=False,columns=None,drop_first=False)

      • 离散特征的取值之间没有大小意义的处理方法,我们可以使用get_dummies方法处理,它有6个常用的参数

        • (1) data 要处理的DataFrame

        • (2) prefix 列名的前缀,在多个列有相同的离散项时候使用

        • (3) prefix_sep 前缀和离散值的分隔符,默认为下划线,默认即可

        • (4) dummy_na 是否把NA值,作为一个离散值进行处理,默认不处理

        • (5) columns 要处理的列名,如果不指定该列,那么默认处理所有列

        • (6) drop_first 是否从备选项中删第一个,建模的时候为避免共线性使用

虚拟变量—实战案例

以互联网金融行业为例:

import pandas
#有些朋友也可能是encoding='utf8'或其他
data=pandas.read_csv('file:///Users/apple/Desktop/jacky_1.csv',encoding='GBK')
print(data)

《特征工程三部曲》之一:数据处理

其实,虚拟变量的实质就是要把离散型的数据转化为连续型的数据,因为第1列年龄已经是连续值,所以我们就不需要处理了。
我们看看如何处理学历和性别?
因为不同学历之间是有高低之分的,因此我们要使用Map方法来处理这种类型的离散型数据;

  • 第1步: 首先我们要处理不同学历之间的大小值

    • 我们使用drop_duplicates方法,来看看数据列都有哪些学历
#查看学历去重之后的情况
data['学历'].drop_duplicates()
  • 第2步:理解数据值背后的意义,作出我们自己的解析,对每个学历进行评分
#构建学历字典
educationLevelDict={'博士':4,'硕士':3,'大学':2,'大专':1}
#调用Map方法进行虚拟变量的转换
data['Education Level Map']=data['Education Level'].map(educationLevelDict)

《特征工程三部曲》之一:数据处理

  • 第3步 对于性别这种没有大小比较的离散变量,我们使用get_dummies方法,来进行调用处理即可;
dummies=pandas.get_dummies(
data,
columns=['性别'],
prefix=['性别'],
prefix_sep='_',
dummy_na=False,
drop_first=False)
  • 完整代码展示
import pandas
data=pandas.read_csv('file:///Users/apple/Desktop/jacky_1.csv',encoding='GBK')

data['学历'].drop_duplicates()
educationLevelDict={'博士':4,'硕士':3,'大学':2,'大专':1}
data['学历 Map']=data['学历'].map(educationLevelDict)

dummies=pandas.get_dummies(data,columns=['性别'],prefix=['性别'],prefix_sep='_',dummy_na=False,drop_first=False)

print(dummies)

《特征工程三部曲》之一:数据处理

数据处理——缺失值填充

  • 缺失值产生原因

    • 有些信息暂时无法获取;

    • 有些信息被遗漏或者错误的处理了

  • 缺失值处理方法

    • 数据补齐

    • 删除缺失行

    • 不处理

实操-使用统计指标填充缺失值

import pandas
data=pandas.read_csv('路径.csv')
from sclera.preprocessing import Imputer
#'mean','median','most_frequent'
imputer=Imputer(strategy='mean')
imputer.fit_transform(data[['需填充列的列名']])