sklearn|Sklearn中数据预处理

数据预处理 Sklearn中的模块preprocessing:几乎包含数据预处理的所有内容
数据无量纲化
在机器学习算法实践中,我们往往有着将不同规格的数据转换到同一规格,或不同分布的数据转换到某个特定分布 的需求,这种需求统称为将数据“无量纲化”。
数据的无量纲化可以是线性的,也可以是非线性的。线性的无量纲化包括中心化(Zero-centered或者Mean subtraction)处理和缩放处理(Scale)。中心化的本质是让所有记录减去一个固定值,即让数据样本数据平移到 某个位置。缩放的本质是通过除以一个固定值,将数据固定在某个范围之中,取对数也算是一种缩放处理。
1.reprocessing.MinMaxScaler
当数据(x)按照最小值中心化后,再按极差(最大值 - 最小值)缩放,数据移动了最小值个单位,并且会被收敛到 [0,1]之间,而这个过程,就叫做数据归一化(Normalization,又称Min-Max Scaling)。
在sklearn当中,我们使用preprocessing.MinMaxScaler来实现这个功能。MinMaxScaler有一个重要参数, feature_range,控制我们希望把数据压缩到的范围,默认是[0,1]

from sklearn.preprocessing import MinMaxScaler data = https://www.it610.com/article/[[-1, 2], [-0.5, 6], [0, 10], [1, 18]] import pandas as pd pd.DataFrame(data) #实现归一化 scaler = MinMaxScaler() #实例化 scaler = scaler.fit(data) #fit,在这里本质是生成min(x)和max(x) result = scaler.transform(data) #通过接口导出结果 result result_ = scaler.fit_transform(data) #训练和导出结果一步达成 scaler.inverse_transform(result) #将归一化后的结果逆转 #使用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一步导出结果 result

结果
sklearn|Sklearn中数据预处理
文章图片

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

结果
sklearn|Sklearn中数据预处理
文章图片

缺失值
机器学习和数据挖掘中所使用的数据,永远不可能是完美的。很多特征,对于分析和建模来说意义非凡,但对于实 际收集数据的人却不是如此,因此数据挖掘之中,常常会有重要的字段缺失值很多,但又不能舍弃字段的情况。因 此数据预处理中非常重要的一项就是处理缺失值
首先导入数据(泰坦尼克号幸存者数据)
import pandas as pd data = https://www.it610.com/article/pd.read_csv(r"D:\Sklearn\Narrativedata.csv",index_col=0) data.head()

sklearn|Sklearn中数据预处理
文章图片

impute.SimpleImputer
这个类是专门用来填补缺失值的类,包含四个参数
参数 含义&输入
missing_values 告诉SimpleImputer,数据中的缺失值长什么样,默认空值np.nan
strategy 我们填补缺失值的策略,默认均值。
输入“mean”使用均值填补(仅对数值型特征可用)
【sklearn|Sklearn中数据预处理】输入“median"用中值填补(仅对数值型特征可用)
输入"most_frequent”用众数填补(对数值型和字符型特征都可用)
输入“constant"表示请参考参数“fill_value"中的值(对数值型和字符型特征都可用)
fill_value 当参数startegy为”constant"的时候可用,可输入字符串或数字表示要填充的值,常用0
copy 默认为True,将创建特征矩阵的副本,反之则会将缺失值填补到原本的特征矩阵中去。
填补数据前信息
sklearn|Sklearn中数据预处理
文章图片

data.info() #填补年龄 Age = data.loc[:,"Age"].values.reshape(-1,1) #sklearn当中特征矩阵必须是二维 Age[:20] from sklearn.impute import SimpleImputer imp_mean = SimpleImputer() #实例化,默认均值填补 imp_median = SimpleImputer(strategy="median") #用中位数填补 imp_0 = SimpleImputer(strategy="constant",fill_value=https://www.it610.com/article/0) #用0填补 imp_mean = imp_mean.fit_transform(Age) #fit_transform一步完成调取结果 imp_median = imp_median.fit_transform(Age) imp_0 = imp_0.fit_transform(Age) imp_mean[:20] imp_median[:20] imp_0[:20] #在这里我们使用中位数填补Age data.loc[:,"Age"] = imp_median data.info() #使用众数填补Embarked Embarked = data.loc[:,"Embarked"].values.reshape(-1,1)

填补后
sklearn|Sklearn中数据预处理
文章图片

处理分类型特征:编码与哑变量
为了让数据适 应算法和库,我们必须将数据进行编码,即是说,将文字型数据转换为数值型。
1.preprocessing.LabelEncoder:标签专用,能够将分类转换为分类数值
from sklearn.preprocessing import LabelEncoder y = data.iloc[:,-1] #要输入的是标签,不是特征矩阵,所以允许一维 le = LabelEncoder() #实例化 le = le.fit(y) #导入数据 label = le.transform(y)#transform接口调取结果 le.classes_ #属性.classes_查看标签中究竟有多少类别 label #查看获取的结果label le.fit_transform(y) #也可以直接fit_transform一步到位 le.inverse_transform(label) #使用inverse_transform可以逆转 data.iloc[:,-1] = label #让标签等于我们运行出来的结果 data.head()

替换前
sklearn|Sklearn中数据预处理
文章图片

替换后结果
sklearn|Sklearn中数据预处理
文章图片

2.preprocessing.OrdinalEncoder:特征专用,能够将分类特征转换为分类数值
from sklearn.preprocessing import OrdinalEncoder #接口categories_对应LabelEncoder的接口classes_,一模一样的功能 data_ = data.copy() data_.head() OrdinalEncoder().fit(data_.iloc[:,1:-1]).categories_ data_.iloc[:,1:-1] = OrdinalEncoder().fit_transform(data_.iloc[:,1:-1]) data_.head()

结果
sklearn|Sklearn中数据预处理
文章图片

3. preprocessing.OneHotEncoder:独热编码,创建哑变量
data.head() from sklearn.preprocessing import OneHotEncoder X = data.iloc[:,1:-1] enc = OneHotEncoder(categories='auto').fit(X) result = enc.transform(X).toarray() resultOneHotEncoder(categories='auto').fit_transform(X).toarray()pd.DataFrame(enc.inverse_transform(result)) enc.get_feature_names() result result.shape #axis=1,表示跨行进行合并,也就是将量表左右相连,如果是axis=0,就是将量表上下相连 newdata = https://www.it610.com/article/pd.concat([data,pd.DataFrame(result)],axis=1) newdata.head() newdata.drop(["Sex","Embarked"],axis=1,inplace=True) newdata.columns = ["Age","Survived","Female","Male","Embarked_C","Embarked_Q","Embarked_S"] newdata.head()

结果
sklearn|Sklearn中数据预处理
文章图片

处理连续型特征:二值化与分段
根据阈值将数据二值化(将特征值设置为0或1),用于处理连续型变量。大于阈值的值映射为1,而小于或等于阈 值的值映射为0。默认阈值为0时,特征中所有的正值都映射到1。
sklearn.preprocessing.Binarizer
#将年龄二值化 data_2 = data.copy() from sklearn.preprocessing import Binarizer X = data_2.iloc[:,0].values.reshape(-1,1) #类为特征专用,所以不能使用一维数组 transformer = Binarizer(threshold=30).fit_transform(X) transformer

sklearn|Sklearn中数据预处理
文章图片


    推荐阅读