Sklearnのpreprocessingの全メソッドを解説

概要

Pythonで機械学習をするときに使うscikit-learn(恐らく、サイキットラーンと呼びます)には前処理用のライブラリであるpreprocessingが組み込まれています。前処理とは、データの欠損保管や正規化、カテゴリデータの数値化等のことです。このpreprocessingの全メソッドの効果を検証したのが今回の記事です。irisのデータを題材にして説明していきます。

#preprocessingはspという名前で使うこととする
import sklearn.preprocessing as sp

#お決まりのライブラリをインポート
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

if __name__ == "__main__":
    
    #irisデータをdfに格納
    df = pd.read_csv("iris.csv", index_col=0)
    

メソッド一覧

コンソール上でdir(sp)と入力すると、メンバの一覧が取得できます。その中でメソッドを抽出すると以下23メソッドがあることが分かります。以降の項目で各メソッドについて説明していきます。

add_dummy_featurebinarizeBinarizerdata
FunctionTransformerimputationImputerKernelCenterer
labelLabelBinarizerLabelEncodermaxabs_scale
MaxAbsScalerminmax_scaleMinMaxScalerMultiLabelBinarizer
normalizeNormalizerOneHotEncoderPolynomialFeatures
robust_scalescaleStandardScaler

add_dummy_feature

項目を1つ追加したいときに使う。


add_dummy_feature

以下のように直接渡せば機能する。

sp.add_dummy_feature(df[df.columns[0:4]])

左の列にダミー配列が追加された。

Out[1]: 
array([[ 1. ,  5.1,  3.5,  1.4,  0.2],
       [ 1. ,  4.9,  3. ,  1.4,  0.2],
       [ 1. ,  4.7,  3.2,  1.3,  0.2],
       [ 1. ,  4.6,  3.1,  1.5,  0.2],
       [ 1. ,  5. ,  3.6,  1.4,  0.2],
       [ 1. ,  5.4,  3.9,  1.7,  0.4],
       [ 1. ,  4.6,  3.4,  1.4,  0.3],
...

binarize

閾値を設けてそれより大きい値を1に、小さい値を0にする(二値化)。


binarize

以下のように直接渡せば機能する。

sp.binarize(df[df.columns[0]], threshold=df[df.columns[0]].mean())

平均値以下の値は0に、それ以上の値は1に変換された。

Out[1]: 
array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
         0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
         0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
         0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  1.,
         1.,  0.,  1.,  0.,  1.,  0.,  1.,  0.,  0.,  1.,  1.,  1.,  0.,
         1.,  0.,  0.,  1.,  0.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,
         1.,  0.,  0.,  0.,  0.,  1.,  0.,  1.,  1.,  1.,  0.,  0.,  0.,
         1.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  1.,  0.,  1.,  1.,
         1.,  1.,  0.,  1.,  1.,  1.,  1.,  1.,  1.,  0.,  0.,  1.,  1.,
         1.,  1.,  1.,  1.,  0.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,
         1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  0.,
         1.,  1.,  1.,  1.,  1.,  1.,  1.]])

Binarizer

基本的な機能はbinarizeと同様だが、パラメータ設定と適用を分けて実施することができるため、一度覚えさせたパラメータをほかのデータにも適用したいときに有効。

binarizer = sp.Binarizer(threshold=df[df.columns[0]].mean())
binarizer.transform(df[df.columns[0]])

結果はbinarizeと同様になる。

data

調査中。

FunctionTransformer

全要素にsin関数等の関数処理を一括適用したいときに使う。


functiontransformer

①関数を渡す。②適用する。という2段階で使う。

transformer = sp.FunctionTransformer(np.sin)
transformer.transform(df[df.columns[0]])

全ての値をsin関数に通した結果が得られた。

