sklearn专题三:数据预处理

本文详细介绍了使用Python库sklearn进行数据预处理,包括数据无量纲化的MinMaxScaler和StandardScaler,缺失值的SimpleImputer,分类型特征的LabelEncoder、OrdinalEncoder和OneHotEncoder,以及特征选择的Filter、Embedded和Wrapper方法。通过实例展示了如何使用这些工具进行数据预处理和特征选择,以提升模型性能和计算效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1 概述

1.1 数据预处理与特征工程

数据挖掘的五大流程:

1.2 sklearn中的数据预处理和特征工程

2 数据预处理 Preprocessing & Impute

2.1 数据无量纲化

preprocessing.MinMaxScaler数据归一化

preprocessing.StandardScaler数据标准化

StandardScaler和MinMaxScaler选哪个?

 2.2 缺失值

impute.SimpleImputer

BONUS:用Pandas和Numpy进行填补

2.3 处理分类型特征:编码与哑变量 

preprocessing.LabelEncoder:标签专用,能够将分类转换为分类数值

preprocessing.OrdinalEncoder:特征专用,能够将分类特征转换为分类数值

preprocessing.OneHotEncoder:独热编码,创建哑变量

BONUS:数据类型以及常用的统计量

2.4 处理连续型特征:二值化与分段 

sklearn.preprocessing.Binarizer

preprocessing.KBinsDiscretizer

3. 特征选择 feature_selection

3.1 Filter过滤法

3.1.1 方差过滤

3.1.2 相关性过滤

3.1.3 过滤法总结

3.2 Embedded嵌入法

feature_selection.SelectFromModel

3.3 Wrapper包装法

feature_selection.RFE

3.4 特征选择总结


1 概述

1.1 数据预处理与特征工程

数据挖掘的五大流程:

1.获取数据

2.数据预处理
数据预处理是从数据中检测,纠正或删除损坏,不准确或不适用于模型的记录的过程
可能面对的问题有:数据类型不同,比如有的是文字,有的是数字,有的含时间序列,有的连续,有的间断。 也可能,数据的质量不行,有噪声,有异常,有缺失,数据出错,量纲不一,有重复,数据是偏态,数据量太
大或太小
数据预处理的目的:让数据适应模型,匹配模型的需求
3.特征工程:
特征工程是将原始数据转换为更能代表预测模型的潜在问题的特征的过程,可以通过挑选最相关的特征,提取 特征以及创造特征来实现。其中创造特征又经常以降维算法的方式实现。
可能面对的问题有:特征之间有相关性,特征和标签无关,特征太多或太小,或者干脆就无法表现出应有的数 据现象或无法展示数据的真实面貌
特征工程的目的: 1) 降低计算成本, 2) 提升模型上限
4. 建模,测试模型并预测出结果
5. 上线,验证模型效果

1.2 sklearn中的数据预处理和特征工程

sklearn 中包含众多数据预处理和特征工程相关的模块,虽然刚接触 sklearn时,大家都会为其中包含的各种算法的 广度深度所震惊,但其实 sklearn六大板块中有两块都是关于数据预处理和特征工程的,两个板块互相交互,为建 模之前的全部工程打下基础。

模块preprocessing:几乎包含数据预处理的所有内容

模块Impute:填补缺失值专用

模块feature_selection:包含特征选择的各种方法的实践

模块 decomposition :包含降维算法

2 数据预处理 Preprocessing & Impute

2.1 数据无量纲化

在机器学习算法实践中,我们往往有着将不同规格的数据转换到同一规格,或不同分布的数据转换到某个特定分布 的需求,这种需求统称为将数据 无量纲化 ”。譬如梯度和矩阵为核心的算法中,譬如逻辑回归,支持向量机,神经 网络,无量纲化可以加快求解速度;而在距离类模型,譬如 K 近邻,K-Means聚类中,无量纲化可以帮我们提升模 型精度,避免某一个取值范围特别大的特征对距离计算造成影响。(一个特例是决策树和树的集成算法们,对决策 树我们不需要无量纲化,决策树可以把任意数据都处理得很好。)
数据的无量纲化可以是线性的,也可以是非线性的。线性的无量纲化包括 中心化 Zero-centered 或者Mean  subtraction )处理和 缩放处理 Scale)。中心化的本质是让所有记录减去一个固定值,即让数据样本数据平移到 某个位置。缩放的本质是通过除以一个固定值,将数据固定在某个范围之中,取对数也算是一种缩放处理。

