機械学習

[前処理]pythonでの機械学習における正規化

どうも、皆さん

今回の記事ではpythonでの正規化を紹介したいと思います。

正規化にはNormalizerとMinMaxsclerというのがあり、それぞれ性質が違います。

 

そもそも、なぜ前処理する必要があるのか

現実世界では、ビッグデータという多くの情報が複雑に絡み合っています。その中には、エラーのデータや、欠陥したデータ、ノイズの入ったデータがあり、その様なデータを含んだものを機械学習に入れてしまうと精度の悪いモデルができてしまうのです。そのため、前処理することで適切なデータを抽出し、質の良い機械学習モデルができるのです。

前処理とは

データを機械学習にかける前に、機械学習が学習しやすいデータに変形すること。

 

ソースコード

import pandas, scipy, numpy 
df=pandas.read_csv( 'http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv ',sep=';') 
array=df.values 
x=array[:,0:8]

 

①標準ライブラリーであるpansad,scipy,numpyをインポートします。

②pandaでcsvファイルを読み込み変数dfに代入。この中にデータがあります。
(ワインを評価しているデータ)

③データはディクショナリ型なので、その中のkeyだけを取り出し変数arrayへ代入。

④2次元配列であるデータの全ての行において、0から7行目までを抽出
つまり、要素数を減らしている。

 

出力結果

[[7.400e+00 7.000e-01 0.000e+00 ... 1.100e+01 3.400e+01 9.978e-01] 
[7.800e+00 8.800e-01 0.000e+00 ... 2.500e+01 6.700e+01 9.968e-01] 
[7.800e+00 7.600e-01 4.000e-02 ... 1.500e+01 5.400e+01 9.970e-01] 
...     
[6.300e+00 5.100e-01 1.300e-01 ... 2.900e+01 4.000e+01 9.957e-01]   
[6.000e+00 3.100e-01 4.700e-01 ... 1.800e+01 4.200e+01 9.955e-01]]

 

・・・は、たくさんデータがあるという事です。

では、このデータを前処理していきます。

 

正規化

例えば、試験結果が国語が90点、数学が50点だったとします。

このとき、点数だけを見れば、国語の方が成績が良さそうですが、クラス内の平均点が国語が88点、数学が20点での場合、国語の偏差値は50.2、数学の偏差値が80.0ということになります。

つまり、偏差値という尺度で評価すると数学の方が優秀になります。

このように、一つの尺度として考えることが大事なのです。同じ尺度にするのを正規化と言います。

専門的に言うと、データの特徴量をある値の範囲内に収めることです。例えば、特徴量の範囲を 0≤x≤1 の範囲に変換します。これにより、データを最小値は 0、最大値は 1 の範囲内にできるため、上限と下限が存在しているデータに対して有効なのです。

 

MinMaxScalar

MinMaxScaler(feature_range=(a,b))とすることで、aからbまでの範囲で正規化を行います。※初期値は0から1です

 

ソースコード

from sklearn.preprocessing import MinMaxScaler 
scaler=MinMaxScaler(feature_range=(0,1))
rescaledX=scaler.fit_transform(x) 
numpy.set_printoptions(precision=3) 
rescaledX[0:5,:]

 

①標準ライブラリーのMinMaxScalarをインポートする。

②MinMaxScalarで0から1の範囲内に正規化する。このシステムをscalerに入れる。

③xを0から1の範囲にスケーリングする。

np.set_printoptions()による設定で。あくまでもprint()で表示するときの設定で、元のndarary自体の値は変わらない。
precisionは、小数点以下の桁数指定(precision, floatmode)なので、少数第3までの指定

⑤0から4行までにおいて、全ての列を抽出する。

出力結果

array([[0.248, 0.397, 0. , 0.068, 0.107, 0.141, 0.099, 0.568], 
           [0.283, 0.521, 0. , 0.116, 0.144, 0.338, 0.216, 0.494], 
           [0.283, 0.438, 0.04 , 0.096, 0.134, 0.197, 0.17 , 0.509], 
           [0.584, 0.11 , 0.56 , 0.068, 0.105, 0.225, 0.191, 0.582], 
           [0.248, 0.397, 0. , 0.068, 0.107, 0.141, 0.099, 0.568]])

膨大なデータが0から1の範囲内で出力しています。

 

Normalizer

大きさを1にして正規化します。

ベクトルの大きさであるノルムを、各要素に割っていくことでノルムを1にします。

 

ソースコード

from sklearn.preprocessing import Normalizer 
scaler=Normalizer().fit(x) 
normalizedX=scaler.transform(x) 
normalizedX[0:5,:]

 

①Normalizerのインポート

②データの変換はせずにノルム値の記憶だけを行い、scalerに入れている

③大きさ1にして正規化する

④0から4行までにおいて、全ての列を抽出する。

出力結果

array([[1.935e-01, 1.830e-02, 0.000e+00, 4.968e-02, 1.987e-03, 2.876e-01, 8.890e-01, 2.609e-02, 9.177e-02, 1.464e-02, 2.458e-01, 1.307e-01], 
           [1.070e-01, 1.207e-02, 0.000e+00, 3.566e-02, 1.344e-03, 3.429e-01, 9.190e-01, 1.367e-02, 4.389e-02, 9.327e-03, 1.344e-01, 6.858e-02], 
           [1.349e-01, 1.315e-02, 6.920e-04, 3.979e-02, 1.592e-03, 2.595e-01, 9.343e-01, 1.725e-02, 5.640e-02, 1.125e-02, 1.696e-01, 8.651e-02], 
           [1.736e-01, 4.340e-03, 8.681e-03, 2.945e-02, 1.163e-03, 2.635e-01, 9.301e-01, 1.547e-02, 4.898e-02, 8.991e-03, 1.519e-01, 9.301e-02], 
            [1.935e-01, 1.830e-02, 0.000e+00, 4.968e-02, 1.987e-03, 2.876e-01, 8.890e-01, 2.609e-02, 9.177e-02, 1.464e-02, 2.458e-01, 1.307e-01]])

 

正規化したデータに変換されています。(ベクトルの大きさ1に変換)

 

標準化

標準化とは、「平均を0に、標準偏差を1にするスケーリング」といういことです。 つまり、平均を0にして、そこからの、ばらつきを1の範囲に変換するということです。

ソースコード

from sklearn.preprocessing import StandardScaler 
scaler=StandardScaler().fit(x) 
rescaledX=scaler.transform(x) 
rescaledX[0:5,:]

①データの標準化機能を持つStandardScalerをインポート

②配列Xの平均と分散の値を記憶させ記憶させたデータをscalerに代入(数値は変わらない)

③平均と分散の値に変更

④0から4行までにおいて、全ての列を抽出する。

出力結果

array([[0.248, 0.397, 0. , 0.068, 0.107, 0.141, 0.099, 0.568],     
           [0.283, 0.521, 0. , 0.116, 0.144, 0.338, 0.216, 0.494],     
           [0.283, 0.438, 0.04 , 0.096, 0.134, 0.197, 0.17 , 0.509],     
           [0.584, 0.11 , 0.56 , 0.068, 0.105, 0.225, 0.191, 0.582],     
           [0.248, 0.397, 0. , 0.068, 0.107, 0.141, 0.099, 0.568]])

 

元のデータに対して、平均0と、ばらつき1のデータに変換できています。

 

-機械学習

Copyright© I am Human , 2022 All Rights Reserved Powered by AFFINGER5.