こんにちは、小澤です。
今回も引き続き、「scikit-learn」における前処理について解説していきます。今回は、機械学習モデルの性能に大きな影響を与える2つの前処理として、「カテゴリ変数のエンコーディング」と「特徴量の正規化」を取り上げ、それぞれの実装方法と活用方法について説明します。
なお、教科書『Pythonによる新しいデータ分析の教科書(第2版)』では、4.4.1章「前処理」(217〜225ページ)の箇所です。
カテゴリ変数のエンコーディング
機械学習アルゴリズムは数値データを前提として動作するため、文字列などのカテゴリ変数は数値データに変換する必要があります。カテゴリ変数とは、性別、血液型、職業など、限られた種類の値をとる変数のことを指します。このようなカテゴリ変数を機械学習で扱えるようにするため、数値データへの変換プロセスが必要となります。この変換プロセスを「カテゴリ変数のエンコーディング」と呼び、scikit-learnでは以下の手法を利用できます。
1. ラベルエンコーディング
LabelEncoderを使用すると、カテゴリ変数を整数値に変換できます。以下に例を示します。
from sklearn.preprocessing import LabelEncoder # サンプルデータ categories = [‘dog’, ‘cat’, ‘bird’, ‘dog’, ‘bird’] # LabelEncoderを適用 encoder = LabelEncoder() encoded_labels = encoder.fit_transform(categories) print(f”変換後: {encoded_labels}”) print(f”クラス: {encoder.classes_}”) |
- 長所:実装がシンプルで直感的。
- 短所:変換後の数値は連続的に割り当てられるため、数値間に意味のない大小関係が発生する可能性がある。
2. One-Hot Encoding
OneHotEncoderを使用すると、カテゴリ変数をバイナリ形式の列に変換できます。これにより、数値間の意味のない大小関係を避けることができます。
from sklearn.preprocessing import OneHotEncoder import numpy as np # サンプルデータ categories = np.array([‘dog’, ‘cat’, ‘bird’, ‘dog’, ‘bird’]).reshape(-1, 1) # OneHotEncoderを適用 encoder = OneHotEncoder(sparse=False) encoded_onehot = encoder.fit_transform(categories) print(f”変換後:\\n{encoded_onehot}”) |
- 長所:カテゴリ間の大小関係を回避できる。
- 短所:カラム数が増えるため、高次元データではメモリ効率が低下する。
特徴量の正規化
正規化は、データのスケールを一定に揃えるための処理です。モデルが特定の特徴量に過度に依存するのを防ぎ、効率的な学習を促進します。以下の2つが一般的な手法です。
1. 分散正規化(標準化 / Standardization)
分散正規化は、データを「平均0、分散1」のスケールに変換する方法です。特徴量の値が平均を中心に対称分布する場合に適しており、線形回帰、SVM、ロジスティック回帰などの多くの機械学習アルゴリズムで有効です。scikit-learnではStandardScalerを使用すると、この変換を実装できます。
from sklearn.preprocessing import StandardScaler # サンプルデータ data = [[10, 200], [20, 300], [30, 400]] # StandardScalerを適用 scaler = StandardScaler() standardized_data = scaler.fit_transform(data) print(f”標準化後:\\n{standardized_data}”) |
- 長所:外れ値にある程度の耐性がある。正規分布に近いデータで特に有効。
- 短所:データの範囲が揃わないため、非距離ベースのアルゴリズムには適さない場合がある。
2. 最大最小正規化(Min-Max Normalization)
最大最小正規化は、データを指定した範囲(通常は[0, 1])にスケーリングする方法です。値の範囲が揃うことで、距離計算や勾配降下法を使用するアルゴリズム(例: k-NN、ニューラルネットワーク)に有効です。
from sklearn.preprocessing import MinMaxScaler # サンプルデータ data = [[10, 200], [20, 300], [30, 400]] # 最大最小正規化 scaler = MinMaxScaler() normalized_data = scaler.fit_transform(data) print(“最大最小正規化後のデータ:”) print(normalized_data) |
- 長所:データが一定の範囲内に収まるため、数値スケールの差異を解消できる。非常に簡単で直感的。
- 短所:外れ値に弱く、極端な値が全体のスケールを歪める可能性がある。
3. 分散正規化と最大最小正規化の比較
分散正規化 | 最大最小正規化 | |
変換後の分布 | 平均0、分散1にスケーリング | 範囲[0, 1]にスケーリング |
外れ値への影響 | 比較的影響を受けにくい | 外れ値に弱い |
適用アルゴリズム | SVM、線形回帰、ロジスティック回帰 | k-NN、ニューラルネットワーク |
- 分散正規化を選ぶ場合
- 特徴量の値が正規分布に近い場合。
- スケール依存のモデル(例: SVMや線形モデル)を使用する場合。
- 最大最小正規化を選ぶ場合
- データの分布に関係なく、範囲を統一したい場合。
- 距離ベースのアルゴリズムやニューラルネットワークを使用する場合。
まとめ
これらの前処理を通じて、データをモデルが効率的に扱える形に整え、学習効率とモデル性能を大幅に向上させることができます。カテゴリ変数を適切にエンコーディングすることでデータの本質的な情報を保持し、正規化によって特徴量間のスケールを統一することで、アルゴリズムの動作を最適化できます。このような前処理は、モデルの精度と信頼性を高めるだけでなく、データ分析全体の質を向上させる重要なプロセスです。scikit-learnが提供するこれらの機能を活用すれば、より信頼性が高く、汎用性の高い機械学習モデルを構築できるでしょう。
次回からは、実際の分類手法について解説します。次回は、サポートベクタマシンを取り上げる予定です。引き続きお楽しみに。