機械学習におけるデータの前処理の基礎について学習

今回の記事では、機械学習分野に必須のデータの前処理について、Udemyの講座にて学習した内容を要約する。具体的には、以下の内容について纏める。

 - 欠損値の扱い
 - データのエンコーディング
 - フィーチャースケーリング
 - 訓練用データセットとテスト用データセットへのデータの分割

なお、本記事に掲載しているコードは、すべて下記URLに掲載しているUdemy講座から抜粋している
 - 事前にUdemy講座の講師から許可を頂いています。

Udemy講座URL
[【世界で74万人が受講】基礎から理解し、Pythonで実装！機械学習26のアルゴリズムを理論と実践を通じてマスターしよう](https://www.udemy.com/course/ml-with-python/)



#目次

[1.ライブラリのインポート](#1-ライブラリのインポート)
[2.データセットのインポート](#2-データセットのインポート)
[3.欠損値の処理](#3-欠損値の処理)
[4.カテゴリ変数の処理](#4-カテゴリ変数の処理)
[5.訓練用データセットとテストデータセットへの分割](#5-訓練用データセットとテストデータセットへの分割)
[6.feature scaling](#6-feature scaling)

#1-ライブラリのインポート

 - numpy : 数値計算
 - matplotlib : グラフなど、データの可視化
 - pandas : 表など、データの整理


```Python
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
```



#2-データセットのインポート

 - データセットのインポート
    - GoogleColab : 「ファイル」タブ→「セッションストレージにアップロード」
 - データセットを独立変数(X)と従属変数(y)に分ける
    - 機械学習の目的は、学習モデルのアルゴリズムをデータセットを用いて導き出すこと
    - 独立変数(X)が学習モデルの入力、従属変数(y)が学習モデルの出力といったイメージ
 - ilocメソッドを用いて行列を表現
    - 下記コードでは、従属変数(y)が行列の最終列、独立変数(X)が行列の最終列以外すべてを指している

```Python
dataset = pd.read_csv('Data.csv')
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, -1].values
```

#3-欠損値の処理

 - np.nan(欠損値)を、平均値や最頻値、中央値などで埋める
 - fillna()メソッドやsklearnのSimpleImputerで欠損値を埋める
    - 下記コードではsklearnのSimpleImputerをインポートして平均値を埋めている
 - fitによって値を演算、transformによってデータを正規化する

```Python
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(missing_values=np.nan, strategy='mean')
imputer.fit(X[:, 1:3])
X[:, 1:3] = imputer.transform(X[:, 1:3])
```

#4-カテゴリ変数の処理

 - エンコーディング：機械学習で使用できるようにデータを数値に変換
    - One-hotエンコーディングやラベルエンコーディングがある
 - 独立変数のエンコーディング
    - 独立変数ではOne-hotエンコーディングを行う
        - One-hotエンコーディングは数字に序列関係が生まれないため
    - エンコーディングを行うクラスだけでなく、列の変換を行うクラスをインポートする必要がある
        - OneHotEncoder : エンコーディングを行うクラス
        - ColumnTransformer : 列の変換を行うクラス
        - remainder='passthrough' : 変換した変数以外の変数はそのままにする
    - fit_transform : 値の計算とデータの正規化を両方行う
    - 下記コード以外にも、pd.get_dummies()を用いた方法がある

```Python
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), [0])], remainder='passthrough')
X = np.array(ct.fit_transform(X))
```

 - 従属変数(y)のエンコーディング
    - One-hotではなく、ラベルエンコーディングを実施するべき
        - One-hotではラベルの数だけ列が増えてしまうため

```Python
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y = le.fit_transform(y)
```

#5-訓練用データセットとテストデータセットへの分割

 - 目的
    - 訓練で学習モデルを作成
    - テストでモデルの汎化性能を確認
 - 実装
    - sklearnのtrain_test_splitをインポートする
    - test_size : テスト用データサイズの割合
    - random_state : 設定しておかないと毎回結果が変わってしまう

```Python
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 1)
```

#6-feature scaling

 - 目的
    - データの単位を適切な範囲にすることによって分類しやすくする
 - 標準化と正規化の違い
    - 標準化：平均0、標準1
    - 正規化：範囲0～1
        - 今回の機械学習の分野では上記の通りの違いがあるが、分野によって正規化の意味は異なるので注意
 - データが正規分布に従っている場合は標準化の方が良いといわれている
    - その他は標準化/正規化どちらを使用すればよいか厳密に決められていない
 - 標準化を行う場合のコード例を下記の通り示す
    - 標準化のライブラリとしてsklearnのStandardScalerをインポートする

```Python
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train[:, 3:] = sc.fit_transform(X_train[:, 3:])
X_test[:, 3:] = sc.transform(X_test[:, 3:])
```

#参考文献

[【世界で74万人が受講】基礎から理解し、Pythonで実装！機械学習26のアルゴリズムを理論と実践を通じてマスターしよう](https://www.udemy.com/course/ml-with-python/)