Pythonを使用した機械学習-データの準備

前書き

機械学習アルゴリズムは、モデルトレーニングを可能にする最も重要な側面であるため、データに完全に依存しています。一方、そのデータを理解できない場合は、MLアルゴリズムにデータを供給する前に、マシンは役に立たなくなります。簡単に言えば、マシンに解決させたい問題に対して、常に正しいデータ、つまり正しいスケール、フォーマット、意味のある機能を含むデータを提供する必要があります。

これにより、データの準備がMLプロセスの最も重要なステップになります。データの準備は、データセットをMLプロセスにより適したものにする手順として定義できます。

なぜデータ前処理?

MLトレーニング用の生データを選択した後、最も重要なタスクはデータの前処理です。広い意味で、データ前処理は、選択されたデータを、使用できる形式またはMLアルゴリズムにフィードできる形式に変換します。機械学習アルゴリズムの期待どおりになるように、常にデータを前処理する必要があります。

データ前処理技術

MLアルゴリズムのデータを生成するためにデータセットに適用できる次のデータ前処理技術があります-

スケーリング

ほとんどの場合、データセットはさまざまなスケールの属性で構成されていますが、そのようなデータをMLアルゴリズムに提供できないため、再スケーリングが必要です。データの再スケーリングにより、属性が同じスケールになるようになります。通常、属性は0から1の範囲に再スケーリングされます。勾配降下法やk最近傍法などのMLアルゴリズムには、スケーリングされたデータが必要です。scikit-learnPythonライブラリのMinMaxScalerクラスを使用してデータを再スケーリングできます。

この例では、以前に使用したPima IndiansDiabetesデータセットのデータを再スケーリングします。最初に、CSVデータがロードされ(前の章で行われたように)、次にMinMaxScalerクラスの助けを借りて、0から1の範囲で再スケーリングされます。

次のスクリプトの最初の数行は、CSVデータの読み込み中に前の章で記述したものと同じです。

from pandas import read_csv
from numpy import set_printoptions
from sklearn import preprocessing
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values

これで、MinMaxScalerクラスを使用して、0から1の範囲でデータを再スケーリングできます。

data_scaler = preprocessing.MinMaxScaler(feature_range=(0,1))
data_rescaled = data_scaler.fit_transform(array)

選択に応じて、出力用のデータを要約することもできます。ここでは、精度を1に設定し、出力の最初の10行を表示しています。

set_printoptions(precision=1)
print ("\nScaled data:\n", data_rescaled[0:10])

出力

Scaled data:
[
   [0.4 0.7 0.6 0.4 0.  0.5 0.2 0.5 1. ]
   [0.1 0.4 0.5 0.3 0.  0.4 0.1 0.2 0. ]
   [0.5 0.9 0.5 0.  0.  0.3 0.3 0.2 1. ]
   [0.1 0.4 0.5 0.2 0.1 0.4 0.  0.  0. ]
   [0.  0.7 0.3 0.4 0.2 0.6 0.9 0.2 1. ]
   [0.3 0.6 0.6 0.  0.  0.4 0.1 0.2 0. ]
   [0.2 0.4 0.4 0.3 0.1 0.5 0.1 0.1 1. ]
   [0.6 0.6 0.  0.  0.  0.5 0.  0.1 0. ]
   [0.1 1.  0.6 0.5 0.6 0.5 0.  0.5 1. ]
   [0.5 0.6 0.8 0.  0.  0.  0.1 0.6 1. ]
]

上記の出力から、すべてのデータが0から1の範囲に再スケーリングされました。

正規化

もう1つの有用なデータ前処理手法は、正規化です。これは、データの各行を1の長さに再スケーリングするために使用されます。これは主に、ゼロがたくさんあるスパースデータセットで役立ちます。scikit-learnPythonライブラリのNormalizerクラスを使用してデータを再スケーリングできます。

正規化の種類

機械学習では、次の2種類の正規化前処理手法があります。

L1正規化

これは、各行で絶対値の合計が常に最大1になるようにデータセット値を変更する正規化手法として定義できます。これは、最小絶対偏差とも呼ばれます。

Example