Out[1]: 
array([[-0.92581468, -0.98245261, -0.99992326, -0.993691  , -0.95892427,
        -0.77276449, -0.993691  , -0.95892427, -0.95160207, -0.98245261,
        -0.77276449, -0.99616461, -0.99616461, -0.91616594, -0.46460218,
        -0.55068554, -0.77276449, -0.92581468, -0.55068554, -0.92581468,
        -0.77276449, -0.92581468, -0.993691  , -0.92581468, -0.99616461,
...

imputation

使わないメソッドと思われる。

Imputer

欠損値の穴埋め。平均か中央値か最頻値かで選ぶ。


imputer

①欠損方法を指定する。②学習する。③適用する。という3段階で使う。

まずdfをtempにコピーし、1つ目のデータを欠損値にしておく。

temp = df.copy()
temp.ix[0, 0] = np.NaN

確かに1つ目が欠損になっている。

temp[temp.columns[0]]
Out[1]: 
0      NaN
1      4.9
2      4.7
3      4.6
4      5.0
5      5.4
6      4.6
...

次に欠損値にNaNを指定し、穴埋め方法として平均処理するように設定。

imp = sp.Imputer(missing_values='NaN', strategy='mean', axis=1)
imp.fit(temp[temp.columns[0]])
imp.transform(temp[temp.columns[0]])

欠損値が平均値で埋められた。

temp[temp.columns[0]]
Out[1]: 
0      5.84832215
1      4.9
2      4.7
3      4.6
4      5.0
5      5.4
6      4.6
...

KernelCenterer

写像関数。何のために使うものなのかは調査中。

①インスタンスを作る。②学習する。③適用する。という3段階で使う。

kc = sp.KernelCenterer()
kc.fit(df[df.columns[0]])
kc.transform(df[df.columns[0]])

学習と適用を同じデータにすると全て同じ値になる模様。

Out[1]: 
array([[ 870.65666667,  870.65666667,  870.65666667,  870.65666667,
         870.65666667,  870.65666667,  870.65666667,  870.65666667,
         870.65666667,  870.65666667,  870.65666667,  870.65666667,
         870.65666667,  870.65666667,  870.65666667,  870.65666667,
...

fitするデータを変えてみた場合。

kc = sp.KernelCenterer()
kc.fit(df[df.columns[1]])
kc.transform(df[df.columns[0]])

さっきとは少し違う結果になった。

Out[1]: 
array([[ 453.85666667,  454.15666667,  453.75666667,  453.75666667,
         453.65666667,  453.75666667,  453.45666667,  453.85666667,
         453.75666667,  454.05666667,  453.95666667,  453.65666667,
         454.05666667,  453.55666667,  454.05666667,  453.55666667,
...

グラフにしてみる。よく分からないが非線形に写像されているようだ。

Out[1]: 
plt.plot(df[df.columns[0]], kc.transform(df[df.columns[0]])[0], 'o')

kernelcenterer_1-1

label

使わないメソッドと思われる。

label_binarize

要素ごとに一致する値があるかどうかの列を作る。オブジェクト型の説明変数を機械学習にかけたいときによく使う前処理手法。


label_binarize

データと項目を渡すことで動作する。

sp.label_binarize(df[df.columns[4]], classes=df[df.columns[4]].unique())

[‘Iris-setosa’, ‘Iris-versicolor’, ‘Iris-virginica’]に一致するかどうかの結果が返される。

Out[1]: 
array([[1, 0, 0],
       [1, 0, 0],
       [1, 0, 0],
       [1, 0, 0],
       [1, 0, 0],
...

LabelBinarizer

基本的な機能はlabel_binarizeと同様だが、パラメータ設定と適用を分けて実施することができるため、一度覚えさせたパラメータをほかのデータにも適用したいときに有効。
①インスタンスを作る。②classを指定する。③適用する。という3段階で使う。

lb = sp.LabelBinarizer()
lb.fit(df[df.columns[4]].unique())
lb.transform(df[df.columns[4]])

結果はlabel_binarizeと同様になる。

LabelEncoder

文字列要素を数値コードに変換する。オブジェクト型の目的変数を機械学習にかけたいときによく使う前処理手法。


labelencoder

①インスタンスを作る。②classを指定する。③適用する。という3段階で使う。

le = sp.LabelEncoder()
le.fit(df[df.columns[4]].unique())
le.transform(df[df.columns[4]])

[‘Iris-setosa’, ‘Iris-versicolor’, ‘Iris-virginica’]が[0, 1, 2]に変換された形で返される。

Out[1]: 
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], dtype=int64)

maxabs_scale

直接引数に与えれば、各列ごとにその列の最大値で割った値が返ってくる。

sp.maxabs_scale(df[df.columns[0]])

グラフにしてみると、確かに最大が1になっていることが分かる。

plt.plot(df[df.columns[0]], sp.maxabs_scale(df[df.columns[0]]), 'o')

maxabs_scale_1

MaxAbsScaler

基本的な機能はmaxabs_scaleと同様だが、パラメータ設定と適用を分けて実施することができるため、一度覚えさせたパラメータをほかのデータにも適用したいときに有効。
①インスタンスを作る。②学習する。③適用する。という3段階で使う。

mas = sp.MaxAbsScaler()
mas.fit(df[df.columns[0:4]])
mas.transform(df[df.columns[0:4]])

結果はmaxabs_scaleと同様になる。

minmax_scale

直接引数に与えれば、各列ごとに最大値が1、最小値が0になるように線形写像された結果が返ってくる。

sp.minmax_scale(df[df.columns[0]])

グラフにしてみると、確かに最大が1、最小が0になっていることが分かる。

plt.plot(df[df.columns[0]], sp.minmax_scale(df[df.columns[0]]), 'o')

minmax_scale_1

MaxAbsScaler

基本的な機能はminmax_scaleと同様。使い方はmaxabs_scaleに対するMaxAbsScalerと同様。

MultiLabelBinarizer

入れ子になっている要素列に対して使えるバージョンのLabelBinarizer。irisデータは該当しないため未検証。

normalize

直接引数に与えれば、l1又はl2ノルムに基づき正規化された結果が返ってくる。

sp.normalize(df[df.columns[0]], norm="l1")
plt.plot(df[df.columns[0]], sp.normalize(df[df.columns[0]])[0], 'o')

normalize_1

Normalizer

基本的な機能はnormalizeと同様。使い方はmaxabs_scaleに対するMaxAbsScalerと同様。

OneHotEncoder

調査中。

PolynomialFeatures

引数に対して、指定した次数までの多項値を作成する。例えば、引数にx,yを渡し、次数に2を指定した場合は以下のようになる。
[x, y] ⇒ [1, x, y, x*2, x*y, y*y]

使い方は①インスタンス作成、②適用の2段階が必要。

pf = sp.PolynomialFeatures(degree=2)
pf.transform([2, 3])

すると以下のような結果が得られる。

Out[1]: 
array([[ 1.,  2.,  3.,  4.,  6.,  9.]])

robust_scale

動作内容は調査中。何かしらの線形写像を実施している。

sp.robust_scale(df[df.columns[0]])

robust_scale_1

RobustScaler

基本的な機能はrobust_scaleと同様。使い方はmaxabs_scaleに対するMaxAbsScalerと同様。

scale

平均を0にし、標準偏差を1に設定する所謂正規化を実施したいときに使う。

sp.scale(df[df.columns[0]])

scale_1

StandardScaler

基本的な機能はscaleと同様。使い方はmaxabs_scaleに対するMaxAbsScalerと同様。

まとめ

sklearnのpreprocessingは便利なものがあるんだろうな、と思いながら調べられてなかったので、この機会に(ほぼ)全メソッドについて紹介しました。いろいろなものがありましたが、とりあえずよく使うのは以下だと思います。

  • 数値データの正規化:scale(又は、StandardScaler
  • 数値データのフラグ化:binarize(又は、Binarizer
  • 文字列(説明変数)のコード化:label_binarize(又は、LabelBinarizer
  • 文字列(目的変数)のコード化:LabelEncoder

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA