python机器学习之特征处理

Posted 柳小葱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python机器学习之特征处理相关的知识,希望对你有一定的参考价值。

☀️前面我们讲述了对数据建模之前需要对数据进行数据探索,探索完之后应该干些啥?没错,接下来就是特征工程!对数据探索感兴趣的同学可以查看下面的文章👇:

💗今天我们要学习的内容是特征工程,特征工程的好坏决定了机器学习的上限!特征工程是从原始数据提取特征的过程,这些特征可以很好地描述数据,并利用特征建立的模型在未知数据上的性能表现达到最优,特征工程主要包括特征使用、特征获取、特征处理、特征选择和特征监控。

功能说明
StandarScaler无量纲化标准化,基于特征列,将特征值转换为服从标准正态分布
MinMaxScaler无量纲化区间缩放,基于列的最大值和最小值,将特征转化到[a,b]区间
Normalizer归一化基于特征矩阵的行,将样本向量转化为单位向量
Binarizer定量特征二值化基于给定阈值,将特征按阈值划分
OneHotEncoder定性特征哑变量编码将定性特征编码为定量特征
Imputer缺失值处理计算缺失值,缺失值可填充为均值
FunctionTransformer自定义单元数据转换使用单元函数转换数据

1.数据预处理和特征处理

1.1 数据预处理

在提取特征之前,需要对数据进行预处理,具体包括数据采集、数据清洗、数据采样。

1.1.1数据采集

数据采集就是需要采集对预测结构有帮助的一类数据,采集到关键的数据是好的预测的关键!

1.1.2数据清洗

数据清洗也是很重要的一步,机器学习就像是一个加工机器,产品如何取决于原材料的好坏,数据清洗就是要去除“脏”数据!

1.1.3数据采样

在数据采集、清洗过后,正负样本是不均匀的,所以需要对数据进行采样。采样的方法有随机采样和分层采样。但是由于随机采样导致每次采样的数据不均匀,因此更多的是1根据特征进行分层抽样。
正样本>负样本:采用下采样。
正样本<负样本:上采样,修改损失函数设置样本的权重。

1.2 特征处理

特征处理的方式有标准化、区间缩放法、归一化、定量特征二值化、定性特征哑编码、缺失值处理和数据转换。

1.2.1标准化

标准化是依照特征矩阵的来处理数据,即通过求标准分数的方法,将特征转化为标准正态分布,并和整体样本分布相关。每个样本点都能对标准化产生影响。标准化公式如下: x ′ = x − X ‾ S x'=\\frac{x-\\overline{X}}{S} x=SxX X ‾ \\overline{X} X是均值,S是标准差。
在sklearn中使用preprocessing库中的StandardScaler进行处理:

from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris
iris=load_iris()
#数据进行标准化
StandardScaler().fit_transform(iris.data)

结果如下:
在这里插入图片描述

1.2.2区间缩放法

区间缩放法常见的一种就是利用的最大值和最小值进行缩放。公式如下: x ′ = x − M i n M a x − M i n x'=\\frac{x-{Min}}{Max-Min} x=MaxMinxMin
在sklearn中使用preprocessing库中的MinMaxScaler进行处理:

#区间缩放
from sklearn.preprocessing import MinMaxScaler
MinMaxScaler().fit_transform(iris.data)

在这里插入图片描述

1.2.3归一化

归一化是将样本的特征值转换到同一量纲下,把数据映射到[0,1]或者[a,b]区间内,由于其仅由变量的极值决定,因此区间缩放法是归一化的一种。
归一区间会改变数据的原始距离、分布和信息,但标准化不会!
L1,L2归一化都是基于的!
在这里插入图片描述

我们一般采用L2归一化的公式如下: x i ′ = x i ∑ i = 1 n x i 2 x'_i=\\frac{{x_i}}{\\sqrt{\\sum_{i = 1} ^nx_i^2}} xi=i=1nxi2 xi,其中下半部分为 x i x_i xi的L2范式。
在sklearn中使用preprocessing库的Normalizer类对数据集进行归一化:

#归一化
from sklearn.preprocessing import Normalizer
Normalizer().fit_transform(iris.data)

结果如下:
在这里插入图片描述

使用场景

  • 如果对输出结果范围有要求,则用归一化
  • 如果数据较为稳定,不存在极端的最大值最小值,则用归一化
  • 如果数据存在异常值和较多的噪声,则用标准化,这样可以通过中心化简介避免异常值和极端值的影响。
  • SVM、KNN、PCA等模型都必须要求进行归一化或者标准化。

1.2.4定量特征二值化

定量特征二值化的核心在于设定一个阈值,大于阈值的赋值为1,小于等于阈值的赋值为0。
赋值公式如下: x ′ = { 1 , x > t h r e s h o l d 0 , x < = t h r e s h o l d x' = \\begin{cases} 1, \\mathrm{x>threshold} \\\\ 0,\\mathrm{x<=threshold} \\\\ \\end{cases} x={1,x>threshold0,x<=threshold
我们使用preprocessing库的Binarizer类对数据集进行二值化

#二值化
from sklearn.preprocessing import Binarizer
Binarizer(threshold=3).fit_transform(iris.data)

在这里插入图片描述

1.2.5 独热编码

独热编码也被成为定性哑变量编码,引入独热编码的作用是将原本不能定量处理的变量进行量化,从而评估定性因素对因变量的影响。例如:对于职位这一栏有工人、农民、学生、企业职员我们就可以将他们进行独热编码:

工人:(0,0,0,1)
农民:(0,0,1,0)
学生:(0,1,0,0)
企业职员:(1,0,0,0)

使用sklearn中的OneHotEncoder进行编码

#one—hot编码
from sklearn.preprocessing import OneHotEncoder
ir=OneHotEncoder(n_values="auto").fit_transform(iris.target.reshape(-1,1)).toarray()
ir

结果如下:
在这里插入图片描述

1.2.6 缺失值处理

在处理缺失值时,用pandas读取数据为NaN,即表示缺失值。
可以使用sklearn中的impute中的simpleimputer对缺失值进行填充

import numpy as np
from numpy import vstack,array,nan
from sklearn.impute import SimpleImputer
data=np.vstack([array([nan,nan,nan,nan]),iris.data])#增加一列空值
SimpleImputer(missing_values=nan,strategy='mean').fit_transform(data)#missing_values代表空值形式,strategy是填充策略

填充成功:
在这里插入图片描述

1.2.7数据转换

数据转换有很种方式,比如取对数,多项式转换等。
我们这里就举一个对数转换的例子吧。
使用sklearn中的preprocessing中的FunctionTransformer函数

from numpy import log1p
from sklearn.preprocessing import FunctionTransformer
#第一个参数是单变元函数
FunctionTransformer(log1p,validate=False).fit_transform(iris.data)

结果如下:
在这里插入图片描述
下一章节我们将进行讲解特征降维!

以上是关于python机器学习之特征处理的主要内容,如果未能解决你的问题,请参考以下文章

机器学习之决策树

《Python机器学习及实践》----无监督学习之特征降维

《Python机器学习及实践》----无监督学习之特征降维

纯万字干货机器学习之数据均衡算法种类大全+Python代码一文详解

机器学习之数据处理与可视化鸢尾花数据分类|特征属性比较

机器学习之特征选择方法