この例では、L1正規化手法を使用して、以前に使用したPima IndiansDiabetesデータセットのデータを正規化します。最初にCSVデータが読み込まれ、次にNormalizerクラスを使用して正規化されます。

次のスクリプトの最初の数行は、CSVデータの読み込み中に前の章で記述したものと同じです。

from pandas import read_csv
from numpy import set_printoptions
from sklearn.preprocessing import Normalizer
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv (path, names=names)
array = dataframe.values

これで、L1でNormalizerクラスを使用して、データを正規化できます。

Data_normalizer = Normalizer(norm='l1').fit(array)
Data_normalized = Data_normalizer.transform(array)

選択に応じて、出力用のデータを要約することもできます。ここでは、精度を2に設定し、出力の最初の3行を表示しています。

set_printoptions(precision=2)
print ("\nNormalized data:\n", Data_normalized [0:3])

Output

Normalized data:
[
   [0.02 0.43 0.21 0.1  0. 0.1  0. 0.14 0. ]
   [0.   0.36 0.28 0.12 0. 0.11 0. 0.13 0. ]
   [0.03 0.59 0.21 0.   0. 0.07 0. 0.1  0. ]
]

L2正規化

これは、各行で二乗の合計が常に最大1になるようにデータセット値を変更する正規化手法として定義できます。これは最小二乗とも呼ばれます。

Example

この例では、L2正規化手法を使用して、以前に使用したPima IndiansDiabetesデータセットのデータを正規化します。最初に、CSVデータがロードされ(前の章で行われたように)、次にNormalizerクラスの助けを借りて正規化されます。

次のスクリプトの最初の数行は、CSVデータの読み込み中に前の章で記述したものと同じです。

from pandas import read_csv
from numpy import set_printoptions
from sklearn.preprocessing import Normalizer
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv (path, names=names)
array = dataframe.values

これで、L1でNormalizerクラスを使用して、データを正規化できます。

Data_normalizer = Normalizer(norm='l2').fit(array)
Data_normalized = Data_normalizer.transform(array)

選択に応じて、出力用のデータを要約することもできます。ここでは、精度を2に設定し、出力の最初の3行を表示しています。

set_printoptions(precision=2)
print ("\nNormalized data:\n", Data_normalized [0:3])

Output

Normalized data:
[
   [0.03 0.83 0.4  0.2  0. 0.19 0. 0.28 0.01]
   [0.01 0.72 0.56 0.24 0. 0.22 0. 0.26 0.  ]
   [0.04 0.92 0.32 0.   0. 0.12 0. 0.16 0.01]
]

二値化

名前が示すように、これはデータをバイナリにするための手法です。データをバイナリにするために、バイナリしきい値を使用できます。そのしきい値を超える値は1に変換され、そのしきい値を下回る値は0に変換されます。たとえば、しきい値= 0.5を選択すると、それより上のデータセット値は1になり、これより下のデータセット値は0になります。なぜそれを呼ぶことができるのかbinarizing データまたは thresholdingデータ。この手法は、データセットに確率があり、それらを鮮明な値に変換する場合に役立ちます。

scikit-learnPythonライブラリのBinarizerクラスを使用してデータを2値化できます。

この例では、以前に使用したPima IndiansDiabetesデータセットのデータを再スケーリングします。最初にCSVデータが読み込まれ、次にBinarizerクラスを使用して、しきい値に応じて0と1のバイナリ値に変換されます。しきい値として0.5を使用しています。

次のスクリプトの最初の数行は、CSVデータの読み込み中に前の章で記述したものと同じです。

from pandas import read_csv
from sklearn.preprocessing import Binarizer
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values

これで、Binarizeクラスを使用して、データをバイナリ値に変換できます。

binarizer = Binarizer(threshold=0.5).fit(array)
Data_binarized = binarizer.transform(array)

ここでは、出力の最初の5行を示しています。

print ("\nBinary data:\n", Data_binarized [0:5])

出力

Binary data:
[
   [1. 1. 1. 1. 0. 1. 1. 1. 1.]
   [1. 1. 1. 1. 0. 1. 0. 1. 0.]
   [1. 1. 1. 0. 0. 1. 1. 1. 1.]
   [1. 1. 1. 1. 1. 1. 0. 1. 0.]
   [0. 1. 1. 1. 1. 1. 1. 1. 1.]
]

