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

摘要:
特征工程在数据挖掘中的位置数据领域发挥着重要作用。人们一致认为,数据和特征决定了机器学习的上限,而模型和算法只能接近这个上限。特征工程的最终目标是提高模型的性能。通过总结和归纳,数据科学家将特征工程分为以下三个部分:特征工程包括:数据处理、特征选择、维度压缩、数据处理的常用技术、数据处理、虚拟变量缺失值不同维度的数据处理-不同维度的数据处理:即,特征的单位是不一致的,并且特征不能一起比较。

要理解特征工程,首先要理解数据(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)

@数据分析-jacky

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

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

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

@数据分析-jacky

  • 第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[['需填充列的列名']])

免责声明:文章转载自《《特征工程三部曲》之一:数据处理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Web在线报表设计器使用指南IDEA 配置Tomcat web项目的部署URL下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

大数据之Shell编程(一) Shell变量

1.Shell中的变量 Shell中的变量分为系统变量和用户变量,可以通过set命令查看有哪些变量可以使用系统变量比如:$HOME$PWD$SHELL$USER等等 2.变量的定义 变量=值 (例如STR=abc) 注意:=两边不能含有空格 变量一般使用大写,当然不是硬性规定 双引号和单引号区别:双引号仅仅将空格等脱意,而单引号会将所有的特殊字符脱意 &g...

Jmeter属性和变量

一、Jmeter中的属性: 1、JMeter属性统一定义在jmeter.properties文件中,我们可以在该文件中添加自定义的属性 2、JMeter属性在测试脚本的任何地方都是可见的(全局),通常被用来定义一些JMeter使用的默认值,可以用于在线程间传递信息。 3、JMeter属性可以在测试计划中通过函数 _P 进行引用,但是不能作为特定线程的变量值...

将xml文件数据导入到sql中[原]

        设计数据库的时候为了操作的方便,我们可以选择用xml格式文件来保存我们的数据表结构及其数据。这样的好处是多方面的,设计简单,操作方便,自己可以开发一个设计数据库表的应用程序直接对xml文件进行操作。其实另外一个好处是在最终使用的时候很容易将xml数据导入到任何我们想要的数据库中,不过注明的是这中设计的方法只在于简便,不可能达到其他专门工具的...

iOS开发面试题整理

1、类别的作用?继承和类别在实现中有何区别? category 可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。 类别主要有3个作用: (1)将类的实现分散到多个不同文件或多个不同框架中。 (2)创建对私有方法的前向引用。 (3)向对...

docker 传入变量

1、Dockerfile中定义变量 ENV maxmemory="" 2、脚本接收变量 if [ "$maxmemory" ];then sed -i "s/maxmemory 4294967296/maxmemory $maxmemory/" /redis-cluster.conf fi 3、传入变量 docker run -d...

kafka数据迁移实践

欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者:mikealzhou 本文重点介绍kafka的两类常见数据迁移方式:1、broker内部不同数据盘之间的分区数据迁移;2、不同broker之间的分区数据迁移。 一、broker 内部不同数据盘之间进行分区数据迁移 1.1 背景介绍 最近,腾讯云的一个重要客户发现kafka broker内部的to...