preprocessing.MinMaxScaler数据归一化

当数据 (x) 按照最小值中心化后,再按极差(最大值 - 最小值)缩放,数据移动了最小值个单位,并且会被收敛到 [0,1] 之间,而这个过程,就叫做 数据归一化 (Normalization ,又称 Min-Max Scaling) 。注意, Normalization是归一化,不是正则化,真正的正则化是 regularization,不是数据预处理的一种手段。归一化之后的数据服从正态分 布,公式如下:

sklearn 当中,我们使用 preprocessing.MinMaxScaler 来实现这个功能。 MinMaxScaler有一个重要参数, feature_range ,控制我们希望把数据压缩到的范围,默认是 [0,1]

1.准备数据

from  sklearn.preprocessing import MinMaxScaler 
data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]

import pandas as pd
pd.DataFrame(data)

 2.实现归一化

scaler=MinMaxScaler()  #实例化
scaler=scaler.fit(data)  #fit,在这里本质就是生成min(x)和max(x)
result=scaler.transform(data)   #通过接口导出结果
result

归一后的结果:

result_=scaler.fit_transform(data)  #训练和导出结果一步达成
result_

3.将归一化后的结果逆转

data1=scaler.inverse_transform(result)
pd.DataFrame(data1)

逆转回原来的结果。

4.使用MinMaxScaler的参数feature_range实现将数据归一化到[0,1]以外的范围中

data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
scaler=MinMaxScaler(feature_range=[5,10])  #依然实例化
result=scaler.fit_transform(data)  #fit_transform一步导出结果
pd.DataFrame(result)

数据被压缩到【5,10】之间。

注意:当X中的特征数量非常多的时候,fit会报错并表示,数据量太大了我计算不了 ,此时使用partial_fit作为训练接口 ,scaler = scaler.partial_fit(data)

5.BONUS: 使用numpy来实现归一化

import numpy as np
X=np.array([[-1, 2], [-0.5, 6], [0, 10], [1, 18]])

#归一化
X_nor=(X-X.min(axis=0))/(X.max(axis=0)-X.min(axis=0))
pd.DataFrame(X_nor)

 即用公式归一化。 

逆转归一化

#逆转归一化
X_returned=X_nor*(X.max(axis=0)-X.min(axis=0))+X.min(axis=0)
X_returned

 又逆转回原来的了。

preprocessing.StandardScaler数据标准化

当数据 (x) 按均值 (μ) 中心化后,再按标准差 (σ) 缩放,数据就会服从为均值为 0 ,方差为 1的正态分布(即标准正态分 布),而这个过程,就叫做 数据标准化 (Standardization ,又称Z-score normalization),公式如下:
from sklearn.preprocessing import StandardScaler
data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
scaler=StandardScaler()    #实例化
scaler.fit(data)   #fit,本质是生成均值和方差
scaler.mean_  #查看均值的属性mean_  array([-0.125,  9.   ])
scaler.var_   #查看方差的属性var  array([ 0.546875, 35.      ])
x_std = scaler.transform(data)    #通过接口导出结果
x_std.mean()    #导出的结果是一个数组,用mean()查看均值0
x_std.std()     #用std()查看方差,1
scaler.fit_transform(data)   #使用fit_transform(data)一步达成结果

