在scikit-learn中有一个preprocessing预处理模块,当某些数据不服从高斯分布,即不服从数学期望为0、方差为1的条件时我们可以使用它进行预处理以达到理想的数据效果。
下面以荷兰皇家气象学会的气象数据中一列记录日降雨量的数据为例。这些数据以.npy格式存放。我们分别计算预处理前后的期望值、标准差以及Anderson-Darling检验的结果。
"XU YONG KANG"
import numpy as np
from sklearn import preprocessing
from scipy.stats import anderson
#下面将针对来自荷兰皇家气象学会的气象数据进行预处理
# 选取一列记录日降雨量的数据
rain=np.load('rain.npy')
#得到一毫米为单位的日降水量
rain=0.1*rain
#该原始数据中将小于0.05的数值都将用作-1,但现将这些值设为0.025
rain[rain<0]=.05/2
print('Rain mean',rain.mean()) #期望值
print('Rain variance',rain.var()) #标准差
print('Anderson rain',anderson(rain)) #Anderson-Darling检验
#通过scale对数据进行缩放处理,使数学期望和方差达到要求
scaled=preprocessing.scale(rain)
print('Scaled mean',scaled.mean())
print('Scaled variance',scaled.var())
print('Anderson scaled',anderson(scaled))
#用binarize函数进行类型装换
binarized=preprocessing.binarize(rain.reshape(1,-1))
print(np.unique(binarized),binarized.sum())
#进行分类时,类LabelBinarize可以用整数来标注类别
lb=preprocessing.LabelBinarizer()
lb.fit(rain.astype(int))
print(lb.classes_)
我们会发现在对数据进行处理前,得出的值是
Rain mean 2.179195942665883
Rain variance 18.803443919014683
Anderson rain AndersonResult(statistic=5731.267850009339, critical_values=array([0.576, 0.656, 0.787, 0.918, 1.092]), significance_level=array([15. , 10. , 5. , 2.5, 1. ]))
发现该数据不满足数学期望为0,方差为1的要求,因此它不符合正态分布,同时数据分布情况也完全不对称,它不是高斯分布。
当我们对数据进行缩放处理后,结果如下:
Scaled mean 3.4130160280768244e-17
Scaled variance 1.0
Anderson scaled AndersonResult(statistic=5731.267850009339, critical_values=array([0.576, 0.656, 0.787, 0.918, 1.092]), significance_level=array([15. , 10. , 5. , 2.5, 1. ]))
会发现数学期望和标准差已经满足要求,但分布仍不对称。
有时需要把特征值由数值型转化为布尔型`
binarized=preprocessing.binarize(rain.reshape(1,-1))
print(np.unique(binarized),binarized.sum())