数据预处理总结 Python

1.数据无量纲化

  在机器学习算法实践中,我们往往有着将不同规格的数据转换到同一规格,或不同分布的数据转换到某个特定分布
的需求,这种需求统称为将数据“无量纲化”。进行无量纲化处理后,表征不同属性(单位不同)的各特征之间才有可比性,如1cm 与 0.1kg 你怎么比?

通过无量纲化可以帮我们提升模型精度,避免某一个取值范围特别大的特征对距离计算造成影响。数据的无量纲化可以是线性的,也可以是非线性的。线性的无量纲化包括中心化(Zero-centered或者Meansubtraction)处理和缩放处理(Scale)。中心化的本质是让所有记录减去一个固定值,即让数据样本数据平移到某个位置。缩放的本质是通过除以一个固定值,将数据固定在某个范围之中,取对数也算是一种缩放处理。

1.1 preprocessing.MinMaxScaler 数据归一化

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

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

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


import pandas as pd
data=pd.DataFrame(data)
print(data)
'''
     0   1
0 -1.0   2
1 -0.5   6
2  0.0  10
3  1.0  18
'''
#实现归一化
scaler = MinMaxScaler() #实例化
scaler = scaler.fit(data) #fit,在这里本质是生成min(x)和max(x)
result = scaler.transform(data) #通过接口导出结果
print(result)
'''
[[0.   0.  ]
 [0.25 0.25]
 [0.5  0.5 ]
 [1.   1.  ]]
'''
#使用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一步导出结果
print(result)
#当X中的特征数量非常多的时候,fit会报错并表示,数据量太大了我计算不了
#此时使用partial_fit作为训练接口
#scaler = scaler.partial_fit(data)


   1.2 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=scaler.fit(data) #fit,本质是生成均值和方差
scaler.mean_ #查看均值的属性mean_
scaler.var_ #查看方差的属性var_
result = scaler.transform(data) #通过接口导出结果
print(result)
'''
[[-1.18321596 -1.18321596]
 [-0.50709255 -0.50709255]
 [ 0.16903085  0.16903085]
 [ 1.52127766  1.52127766]]
'''
result.mean() #导出的结果是一个数组,用mean()查看均值
'''
0.0
'''
result.std() #用std()查看方差
'''
1.0
'''



   1.3 Normalization(待完善)

   1.4 StandardScaler和MinMaxScaler选哪个?
       看情况。大多数机器学习算法中,会选择StandardScaler来进行特征缩放,因为MinMaxScaler对异常值非常敏
感。在PCA,聚类,逻辑回归,支持向量机,神经网络这些算法中,StandardScaler往往是最好的选择。

MinMaxScaler在不涉及距离度量、梯度、协方差计算以及数据需要被压缩到特定区间时使用广泛,比如数字图像
处理中量化像素强度时,都会使用MinMaxScaler将数据压缩于[0,1]区间之中。
       建议先试试看StandardScaler,效果不好换MinMaxScaler



from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import MinMaxScaler

# 线性回归:正规方程
# 1.获取数据
data = load_boston()

# 2.数据集划分
x_train, x_test, y_train, y_test = train_test_split(data.data, data.target, random_state=22)

# 3.1数据标准化
#transfer = StandardScaler()
#x_train = transfer.fit_transform(x_train)
#x_test = transfer.fit_transform(x_test)

#3.2数据归一化
scaler = MinMaxScaler() 
x_train = scaler.fit_transform(x_train)
x_test = scaler.fit_transform(x_test)

# 4.机器学习-线性回归(正规方程)
estimator = LinearRegression()
estimator.fit(x_train, y_train)

# 5.模型评估
# 5.1 获取系数等值
y_predict = estimator.predict(x_test)
print("预测值为: ", y_predict)
print("模型中的系数为: ", estimator.coef_)
print("模型中的偏置为: ", estimator.intercept_)

# 5.2 评价
# 回归性能评估:均方误差(Mean Squared Error)MSE 评价机制
error = mean_squared_error(y_test, y_predict)
print("误差为: ", error)
#通过数据标准化运行,误差为: 20.0621939903598
#通过数据归一化运行,误差为: 31.803119016104684

2.缺失值

缺失值处理的三种方法:直接使用含有缺失值的特征;删除含有缺失值的特征(该方法在包含缺失值的属性含有大量缺失值而仅仅包含极少量有效值时是有效的);缺失值补全。

常见的缺失值补全方法:均值插补、中值插补、众数插补、同类均值插补、建模预测等。

2.1  均值\中值\众数

如果样本属性的距离是可度量的,则使用该属性有效值的平均值来插补缺失的值;

如果的距离是不可度量的,则使用该属性有效值的众数来插补缺失的值。

2.2 同类均值插补

首先将样本进行分类,然后以该类中样本的均值来插补缺失值。

2.3 建模预测

