要理解特征工程,首先要理解数据(Data)和特征(Feature)的概念
概念
特征工程(Feature Engineering)
- 其本质上是一项工程活动,它目的是最大限度地从原始数据中提取特征以供算法和模型使用。
特征工程在数据挖掘中有举足轻重的位置
数据领域一致认为:数据和特征决定了机器学习的上限,而模型和算法只能逼近这个上限而已。
特征工程重要性:
特征越好,灵活性越强;
特征越好,模型越简单;
特征越好,性能越出色;
好特征即使使用一般的模型,也能得到很好的效果!好特征的灵活性在于它允许你可以选择不复杂的模型,同时,运行速度也更快,也更容易理解和维护。
好的特征,即使参数不是最优解,模型性能也能表现很好,因此,不需要太多时间去寻找最优参数,大大的降低了模型的复杂度,使模型趋向简单。
模型的性能包括模型的效果,执行的效率及模型的可解释性。特征工程的最终目的就是提升模型的性能。
数据科学家通过总结和归纳,把特征工程划分为以下三个部分:
特征工程包括:
数据处理
特征选择
维度压缩
数据处理
数据处理的常用技巧
量纲不一
虚拟变量
缺失值填充
数据处理——量纲不一
量纲:就是单位,特征的单位不一致,特征就不能放在一起比较。
解决量纲不一致的方法:标准化
0-1标准化
Z标准化
Normalizer归一化
0-1标准化
是对原始数据进行线性变换,将特征值映射成区间为[0,1]的标准值中:
Z标准化
基于特征值的均值(mean)和标准差(standard deviation)进行数据的标准化。它的计算公式为:
标准化后的变量值围绕0上下波动,大于0说明高于平均水平,小于0说明低于平均水平。
Normalizer归一化
将每个样本缩放到单位范数(每个样本的范数为1),计算公式如下:
如何使用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[['需填充列的列名']])