前言
本篇文章首要解说Python的sklearn库中常用的数据预处理办法,首要介绍工具中的内容,即该库中的相关办法包括的常用接口和根本运用,并不合适手把手入门学习,此外将触及更少的原理和运用情况说明。
- 更多关于本文触及的数据预处理办法的原理常识:【数据预处理】数据处理办法中的数学原理 – ()
sklearn中的数据预处理
-
sklearn.preprocessing
:sklearn中的数据预处理模块 -
sklearn.impute
:sklearn中的缺失值填充模块
本文首要触及的办法:
- 极差归一化:
sklearn.preprocessing.MinMaxScaler
- 数据标准化:
sklearn.preprocessing.StandardScaler
- 标签编码:
sklearn.preprocessing.LabelEncoder
- 特征编码:
sklearn.preprocessing.OrdinalEncoder
- 数据二值化:
sklearn.preprocessing.Binarizer
- 数据分箱:
sklearn.preprocessing.KBinsDiscretizer
- 缺失值处理:
sklearn.impute.SimpleImputer
ps:拟合的时分能够传入多个特征数据,sklearn中的办法大多都会自动分别对每一列进行处理,但sklearn一般不支持一维数据导入,至少为二维,若想传入一维数组进行处理能够运用
reshape(-1, 1)
转为二维数组,若想传入单个Series目标则需求先将其转为DataFrame目标。
数据无量纲化
极差归一化:统一量纲,将某特征下一切的值归一化在指定规模内,默许该规模为 [0,1][0, 1],也能够手动确认规模。
常用接口如下:
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
data = pd.DataFrame(np.random.randint(10, 100, (5, 2))) # 预备测试数据
# 常用接口
scaler = MinMaxScaler() # 默许规模为 [0,1]
scaler = MinMaxScaler(feature_range=[5, 10]) # 自界说归一化数据规模
scaler.fit(data) # 拟合数据
scaler.partial_fit(data) # 数据量大的时分fit()报错,能够运用partial_fit()
result = scaler.transform(data) # 改换数据
result = scaler.fit_transform(data) # 拟合和改换一步达到
data = scaler.inverse_transform(result) # 逆向改换
.partial_fit()
:该办法是一种增量学习的方法,能够逐步从流式数据中学习缩放参数,当数据量太大导致 .fit()
接口报错时,能够运用该接口
咱们把大批量的数据想象成一个大湖,已然咱们无法一次性将这个大湖中的一切水进行处理(学习),但咱们能够将其延伸出来一条小河,对顺着小何活动的水(数据流)不断进行处理(学习)。
- 增量学习:是一种能够逐步从头数据中学习的机器学习办法。它不需求从头练习整个模型,而是可迭代地更新模型参数。
- 流式数据:指的是接连不断产生的数据流
Z-score标准化:统一量纲,且改换后的数据服从均值为0方差为1的标准正态散布。
常用接口如下:和MinMaxScaler根本一样
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
data = pd.DataFrame(np.random.randint(10, 100, (5, 2))) # 预备测试数据
# 常用接口
scaler = StandardScaler() # 创立目标
scaler.fit(data) # 拟合数据
scaler.partial_fit(data) # 数据量大的时分fit()报错,能够运用partial_fit()
result = scaler.transform(data) # 改换数据
result = scaler.fit_transform(data) # 拟合和改换一步达到
data = scaler.inverse_transform(result) # 逆向改换
# 常用特点
scaler.var_ # 拟合后检查各列数据的方差
scaler.mean_ # 拟合后检查各列数据的均值
对于 StandardScaler 和 MinMaxScaler 来说,空值NaN
会被作为是缺失值,在 fit 的时分忽略,在 transform 的时分坚持缺失 NaN 的状况显现。
缺失值处理
SimpleImputer 是sklearn中的简略填充方案,能够填充均值、中位数、众数或特定值
常用参数:
-
missing_values
:改组数据中的缺失值是什么样的,默以为np.nan
-
strategy
:填充战略,默以为'mean'
-
'mean'
:均值填充 -
'median'
:中位数填充 -
'most_frequent'
:众数填充 -
'constant'
:填充固定值,该值在fill_value
参数中设置
-
-
fill_value
:在strategy
参数设置为'constant'
时,设置填充值 -
copy
:默以为True,给处理后的数据创立副本并回来,否则在原目标上进行修正
常用接口:
import pandas as pd
import numpy as np
from sklearn.impute import SimpleImputer
data = pd.DataFrame(np.random.randint(10, 100, (5, 2))) # 预备测试数据
# 常用接口
imp_mean = SimpleImputer() # 均值填充缺失值
imp_median = SimpleImputer(strategy='median') # 中位数填充缺失值
imp_mode = SimpleImputer(strategy='most_frequent') # 众数填充
imp_0 = SimpleImputer(strategy='constant', fill_value=0) # 0填充
imp_mean.fit(data) # 拟合数据
result = imp_mean.transform(data) # 改换数据
result = imp_mean.fit_transform(data) # 拟合和改换一步到位
除了运用sklearn中的SimpleImputer进行简略填充,利用pandas也能够直接进行填充:
import pandas as pd
import numpy as np
data = pd.DataFrame(np.random.randint(10, 100, (5, 2))) # 预备测试数据
data.iloc[0:2, 0:2] = np.nan
# 运用pandas进行缺失值填充
result = data.fillna(0) # 0填充一切缺失值
# 均值填充第0列,中位数填充、众数填充同理
result = data.iloc[:, 0] = data.iloc[:, 0].fillna(data.iloc[:, 0].mean())
result = data.dropna(axis=0) # 删去一切含有缺失值的样本数据
留意:pandas中的.mean()
和.median()
办法回来对应均值或中位数,但由于众数或许含有多个,取众数.mode()
办法回来的是一个Series目标,填充时取其中的恣意值即可,一般取索引为0的值。
中位数只或许是一个或许两个,若为两个,则取这两个数的均值,但众数则或许有很多个
编码和哑变量
LabelEncoder和OrdinalEncoder分别用于给标签和特征数据进行编码,首要用于非名义变量。
import pandas as pd
from sklearn.preprocessing import LabelEncoder, OrdinalEncoder, OneHotEncoder
# 预备测试数据
data_dic = {
'性别': ['男', '女', '女', '男', '女'],
'学历': ['小学', '初中', '初中', '大学', '高中'],
'标签': ['标签3', '标签1', '标签2', '标签3', '标签2'],
}
data = pd.DataFrame(data_dic)
# 常用接口
le = LabelEncoder() # 创立目标
oe = OrdinalEncoder()
le = le.fit(data.loc[:, '标签']) # 拟合数据
result = le.transform(data.loc[:, '标签']) # 改换数据
result = le.fit_transform(data.loc[:, '标签']) # 拟合和改换一步达到
data = le.inverse_transform(result) # 逆向改换
data = pd.DataFrame(data_dic)
# 一般这样写
result = LabelEncoder().fit_transform(data.loc[:, '标签'])
result = OrdinalEncoder().fit_transform(data.loc[:, ['性别', '学历']])
# 常用特点
le.classes_ # 回来本来的字符串标签唯一值数组, 按该数组次序编号
oe.categories_ # 回来本来的字符串标签数组, 按该数组次序编号
OrdinalEcoder和LabelEncoder用法和接口几乎共同,差异在于LabelEncoder能够处理一维数据,且运用.classes_
特点来检查标签编号数组,OrdinalEncoder不能处理一维数据,且运用.categories_
特点来检查标签编号数组
OneHotEncoder独热编码首要用于名义变量,将特征转换为哑变量。
特征能够转换为哑变量,标签也能够,许多算法能够处理多标签问题,但这样的做法在现实中不常见。
常用参数:
-
categories
:表明每个特征都有哪些类别,默以为 ‘auto’,一般情况咱们都用默许值-
'auto'
:为自行判别 - 嵌套列表:列表中里边每个元素都是一个包括特征类别的列表。
-
-
'handle_unknown'
:表明对于未注明特征或类别的处理方法,默以为'error'
-
'error'
:设置categories
后,算法遇到了列表中没有包括的特征或类别时,会报错, -
'ignore'
:未在categories
注明的特征或类别的哑变量都会显现0,在逆向改换时未知特征或类别则会显现None
-
import pandas as pd
from sklearn.preprocessing import OneHotEncoder
# 预备测试数据
data_dic = {
'性别': ['男', '女', '女', '男', '女'],
'学历': ['小学', '初中', '初中', '大学', '高中'],
'标签': ['标签3', '标签1', '标签2', '标签3', '标签2'],
}
data = pd.DataFrame(data_dic)
# 常用接口
encoder = OneHotEncoder()
encoder.fit(data[['性别']]) # 拟合数据
result = encoder.transform(data[['性别']]) # 改换数据
result = encoder.fit_transform(data[['性别']]) # 拟合和改换一步到位
data = encoder.inverse_transform(result) # 逆向改换
# 一般这样写
result = OneHotEncoder().fit_transform(data[['性别']])
留意:OneHotEncoder在transform后回来的是稀少矩阵,需求运用 .toarray()
办法转为矩阵(二维数组);inverse_transfrom能够接纳稀少矩阵也能够接纳正常的矩阵,回来正常的矩阵。
此外,在通过OneHotEncoder处理后咱们需求自行运用pandas将哑变量拼接到原矩阵(pd.concat())和删去本来的特征(pd.drop())
接连型特征处理
Binarizer用于将数据二值化,所谓数据二值化,就是设置一个阈值,小于等于该阈值的记为0,大于该阈值的记为1。
常用接口:
import numpy as np
from sklearn.preprocessing import Binarizer
data = np.arange(10, 20).reshape(-1, 1)
bin = Binarizer(threshold=15) # 默许threshold为0
bin.fit(data) # 拟合数据
result = bin.transform(data) # 改换数据
result = bin.fit_transform(data) # 拟合和改换一步达到
# 一般这样用
result = Binarizer(threshold=15).fit_transform(data)
KBinsDiscretizer用于将接连型变量划分为分类变量,能够将接连型变量排序后按次序分箱后编码。
常用参数:
-
'n_bins'
:每个特征中分箱的个数,默以为5, -
'encode'
:编码方法,默以为'onehot'
-
'onehot'
:独热编码为哑变量,回来一个稀少矩阵 -
'onehot-dense'
:独热编码为哑变量,回来一个密集矩阵 (一般的矩阵) -
'ordinal'
:每个特征的每箱数据都被编码为一个整数,回来编码后的矩阵
-
-
'strategy'
:界说分箱方法,默以为'quantile'
-
'uniform'
:等宽分箱,每个特征的每箱数据中的极差不得高于 max(x)−min(x)Nbins\frac{max(x)-min(x)}{N_{bins}},其中 xx 表明某特征下的数据,NbinsN_{bins} 表明分箱个数 -
'quantile'
:等位分箱,即每个特征中的每个箱内的样本数量都相同 -
'kmeans'
:按kmeans聚类分箱,每个箱中的值到最近的一维k均值聚类的簇心的间隔都相同
-
常用接口:
import numpy as np
import pandas as pd
from sklearn.preprocessing import KBinsDiscretizer
data = pd.DataFrame(np.random.randint(10, 100, (5, 2))) # 预备测试数据
est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='quantile')
est.fit(data) # 拟合数据
result = est.transform(data) # 改换数据
result = est.fit_transform(data) # 拟合和改换一步到位
data = est.inverse_transform(result) #
# 一般这样用
result = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='quantile').fit_transform(data)
需求留意的是,这里的inverse_transform现已无法将数据转为本来的数据,由于在进行分箱离散化时,原始的接连值现已被转换到了分箱区间中,inverse_transform不或许康复到与原始值彻底相同的成果,但是它能够通过区间映射,将分类变量映射回接连值的规模中,从而部分康复原始数据的接连散布区间,成果并不会每一个值都彻底等于原始数据,但整体上逼近了原始数据的散布规模。
不主张运用inverse_transform,由于逆向改换后的数据现已不是原本的数据了。
Reference
- 菜菜的sklearn机器学习
- 相关网络资源和书本