機械学習におけるデータプリプロセッシング


Standardizationは標準化され、できるだけデータを平均値がゼロ、分散が1のデータに変換し、標準正規分布(Gauss分布)のようにします.実際には、平均値を変更するだけでデータを集中させ、非連続的な特徴を標準差で除算するデータの分布は無視されます.sklearnのscale関数は、単純で高速なsinglearray-likeデータセット操作を提供します.
一、標準化、平均除去と分散スケール(Standardization,or mean removal and variance scaling)
データセットの標準化:個体の特徴があまりにも過剰であるか、明らかにGauss正規分布に従わない場合、標準化表現の効果は低い.実際の動作では,特徴データの分布形状を無視し,各特徴平均値を除去し,離散特徴の標準差を区分して等級化し,さらにデータ中心化を実現することが多い.
1.scaleゼロ平均単位分散
from sklearn import preprocessing
import numpy as np
X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])

X_scaled = preprocessing.scale(X)   
print(X_scaled)
output:
[[ 0.         -1.22474487  1.33630621]
 [ 1.22474487  0.         -0.26726124]
 [-1.22474487  1.22474487 -1.06904497]]
#scaled        ,    
X_scaled.mean(axis=0)  # column mean: array([ 0.,  0.,  0.])
X_scaled.std(axis=0)  #column standard deviation: array([ 1.,  1.,  1.])
print(X_scaled.mean(axis=0),X_scaled.std(axis=0))
output:
[ 0.  0.  0.] [ 1.  1.  1.]

注:もともとは行で計算されています.
2.データセットが同じ変換を使用することをテストするために、トレーニングセットの平均値と標準差を計算します.
訓練セットが訓練した平均値、分散であり、試験セットに用いられる(試験セットは平均値を減らし、分散で割って変換する)
scaler = preprocessing.StandardScaler().fit(X) 
print(scaler,scaler.mean_,scaler.scale_)  # scaler.std_   sacler.scaler    
#    scaler      ,           
print('scaler.transform(X)',scaler.transform(X))
print(scaler.transform([[-1., 1., 0.]]) )

注意:1)with_を設定するとMean=Falseまたはwith_std=Falseであればcenteringやscaling処理はしません.
2)scaleとStandardScalerは回帰モデルの目標値処理に使用できる
二、データ特徴をある範囲に拡大縮小する(scalingfeatures to a range)
もう1つの標準化方法は、所与の最小値と最大値の間、通常0と1の間にデータをスケーリングすることであり、MinMaxScalerによって実現することができる.あるいは最大の絶対値を単位サイズにスケールし、MaxAbsScalerで実現できます.
このような標準化手法を用いる理由は,データセットの標準差が非常に小さい場合や,データ中にゼロ(疎データ)が多く0要素を保存する必要がある場合があるためである.
1.MinMaxScale(最小最大値標準化)
数式:X_std = (X - X.min(axis=0))/(X.max(axis=0) - X.min(axis=0)) ;
X_scaler = X_std/(max - min) + min
fit関数:fit,fit_のみtransformはfitで変換されます
#  :      [0, 1] 。    : fit_transform()
X_train = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])
min_max_scaler = preprocessing.MinMaxScaler()
X_train_minmax = min_max_scaler.fit_transform(X_train)
print(X_train_minmax)


#      scale         
X_test = np.array([[ -3., -1., 4.]])
X_test_minmax = min_max_scaler.transform(X_test) #out: array([[-1.5 ,  0. , 1.66666667]])
#         scaler   
print(min_max_scaler.scale_,min_max_scaler.min_)
#out: array([ 0.5 ,  0.5,  0.33...])
#out: array([ 0.,  0.5,  0.33...])

2.MaxAbsScaler(絶対値最大標準化)
各数を絶対値の最大数で割った絶対値
上記の標準化方法と同様であるが、トレーニングセットは最大値で除算することによって[−1,1]にスケーリングされる.これは、データが0を中心としているか、非常に多くの0を含む疎なデータであることを意味する.
X_train = np.array([[ 1., -1.,  2.],  
                     [ 2.,  0.,  0.],  
                    [ 0.,  1., -1.]])  
max_abs_scaler = preprocessing.MaxAbsScaler()  
X_train_maxabs = max_abs_scaler.fit_transform(X_train)  
# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1.,  1. ], [ 1. , 0. ,  0. ],       [ 0. ,  1. , -0.5]])  
X_test = np.array([[ -3., -1.,  4.]])  
X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. ,  2. ]])  
max_abs_scaler.scale_  #out: array([ 2.,  1.,  2.])  

三、正規化(Normalization)
正規化のプロセスは、各サンプルを単位サンプル(各サンプルのサンプル数は1)にスケールすることであり、後で二次型(点積)や他のコア法を使用して2つのサンプル間の類似性を計算する場合に役立ちます.
Normalizationの主な考え方は、各サンプルについてそのp−ノルムを計算し、その後、サンプル中の各要素をノルムで除算することであり、この処理の結果、各処理後のサンプルのp−ノルム(l 1−norm,l 2−norm)が1に等しくなる.
p-ノルムの計算式:||X||p=(|x 1|^p+|x 2|^p+...+|xn|^p)^1/p
この方法は主にテキスト分類とクラスタリングに適用される.例えば、2つのTF−IDFベクトルのl 2−normを点積すると、これら2つのベクトルのコサイン類似性が得られる.
1、preprocessingを用いることができる.normalize()関数は、指定したデータを変換します.
>>> X = [[ 1., -1.,  2.],
...      [ 2.,  0.,  0.],
...      [ 0.,  1., -1.]]
>>> X_normalized = preprocessing.normalize(X, norm='l2')
 
>>> X_normalized                                      
array([[ 0.40..., -0.40...,  0.81...],
       [ 1.  ...,  0.  ...,  0.  ...],
       [ 0.  ...,  0.70..., -0.70...]])

2、processingを使用することができる.Normalizer()クラスは、トレーニングセットとテストセットのフィットと変換を実現します.
>>> normalizer = preprocessing.Normalizer().fit(X)  # fit does nothing
>>> normalizer
Normalizer(copy=True, norm='l2')
 
>>>
>>> normalizer.transform(X)                            
array([[ 0.40..., -0.40...,  0.81...],
       [ 1.  ...,  0.  ...,  0.  ...],
       [ 0.  ...,  0.70..., -0.70...]])
 
>>> normalizer.transform([[-1.,  1., 0.]])             
array([[-0.70...,  0.70...,  0.  ...]])

詳細なデータの事前処理方法は、公式ドキュメントを参照してください.http://scikit-learn.org/stable/modules/preprocessing.html#standardization-or-mean-removal-and-variance-scaling