文章目录
什么是特征预处理?
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