什么是特征预处理?

provides several common utility functions and transformer classes to change raw feature vectors into a representation that is more suitable for the downstream estimators.

翻译过来:通过一些转换函数将特征数据转换成更加适合算法模型的特征数 据过程

两种常用的幅度调整的方式

(1)归一化
(2)标准化

#为什么我们要进行归一化/标准化?
特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量 级,容易影响(支配)目标结果,使得一些算法无法学习到其它的特征.

(1)归一化

通过计算把数据归纳统一到指定范围中去

  • item代表每列中索引从0开始到-1的元素
  • max为列中的最大值,min为列中的最小值
  • mx为选定范围的最大值,mi为选定范围的最小值

a )API使用

from sklearn.preprocessing import MinMaxScaler
#参数:feature_range=(0,1)为归一化调整的范围
sca = MinMaxScaler(feature_range=(1,3))
#fit的数据仅是被保存在内存中,并没有被执行转换
sca.fit(data)
#当数据被transform以后才会被执行归一化
sca_data = sca.transform(data)
#获取每列中的最大值,返回一个向量
sca.data_max
#讲归一化的数据反转回去
sca.inverse_transform(sca_data)

b) 原理解析(使用python模拟实现)

class MinMax(object):

	def __init__(self,feature_range=(0,1)):
		self.mi = feature_range[0]
		self.mx = feature_range[1]
		
	def fit(self,X):
		self.train = np.array(X)
		#获取列的数量
		col_num = self.train.shape[1]
		self.res = []
		for i in range(col_num):
			min_ = self.train[:,i].min()
			max_ = self.train[:,i].max()
			self.res.append(np.array([min_,max_]))
			
	def transform(self,X):
		data = np.array(X)
		self.res = np.array(self.res)
		#获取列的数量
		col_num = self.train.shape[1]
		for i in range(col_num):
			x = (data[:,i] - self.res[i,0]) / (self.res[i,1]-self.res[i,0])
			data[:,i] = x*(self.mx-self.mi)+self.mi
		return data

c) 归一化总结

注意最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影 响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。(异常值往往就 是极小值和极大值)

(2)标准化

通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内

a) API使用

from sklearn.preprocessing import StandardScale
#处理之后每列来说所有数据都聚集在均值0附近标准差差为1
std_ = StandardScale()
#fit_transform = fit() + transform()函数
res = std_.fit_transform(data)
#X:numpy array格式的数据[n_samples,n_features]
#返回值:转换后的形状相同的array

b)标准化总结

  • 在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。
  • 适合动态数据实时分析。

案例

标准化

数据:

  A       B         C   
10000     28         0.1 
10       52         0.2
100       49        0.15
8        21         0.3
A = np.array([10000,10,100,8])
mean_ = A.mean()
std_ = A.std()

res = (A-mean_)/std_
res.mean(),res.std()
#(0.0, 0.9999999999999999)

归一化

数据:

  A       B         C   
10000     28         0.1 
10       52         0.2
100       49        0.15
8        21         0.3

(A1-A4)^2 + (B1-B4)^2 + (C1-C4)^2

(10000-8)^2 + (28-21)^2 + (0.1-0.3)^2

100000000   +  50    + 0.004
min_ = 8
max_ = 10000
A = np.array([10000,10,100,8])

res = (A - min_) / (max_ - min_)
mx = 3
mi = 1
res * (mx-mi) + mi
#1 * (3-1) +1 =3
#0.5 * (3-1) +1 =2
# 0 +1 =1