'''
array([[-1.18321596, -1.18321596],
       [-0.50709255, -0.50709255],
       [ 0.16903085,  0.16903085],
       [ 1.52127766,  1.52127766]])
'''
scaler.inverse_transform(x_std)  #使用inverse_transform逆转标准化
'''
array([[-1. ,  2. ],
       [-0.5,  6. ],
       [ 0. , 10. ],
       [ 1. , 18. ]])
'''
对于 StandardScaler MinMaxScaler 来说,空值 NaN 会被当做是缺失值,在 fifit 的时候忽略,在 transform的时候 保持缺失 NaN 的状态显示。并且,尽管去量纲化过程不是具体的算法,但在 fifit接口中,依然只允许导入至少二维数 组,一维数组导入会报错。通常来说,我们输入的 X会是我们的特征矩阵,现实案例中特征矩阵不太可能是一维所以不会存在这个问题。

StandardScalerMinMaxScaler选哪个?

看情况。大多数机器学习算法中,会选择 StandardScaler 来进行特征缩放,因为 MinMaxScaler对异常值非常敏 感。在 PCA ,聚类,逻辑回归,支持向量机,神经网络这些算法中,S tandardScaler 往往是最好的选择。
MinMaxScaler在不涉及距离度量、梯度、协方差计算以及数据需要被压缩到特定区间时使用广泛,比如数字图像 处理中量化像素强度时,都会使用 MinMaxScaler 将数据压缩于 [0,1] 区间之中。
建议先试试看 StandardScaler ,效果不好换 MinMaxScaler
除了 StandardScaler MinMaxScaler 之外, sklearn 中也提供了各种其他缩放处理(中心化只需要一个 pandas广 播一下减去某个数就好了,因此 sklearn不提供任何中心化功能)。比如,在希望压缩数据,却不影响数据的稀疏 性时(不影响矩阵中取值为 0 的个数时),我们会使用 MaxAbsScaler;在异常值多,噪声非常大时,我们可能会选用分位数来无量纲化,此时使用 RobustScaler 。更多详情请参考以下列表。

 2.2 缺失值

机器学习和数据挖掘中所使用的数据,永远不可能是完美的。很多特征,对于分析和建模来说意义非凡,但对于实  际收集数据的人却不是如此,因此数据挖掘之中,常常会有重要的字段缺失值很多,但又不能舍弃字段的情况。因  此,数据预处理中非常重要的一项就是处理缺失值。

import pandas as pd
data=pd.read_csv(r"E:\数据分析师学习\Narrativedata.csv",index_col=0,engine='python')
data.head()

在这里,我们使用从泰坦尼克号提取出来的数据,这个数据有三个特征,一个数值型,两个字符型,标签也是字符 型。从这里开始,我们就使用这个数据给大家作为例子,让大家慢慢熟悉sklearn中数据预处理的各种方式。

impute.SimpleImputer

class sklearn.impute.SimpleImputer ( missing_values=nan , strategy=’mean’ , fifill_value=None , verbose=0, copy=True )
在讲解随机森林的案例时,我们用这个类和随机森林回归填补了缺失值,对比了不同的缺失值填补方式对数据的影响。这个类是专门用来填补缺失值的。它包括四个重要参数:

参数

含义&输入

missing_values

告诉SimpleImputer,数据中的缺失值长什么样,默认空值np.nan

strategy

我们填补缺失值的策略,默认均值。

输入“mean”使用均值填补(仅对数值型特征可用)

输入“median"用中值填补(仅对数值型特征可用)

输入"most_frequent”用众数填补(对数值型和字符型特征都可用)

输入“constant"表示请参考参数“fill_value"中的值(对数值型和字符型特征都可用)

fill_value

当参数startegy”constant"的时候可用,可输入字符串或数字表示要填充的值,常用0

copy

默认为True,将创建特征矩阵的副本,反之则会将缺失值填补到原本的特征矩阵中去。

 1.填补年龄

#填补年龄
Age = data.loc[:,"Age"].values.reshape(-1,1) #sklearn当中特征矩阵必须是二维

2.实例化,查看均值、中值和0的填补方法

from sklearn.impute import SimpleImputer
#实例化
imp_mean = SimpleImputer() #默认均值填补
imp_m
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值