机器学习——数据预处理

数据标准化

为什么要进行标准化处理

为什么要对数据进行标准化?
先来看看这两组数

array1=[0.02,0.01,0.05,0.06]
array2=[10000,15000,20000,11000]

现在若对数据进行处理,那会使结果不太准确,会发现array2数据的量级要比array1的大很多,因此array2对目标变量的影响会比array1大得多。或者这样来看,现在盒里面有5个红球,5个黄球,但是红球的体积要比黄球的大得多,现在问若取出了红球就可以获得一份奖品,要求你去抽奖,这个时候会发现这个抽奖是不公平的,虽然两种颜色的球数量都是一样的,但是因为体积不一样,大家可以凭借自己的触感来判断拿的是什么颜色的球,所以对于最后抽处红黄球的概率是不相等的,这个抽奖机制本身是不成立的。正确的应该是对两个颜色的球进行处理,要求其体积重量都应该是一样的。
在这里插入图片描述

因此选择我们需要对数据进行标准化处理,可以使得不同的特征变量具有相同的尺度,将特征的值控制在某个范围内,这样目标变量就可以由多个相同尺寸的特征变量进行控制,这样不同特征对参数的影响程度就一样了。即对数据标准化的目的是消除特征之间的差异性,便于特征一心一意学习权重。如果某个特征的方差的数量级大于其它的特征,那么,这个特征可能在目标函数中占主导地位,这使得模型不能从其它特征有效地学习。

z-score标准化

这种方法基于原始数据的均值mean标准差standard deviation进行数据的标准化。将特征A的原始值x使用z-score标准化到x1。z-score标准化方法适用于特征A的最大值和最小值未知的情况,若有超出取值范围的离群数据的情况。将数据按其特征(按列进行)减去其均值,然后除以其方差。最后得到的结果是,对每个特征/每列来说所有数据都聚集在0附近,即均值为0,方差值为1。数学公式如下:
在这里插入图片描述
这里有可以直接使用的库from sklearn.preprocessing import scale

from sklearn.preprocessing import scale
# x结构为array
def preprocessingscale_num(x):
	x1=scale(x)
	return x1

Min-max标准化

Min-max标准化方法是对原始数据进行线性变换。设minA和maxA分别为特征A的最小值和最大值,将A的一个原始值x通过min-max标准化映射成在区间**[0,1]**中的值x1,其公式为: 在这里插入图片描述
导入的库:from sklearn.preprocessing import Min-max

from sklearn.preprocessing import MinMaxScaler

def preprocessingminmaxscaler(x):
	minmaxnum=MinMaxScaler() 
	# 进行实例化
	x1=minmaxnum.fit_transform(x)
	return x1

MaxAbs标准化

MaxAbs的工作原理与Min-max非常相似,但是它只通过除以每个特征的最大值将训练数据特征缩放至 [-1, 1] 范围内,这就意味着,训练数据应该是已经零中心化或者是稀疏数据。公式如下:
在这里插入图片描述
导入库为:from sklearn.preprocessing import MaxAbsScaler

from sklearn.preprocessing import MaxAbsScaler

def preprocessingmaxabscaler(x):
	maxabscaler= MaxAbsScaler()
	x1=maxabscaler.fit_transform(x)
	return x1

非线性转换

若数据的特征不服从或者近似服从标准正态分布(即,零均值、单位标准差的正态分布)的话,算法的表现会大打折扣。非线性转换就是将我们的特征映射到均匀分布或者高斯分布(即正态分布)。

映射到均匀分布

相比线性缩放,该方法不受异常值影响,它将数据映射到了零到一的均匀分布上,将最大的数映射为1,最小的数映射为0。其它的数按从小到大的顺序均匀分布在0到1之间,如有相同的数则取平均值,如数据为np.array([[1],[2],[3],[4],[5]])则经过转换为:np.array([[0],[0.25],[0.5],[0.75],[1]])
导入库:from sklearn.preprocessing import QuantileTransformer

from sklearn.preprocessing import QuantileTransformer 

def qtfnum(x):
    x=QuantileTransformer().fit_transform(x)
    return x

映射到高斯分布

映射到高斯分布是为了稳定方差,并最小化偏差。
导入库:from sklearn.preprocessing import PowerTransformer

from sklearn.preprocessing import PowerTransformer 
def ptfnum(x):
	x1= PowerTransformer(method='box-cox', standardize=False)
	x = x1.fit_transform(x)  
	return x

归一化

归一化是缩放单个样本以具有单位范数的过程。归一化实质是一种线性变换,线性变换有很多良好的性质,这些性质决定了对数据改变后不会造成“失效”,反而能提高数据的表现,这些性质是归一化的前提。归一化能够加快模型训练速度,统一特征量纲,避免数值太大。值得注意的是,归一化是对每一个样本做转换,所以是对数据的每一行进行变换。而之前我们讲过的方法是对数据的每一列做变换。
有两种归一化:l1,l2
导入库:from sklearn.preprocessing import normalize

from sklearn.preprocessing import normalize

def normalization(x,y):
	# l1归一化
    x1=normalize(x,'l1')
    # l2归一化
    x2=normalize(x,'l2')
    return x1,x2    

离散编码

在数据挖掘中,特征经常不是数值型的而是分类型的。例如[“male”, “female”],在数据处理时可以用[0,1]。
LabelEncoder
导入库:from sklearn.preprocessing import LabelEncoder

from sklearn.preprocessing import LabelEncoder
def lenum(label):
	int_label = LabelEncoder()  
	label = int_label.fit_transform(label)
	return label

OneHotEncoder
这种整数特征表示并不能在sklearn的估计器中直接使用,因为这样的连续输入,估计器会认为类别之间是有序的,但实际却是无序的。如将male,female,转换为1,0。1比0要大,机器就会把这个关系考虑进去,而male,female之间是没有这样的关系的。所以我们需要使用另外一种编码方式,OneHot编码。
导入库:from sklearn.preprocessing import OneHotEncoder

from sklearn.preprocessing import OneHotEncoder
# 这里的label是经过LabelEncoder处理的,这里是加深处理
def oenum(label): 
	label = np.array(label).reshape(len(label),1)
	onehot_label = OneHotEncoder()  
	label = onehot_label.fit_transform(label).toarray()
	return label

生成多项式

在数据挖掘中,有时需要人为的制造一些特征,并且有的特征之间是有关联的。生成多项式特征可以轻松的为我们获取更多的数据,并获得特征的更高维度和互相间关系的项且引入了特征之间的非线性关系,可以有效的增加模型的复杂度。
PolynomialFeatures
在sklearn中通过PolynomialFeatures方法来生成多项式特征
导入库:from sklearn.preprocessing import PolynomialFeatures

from sklearn.preprocessing import PolynomialFeatures

def polyfeaturs(x):
	#生成二项式特征
    pf=PolynomialFeatures(2)
    x=pf.fit_transform(x)
    #多添加一个参数interaction_only,生成二项式特征,只需要特征之间交互
    pf1=PolynomialFeatures(degree=2,interaction_only=True)
    x1=pf.fit_transform(x)
    return x,x1

转换过程如图:第一个为生成二项式特征,第二个只需要特征之间交互,生成二项式特征
在这里插入图片描述

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值