将缺失的属性作为预测目标来预测,将数据集按照是否含有特定属性的缺失值分为两类,利用现有的机器学习算法对待预测数据集的缺失值进行预测。该方法的根本的缺陷是如果其他属性和缺失属性无关,则预测的结果毫无意义;但是若预测结果相当准确,则说明这个缺失属性是没必要纳入数据集中的

      2.4 填补的方法

       2.4.1 如下为Python中sklearn 自带类 impute.SimpleImputer ,处理缺失值

      sklearn.impute.SimpleImputer (missing_values=nan, strategy=’mean’, fill_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,将创建特征矩阵的副本,反之则会将缺失值填补到原本的特征矩阵中去


 

 

 

 

 

 

 

from sklearn.impute import SimpleImputer
imp_mean = SimpleImputer() #实例化,默认均值填补
imp_median = SimpleImputer(strategy="median") #用中位数填补
imp_0 = SimpleImputer(strategy="constant",fill_value=0) #用0填补

#data为需填补的字段
imp_mean = imp_mean.fit_transform(data) #fit_transform一步完成调取结果
imp_median = imp_median.fit_transform(data)
imp_0 = imp_0.fit_transform(data)

2.4.2 利用numpy 和pandas 进行填充,fillna,更加方便;

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

sklearn中规定必须导入数值型,然而在现实中,许多标签和特征在数据收集完毕的时候,都不是以数字来表现的。比如说,学历的取值可以是["小学",“初中”,“高中”,"大学"],付费方式可能包含["支付宝",“现金”,“微信”]等等。在这种情况下,为了让数据适应算法和库,我们必须将数据进行编码,即是说,将文字型数据转换为数值型。

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

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

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

我们来思考三种不同性质的分类数据:
       1) 舱门(S,C,Q)
       三种取值S,C,Q是相互独立的,彼此之间完全没有联系,表达的是S≠C≠Q的概念。这是名义变量
       2) 学历(小学,初中,高中)
        三种取值不是完全独立的,我们可以明显看出,在性质上可以有高中>初中>小学这样的联系,学历有高低,但是学
历取值之间却不是可以计算的,我们不能说小学 + 某个取值 = 初中。这是有序变量
       3) 体重(>45kg,>90kg,>135kg)
       各个取值之间有联系,且是可以互相计算的,比如120kg - 45kg = 90kg,分类之间可以通过数学计算互相转换。这
有距变量
       然而在对特征进行编码的时候,这三种分类数据都会被我们转换为[0,1,2],这三个数字在算法看来,是连续且可以计算的,这三个数字相互不等,有大小,并且有着可以相加相乘的联系。所以算法会把舱门,学历这样的分类特征,都误会成是体重这样的分类特征。这是说,我们把分类转换成数字的时候,忽略了数字中自带的数学性质,所以给算法传达了一些不准确的信息,而这会影响我们的建模。
       类别OrdinalEncoder可以用来处理有序变量,但对于名义变量,我们只有使用哑变量的方式来处理,才能够尽量
向算法传达最准确的信息。特征可以做哑变量,标签也可以,使用类sklearn.preprocessing.LabelBinarizer可以对做哑变量,许多算法都可以处理多标签问题(比如说决策树),但是这样的做法在现实中不常见。
 

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

sklearn.preprocessing.Binarizer
根据阈值将数据二值化(将特征值设置为0或1),用于处理连续型变量。大于阈值的值映射为1,而小于或等于阈
值的值映射为0。默认阈值为0时,特征中所有的正值都映射到1。二值化是对文本计数数据的常见操作,分析人员
可以决定仅考虑某种现象的存在与否。它还可以用作考虑布尔随机变量的估计器的预处理步骤(例如,使用贝叶斯
设置中的伯努利分布建模)。
preprocessing.KBinsDiscretizer
这是将连续型变量划分为分类变量的类,能够将连续型变量排序后按顺序分箱后编码。总共包含三个重要参数:
 

参数  含义&输入
n_bins  每个特征中分箱的个数,默认5,一次会被运用到所有导入的特征
encode 编码的方式,默认“onehot”
"onehot":做哑变量,之后返回一个稀疏矩阵,每一列是一个特征中的一个类别,含有该
类别的样本表示为1,不含的表示为0
“ordinal”:每个特征的每个箱都被编码为一个整数,返回每一列是一个特征,每个特征下含
有不同整数编码的箱的矩阵
"onehot-dense":做哑变量,之后返回一个密集数组。
strategy 用来定义箱宽的方式,默认"quantile"
"uniform":表示等宽分箱,即每个特征中的每个箱的最大值之间的差为
(特征.max() - 特征.min())/(n_bins)
"quantile":表示等位分箱,即每个特征中的每个箱内的样本数量都相同
"kmeans":表示按聚类分箱,每个箱中的值到最近的一维k均值聚类的簇心得距离都相同

 

你可能感兴趣的:(Python,机器算法,特征工程)