標準化

基本的にガウス分布でデータ属性を変換するために使用される、もう1つの有用なデータ前処理手法。平均とSD(標準偏差)は、平均が0でSDが1の標準ガウス分布とは異なります。この手法は、線形回帰、入力データセットのガウス分布を想定してより良い結果を生成するロジスティック回帰などのMLアルゴリズムで役立ちます。再スケーリングされたデータによる結果。scikit-learn PythonライブラリのStandardScalerクラスを使用して、データ(平均= 0およびSD = 1)を標準化できます。

この例では、以前に使用したPima IndiansDiabetesデータセットのデータを再スケーリングします。最初にCSVデータが読み込まれ、次にStandardScalerクラスを使用して、平均= 0およびSD = 1のガウス分布に変換されます。

次のスクリプトの最初の数行は、CSVデータの読み込み中に前の章で記述したものと同じです。

from sklearn.preprocessing import StandardScaler
from pandas import read_csv
from numpy import set_printoptions
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values

これで、StandardScalerクラスを使用してデータを再スケーリングできます。

data_scaler = StandardScaler().fit(array)
data_rescaled = data_scaler.transform(array)

選択に応じて、出力用のデータを要約することもできます。ここでは、精度を2に設定し、出力の最初の5行を表示しています。

set_printoptions(precision=2)
print ("\nRescaled data:\n", data_rescaled [0:5])

出力

Rescaled data:
[
   [ 0.64  0.85  0.15  0.91 -0.69  0.2   0.47  1.43  1.37]
   [-0.84 -1.12 -0.16  0.53 -0.69 -0.68 -0.37 -0.19 -0.73]
   [ 1.23  1.94 -0.26 -1.29 -0.69 -1.1   0.6  -0.11  1.37]
   [-0.84 -1.   -0.16  0.15  0.12 -0.49 -0.92 -1.04 -0.73]
   [-1.14  0.5  -1.5   0.91  0.77  1.41  5.48 -0.02  1.37]
]

データのラベリング

MLアルゴリズムの適切なファタの重要性と、データをMLアルゴリズムに送信する前に前処理するためのいくつかの手法について説明しました。この点に関するもう1つの側面は、データのラベル付けです。適切なラベリングを備えたMLアルゴリズムにデータを送信することも非常に重要です。たとえば、分類の問題の場合、単語や数字などの形式のラベルがデータにたくさんあります。

ラベルエンコーディングとは何ですか?

ほとんどのsklearn関数は、単語ラベルではなく番号ラベルが付いたデータを想定しています。したがって、そのようなラベルを数値ラベルに変換する必要があります。このプロセスは、ラベルエンコーディングと呼ばれます。scikit-learn PythonライブラリのLabelEncoder()関数を使用して、データのラベルエンコーディングを実行できます。

次の例では、Pythonスクリプトがラベルのエンコードを実行します。

まず、必要なPythonライブラリを次のようにインポートします-

import numpy as np
from sklearn import preprocessing

ここで、次のように入力ラベルを提供する必要があります-

input_labels = ['red','black','red','green','black','yellow','white']

コードの次の行は、ラベルエンコーダーを作成し、それをトレーニングします。

encoder = preprocessing.LabelEncoder()
encoder.fit(input_labels)

スクリプトの次の行は、ランダムな順序のリストをエンコードすることによってパフォーマンスをチェックします-

test_labels = ['green','red','black']
encoded_values = encoder.transform(test_labels)
print("\nLabels =", test_labels)
print("Encoded values =", list(encoded_values))
encoded_values = [3,0,4,1]
decoded_list = encoder.inverse_transform(encoded_values)

次のPythonスクリプトを使用して、エンコードされた値のリストを取得できます-

print("\nEncoded values =", encoded_values)
print("\nDecoded labels =", list(decoded_list))

出力

Labels = ['green', 'red', 'black']
Encoded values = [1, 2, 0]
Encoded values = [3, 0, 4, 1]
Decoded labels = ['white', 'black', 'yellow', 'green']