sklearn学習ノート(一)-データの前処理sklearn.preprocessing


データの前処理preprocessing
  • 標準化(Standardization)
  • 正規化(Normalization)
  • 二値化
  • 分類特徴符号化
  • 推定欠落データ
  • 多項式特徴
  • を生成する.
  • カスタムコンバータ
  • 1.標準化Standardization(ここでは平均値の除去と分散の標準化を指す)標準化は多くのデータ分析問題の重要なステップであり、機械学習アルゴリズムを利用してデータ処理を行う必要なステップでもある.
    1.1 z-score標準化z-score標準化とは、データを平均値0分散1に変換するガウス分布、すなわち通常z-score標準化を指すが、標準正規分布に従わない特徴に対しては、このような効果は劣る.
    実際の応用では,分布の形状を無視し,データをz−score標準化することが多い.もしデータを標準化処理しないならば、機械学習アルゴリズム(例えばSVM)を利用する過程の中で、もし目標関数の中の1つの特徴の分散の階数の級がその他の特徴の分散より高いならば、それではこの特徴は目標関数の中で主導的な地位を占めて、それから“水没”のその他の特徴の作用.
    Pythonにおけるscale関数は,配列構造に類似したデータを処理できるz−score標準化を迅速に行う方法である.Z-score標準化後のデータの平均値は0,分散は1であった.
    >>> from sklearn import preprocessing
    >>> x = [[1., -1., 2],   #     [feature1, feature2, feature3]
    ... [2., 0., 0.],
    ... [0., 1., -1.]]
    >>> x_scaled = preprocessing.scale(x)
    >>> x_scaled
    array([[ 0.        , -1.22474487,  1.33630621],
           [ 1.22474487,  0.        , -0.26726124],
           [-1.22474487,  1.22474487, -1.06904497]])
    >>> x_scaled.mean(axis=0)
    array([ 0.,  0.,  0.])
    >>> x_scaled.std(axis=0)
    array([ 1.,  1.,  1.])

    preprocessingモジュールはまた、Transformerというアプリケーションインタフェースを実現し、トレーニングデータの平均値と標準差を計算し、トレーニングデータセットで再使用できる実用的なクラスStandardScaleを提供しています.
    >>> scaler = preprocessing.StandardScaler().fit(x)
    >>> scaler
    StandardScaler(copy=True, with_mean=True, with_std=True)
    >>> scaler.mean_
    array([ 1.        ,  0.        ,  0.33333333])
    >>> scaler.scale_
    array([ 0.81649658,  0.81649658,  1.24721913])
    >>> scaler.transform(x)
    array([[ 0.        , -1.22474487,  1.33630621],
           [ 1.22474487,  0.        , -0.26726124],
           [-1.22474487,  1.22474487, -1.06904497]])
    >>> scaler = preprocessing.StandardScaler().fit(x)
    >>> scaler
    StandardScaler(copy=True, with_mean=True, with_std=True)
    >>> scaler.transform([[-1., 1., 0.]])  #          
    array([[-2.44948974,  1.22474487, -0.26726124]])

    1.2特徴データを1つの範囲scale to a rangeにスケーリングする最大値と最小値を用いてスケーリングする.通常、データを0-1の範囲に縮小するか、各特徴の絶対値の最大値を単位スケールにスケーリングし、MinMaxScalerとMaxAbsScalerを用いてそれぞれ実現する.この方法を使用する場合、(1)特徴の標準差が小さい(2)疎データセットの0値を0に続けることができる
    >>> x
    [[1.0, -1.0, 2], [2.0, 0.0, 0.0], [0.0, 1.0, -1.0]]
    >>> min_max_scaler = preprocessing.MinMaxScaler()
    >>> x_scaled_minmax = min_max_scaler.fit_transform(x)
    >>> x_scaled_minmax
    array([[ 0.5       ,  0.        ,  1.        ],
           [ 1.        ,  0.5       ,  0.33333333],
           [ 0.        ,  1.        ,  0.        ]])
    >>> #  transformer              ,                       。
    >>> x_test = np.array([[3., 1., 4.]])
    >>> min_max_scaler.transform(x_test)
    array([[ 1.5       ,  1.        ,  1.66666667]])
    

    スケーリング演算子のいくつかのプロパティを表示できます.
    min_, scale_, data_min_, data_max_, data_range_, 
    >>> min_max_scaler.scale_  #     =1/(max-min)
    array([ 0.5       ,  0.5       ,  0.33333333])
    >>> min_max_scaler.min_   # (x-min)/(max-min),   min_  min/(max-min)
    array([ 0.        ,  0.5       ,  0.33333333])
    

    MaxAbsScalerは上記の用法と似ているが,標準化後のデータの取値範囲は[−1,1]である.これは、疎データまたはデータセンターが0になったデータにとって有意義である.
    >>> x=[[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]]
    >>> max_abs_scaler = preprocessing.MaxAbsScaler()
    >>> max_abs_scaler.fit_transform(x)
    array([[ 0.5, -1. ,  1. ],
           [ 1. ,  0. ,  0. ],
           [ 0. ,  1. , -0.5]])
    >>> x_test = [[-2., 4., 2.]]
    >>> max_abs_scaler.transform(x_test)
    array([[-1.,  4.,  1.]])
    >>> max_abs_scaler.scale_
    array([ 2.,  1.,  2.])

    1.3疎データのスケーリング疎データを配置すると、データの疎構造が破壊される可能性があります.しかし,疎データをスケーリングすることは,特にアウトラインの異なる特徴入力に対して意味がある.
    MaxAbsScalerとmaxabs_scaleは、特に疎データのスケールに適しています.また、scaleとStandardScalerはscipyを処理することができる.sparseマトリクスを入力とする場合、with_MeanはFalseに設定されています.そうでない場合、デフォルトの設定ではデータの疎型が破壊され、ValueErrorのエラーが放出され、メモリが大量に消費されてメモリがオーバーフローする可能性があります.RobustScalerは疎データの処理には適用されませんが、そのtransformメソッドは疎データに作用します.
    なお、スケーラ(scaler)は、圧縮された疎行および疎列データ(scipy.sparse.csr_matrixおよびscipy.sparse.csc_matrixを参照)を入力することを可能にし、他の疎入力は圧縮された疎行表現に変換される.不要なメモリ消費を回避するために、CSRまたはCSC表現を使用することを推奨します.最後に、設定中のデータが十分に小さい場合は、sparse matricesのtoarrayメソッドを使用して、疎な入力データを配列に変換できます.sklearn.preprocessing.maxabs_scale(X, axis=0, copy=True) class sklearn.preprocessing.MaxAbsScaler(copy=True)#Transformer API
    1.4 outlier付きのデータをスケーリング異常値が含まれている場合、平均値と分散を使用してデータをスケーリングする効果はよくありません.この場合、robust_を使用できます.scaleとRobustScale.sklearn.preprocessing.robust_scale(X, axis=0, with_centering=True, with_scaling=True, quantile_range=(25.0, 75.0), copy=True)[source] class sklearn.preprocessing.RobustScale(with_centering=True,with_scaling=True,quantile_range=(25.0,75.0),copy=True)#Transformer API
    この2つの方法で計算したデータの平均値と範囲はより信頼できる.ScaleとStandardScalerは1次元配列に使用でき,これは回帰中のターゲット/応答変数のスケーリングに非常に有用である.
    1.5中核行列(関数phiで定義された特徴空間上で点積を計算して得られる)がある場合、KernelCenterは、関数phiで定義された特徴空間内の内積構造の核行列が平均値を除去した空間に移動できるように、核行列を移動させることができる.
    2.正規化(Normalization)正規化とは、サンプルを単位ベクトルにスケーリングすることである.このプロセスは,点積や他の核法のような二次方程式を用いて試料対間の類似性を計算する必要がある場合に非常に有用である.この仮定は,テキスト分類とコンテンツクラスタリングによく用いられるベクトル空間モデルの基礎である.normalize関数は、1パラメータl 1または2パラメータl 2を使用することができる単一構造類似配列のデータセットを処理する迅速で簡単な方法を提供する.
    >>> x=[[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]]
    >>> x_normalized = preprocessing.normalize(x, norm='l2')
    >>> x_normalized
    array([[ 0.40824829, -0.40824829,  0.81649658],
           [ 1.        ,  0.        ,  0.        ],
           [ 0.        ,  0.70710678, -0.70710678]])

    同様に、preprocessingモジュールは、Transformer APIを使用して同じ操作を実行できるエンティティクラスNormalizerも提供する(fitメソッドはここでは意味がないが、正規化は各サンプルに対して独立して行われるためである).
    >>> x=[[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]]
    >>> normalizer = preprocessing.Normalizer().fit(x)
    >>> normalizer
    Normalizer(copy=True, norm='l2')
    >>> normalizer.transform(x)
    array([[ 0.40824829, -0.40824829,  0.81649658],
           [ 1.        ,  0.        ,  0.        ],
           [ 0.        ,  0.70710678, -0.70710678]])
    >>> normalizer.transform([[1., -1., 0]])
    array([[ 0.70710678, -0.70710678,  0.        ]])

    疎入力データの場合、normalizeおよびNormalizerは、非疎配列タイプおよび疎行列タイプの左右の入力を受け入れることができる.疎データは圧縮された疎行表現に変換されます.
    3.2値化3.1フィーチャーの2値化プロセスは、しきい値を定義し、数値フィーチャーのブール値を得ることです.これは,入力データが多重バーヌリー分布に従う確率推定量を仮定するのに非常に有用である.これは、テキスト処理中にもよく見られます.実力系Binarizerはこの過程を実現することができる.同様にfit関数は意味がありません.
    >>> x=[[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]]
    >>> binarizer = preprocessing.Binarizer().fit(x)
    >>> binarizer
    Binarizer(copy=True, threshold=0.0)
    >>> binarizer.transform(x)
    array([[ 1.,  0.,  1.],
           [ 1.,  0.,  0.],
           [ 0.,  1.,  0.]])
    >>> binarizer = preprocessing.Binarizer(threshold=1.1)
    >>> binarizer.transform(x)
    array([[ 0.,  0.,  1.],
           [ 1.,  0.,  0.],
           [ 0.,  0.,  0.]])

    また、Transformer APIを使用する必要がない場合には、binarizeメソッドを変換することも提供される.binarizeもBinarizerも疎入力を処理できます.
    4.分類特徴符号化ある特徴が連続して値を取るのではなく分類データである場合、分類特徴を符号化する必要がある.例えば、人間の性別には「男」、「女」の区分があり、国籍は「中国」、「イギリス」、「アメリカ」であり、使用するブラウザは「FireFox」、「Chrome」、「Safari」、「IE」である可能性がある.このような特徴は、それぞれ異なる整数で表記することができる.例えば、「男」、「女」は「0,1」、「中国」、「イギリス」、「アメリカ」は「0,1,2」、「FireFox」、「Chrome」、「Safari」、「IE」は「0,1,2,3」とそれぞれ表記される.
    しかし,この整数表現法はscikit−learn推定量に直接用いることはできない.このアルゴリズムパケットは連続変数を入力することを望んでいるため,異なる種類を異なる大きさに理解する.この問題を解決する1つの方法はone−of−Kまたはone−hot符号化を用いてOneHotEncoderによって実現することである.この推定量は、m個の値を含む各分類特徴を、active状態にある1つのみのm個の2値特徴に変換する.
    >>> enc = preprocessing.OneHotEncoder()
    >>> enc.fit([[0,0,3],[1,1,0],[0,2,1],[1,0,2]])
    OneHotEncoder(categorical_features='all', dtype=<class 'float'>,
           handle_unknown='error', n_values='auto', sparse=True)
    >>> enc.transform([[0,1,3]]).toarray()
    array([[ 1.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  1.]])  #   9 
    >>> # feature1  0,1    ,     
    >>> # feature2 0,1,2    ,     
    >>> # feature3 0,1,2,3    ,     

    各フィーチャーの分類個数は、デフォルトでは入力データセットに基づいて自動的に計算されます.ただしパラメータn_を設定することでvaluesは人為的に設定します.上記の例では、3つの分類属性のオプション値の数は、それぞれ2,3,4である.特に、訓練データセットが可能な値に訓練サンプルがない場合、人為的に分類数を制定する必要がある.例:
    >>> enc = preprocessing.OneHotEncoder(n_values=[2, 3, 4])
    >>> enc.fit([[1,2,3],[0,2,0]])
    OneHotEncoder(categorical_features='all', dtype=<class 'float'>,
           handle_unknown='error', n_values=[2, 3, 4], sparse=True)
    >>> enc.transform([[1 , 0, 0]]).toarray()
    array([[ 0.,  1.,  1.,  0.,  0.,  1.,  0.,  0.,  0.]])

    5.推定欠落データが多くの場合、実際のデータセットに欠落値が存在する場合、データセットはスペース、NaNsまたは他のプレースホルダで記録される.ただしscikit-learnの入力変数は数値型であるべきであり,この場合欠落値を処理する必要がある.1つのポリシーは、欠落した値が存在するレコード全体を直接削除することです.しかし、このようにすると価値のある情報の一部が失われる可能性があります.より良い方法は、欠落データを推定することであり、例えば、欠落データをすでにデータから推定することである.
    Imputerクラスは、欠落した値の行または列の平均値、中央値、または出現頻度が最も高い値を欠落したデータの値として使用するなど、欠落した値を処理する基本的なポリシーを提供することができる.欠落した値がある行の平均値を欠落した値として使用する例を次に示します.
    >>> import numpy as np
    >>> from sklearn.preprocessing import Imputer
    >>> imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
    >>> imp.fit([[1, 2], [np.nan, 3], [7, 6]])
    Imputer(axis=0, copy=True, missing_values='NaN', strategy='mean', verbose=0)
    >>> X = [[np.nan, 2], [6, np.nan], [7, 6]]
    >>> print(imp.transform(X))                           
    [[ 4.          2.        ]
     [ 6.          3.666...]
     [ 7.          6.        ]]

    インプラントは、入力として疎行列もサポートします.
    >>> import scipy.sparse as sp
    >>> X = sp.csc_matrix([[1, 2], [0, 3], [7, 6]])
    >>> imp = Imputer(missing_values=0, strategy='mean', axis=0)
    >>> imp.fit(X)
    Imputer(axis=0, copy=True, missing_values=0, strategy='mean', verbose=0)
    >>> X_test = sp.csc_matrix([[0, 2], [6, 0], [7, 6]])
    >>> print(imp.transform(X_test))                      
    [[ 4.          2.        ]
     [ 6.          3.666...]
     [ 7.          6.        ]]

    6.多項式特徴を生成する入力データに非線形特徴がある場合、この操作はモデルの複雑さを増加させるのに非常に有用である.1つの一般的な用法は多項式特徴を生成し,特徴の高次項と相互作用項を得ることができる.PolynomialFeaturesによる実装:
    >>> import numpy as np
    >>> from sklearn.preprocessing import PolynomialFeatures
    >>> X = np.arange(6).reshape(3, 2)
    >>> X                                                 
    array([[0, 1],
           [2, 3],
           [4, 5]])
    >>> poly = PolynomialFeatures(2)
    >>> poly.fit_transform(X)                             
    array([[  1.,   0.,   1.,   0.,   0.,   1.],
           [  1.,   2.,   3.,   4.,   6.,   9.],
           [  1.,   4.,   5.,  16.,  20.,  25.]])

    このとき、特徴ベクトルX=(X 1,X 2)は、(1,X 1,X 2,X 1^2,X 1 X 2,X 2^2)に変換される.場合によっては相互作用項目のみが必要で、interaction_を設定することができます.only=True実装:
    >>> X = np.arange(9).reshape(3, 3)
    >>> X                                                 
    array([[0, 1, 2],
           [3, 4, 5],
           [6, 7, 8]])
    >>> poly = PolynomialFeatures(degree=3, interaction_only=True)
    >>> poly.fit_transform(X)                             
    array([[   1.,    0.,    1.,    2.,    0.,    0.,    2.,    0.],
           [   1.,    3.,    4.,    5.,   12.,   15.,   20.,   60.],
           [   1.,    6.,    7.,    8.,   42.,   48.,   56.,  336.]])

    ここで、X=(X 1,X 2,X 3)はto(1,X 1,X 2,X 3,X 1 X 2,X 1 X 3,X 2 X 3,X 1 X 2 X 3,X 1 X 2 X 3)に変換される.
    多項式特性は、SVCおよびKernelPCAのような多項式コア関数を使用するコア法によく用いられる.
    7.カスタム変換器私たちは常にPythonの関数をtransformerに変換して、データの洗浄と前処理に使用することを望んでいます.FunctionTransformerメソッドを使用して、任意の関数を1つのTransformerに変換できます.たとえば、対数logのTransformerを構築します.
    >>> import numpy as np
    >>> from sklearn.preprocessing import FunctionTransformer
    >>> transformer = FunctionTransformer(np.log1p)
    >>> X = np.array([[0, 1], [2, 3]])
    >>> transformer.transform(X)
    array([[ 0.        ,  0.69314718],
           [ 1.09861229,  1.38629436]])