前回のおさらいと今回のテーマ
こんにちは!前回は、Pythonの機械学習ライブラリScikit-learnを使って、基本的な機械学習モデルの構築と評価方法を解説しました。データの分割、モデルの訓練、そして評価のステップを一貫して行うことで、機械学習の基礎的な流れを理解できたと思います。
今回は、機械学習のモデル構築に欠かせないデータ前処理について学びます。データ前処理は、モデルの精度を高めるために非常に重要なステップで、データを正規化したり、欠損値を処理したりして、モデルに適した形に整えます。正しい前処理を行うことで、モデルの性能が向上し、予測精度が大幅に改善されます。それでは、基本的なデータ前処理の方法を見ていきましょう!
データ前処理とは?
データ前処理とは、機械学習モデルが適切に学習できるように、データを整形・変換する作業のことを指します。主に以下のステップが含まれます。
- 欠損値の処理: 欠けているデータを補完または削除して、モデルが扱いやすい形にする。
- 特徴量のスケーリング: 特徴量のスケール(尺度)を統一して、モデルの性能を向上させる。
- カテゴリ変数のエンコーディング: カテゴリデータを数値データに変換する。
- データの分割: 学習データとテストデータに分ける。
今回は、特に重要な欠損値の処理と特徴量のスケーリングについて詳しく解説します。
1. 欠損値の処理
データセットには、しばしば欠損値が含まれており、これを適切に処理しないとモデルの精度が低下します。Scikit-learnやPandasを使って欠損値を処理する方法を紹介します。
データセットの準備
まずは、Pandasを使ってサンプルデータを作成します。
import pandas as pd
import numpy as np
# サンプルデータの作成
data = {
'Age': [25, np.nan, 35, 40, np.nan],
'Salary': [50000, 60000, np.nan, 80000, 90000],
'Gender': ['Male', 'Female', 'Female', 'Male', np.nan]
}
df = pd.DataFrame(data)
print(df)
上記のデータには、Age
、Salary
、Gender
の列に欠損値が含まれています。
欠損値の確認
まず、データフレームにどれだけ欠損値が含まれているかを確認します。
# 欠損値の確認
print(df.isnull().sum())
isnull()
メソッドを使うと、各列にどれだけの欠損値があるかを確認できます。
欠損値の補完(Imputation)
欠損値を補完する方法にはいくつかありますが、以下の方法が一般的です。
- 平均値・中央値で補完: 数値データの場合、欠損値をその列の平均値や中央値で補完します。
- 最頻値で補完: カテゴリデータの場合、欠損値を最も頻繁に出現する値で補完します。
- 特定の値で補完: 欠損値を0や特定の値で埋めることもあります。
# 平均値で補完(Age列)
df['Age'].fillna(df['Age'].mean(), inplace=True)
# 最頻値で補完(Gender列)
df['Gender'].fillna(df['Gender'].mode()[0], inplace=True)
# 結果の表示
print(df)
欠損値の削除
場合によっては、欠損値を含む行や列を削除することが有効です。
# 欠損値を含む行を削除
df_dropped = df.dropna()
# 欠損値を含む列を削除
df_dropped_cols = df.dropna(axis=1)
dropna()
メソッドを使うと、欠損値を含む行や列を削除できます。
2. 特徴量のスケーリング
機械学習モデル、特に距離に基づくアルゴリズム(例:k-最近傍法やSVM)では、特徴量のスケールが異なると性能が悪化します。そのため、特徴量のスケーリングが必要です。
スケーリングの方法
- 標準化(Standardization): データを平均0、標準偏差1に変換します。
StandardScaler
を使います。 - 正規化(Normalization): データを0から1の範囲にスケーリングします。
MinMaxScaler
を使います。
Scikit-learnでのスケーリング
以下のコードでは、StandardScaler
とMinMaxScaler
を使ったスケーリング方法を紹介します。
from sklearn.preprocessing import StandardScaler, MinMaxScaler
# 特徴量の選択(数値データのみ)
X = df[['Age', 'Salary']]
# 標準化
scaler = StandardScaler()
X_standardized = scaler.fit_transform(X)
print("Standardized Data:\n", X_standardized)
# 正規化
scaler = MinMaxScaler()
X_normalized = scaler.fit_transform(X)
print("Normalized Data:\n", X_normalized)
- StandardScaler(): データを標準化します。平均0、標準偏差1に変換するため、数値データが中心に集まり、スケールが統一されます。
- MinMaxScaler(): データを0から1の範囲にスケーリングします。特徴量が全て同じ範囲に収まるため、モデルの精度が向上します。
カテゴリ変数のエンコーディング
カテゴリ変数(例:性別や地域)を数値に変換する必要があります。LabelEncoder
やOneHotEncoder
を使って変換します。
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
# ラベルエンコーディング
le = LabelEncoder()
df['Gender_encoded'] = le.fit_transform(df['Gender'])
print(df)
# ワンホットエンコーディング
df_encoded = pd.get_dummies(df, columns=['Gender'])
print(df_encoded)
- LabelEncoder: カテゴリを整数にエンコーディングします(例:Male → 1, Female → 0)。
- get_dummies(): ワンホットエンコーディングで、各カテゴリに対して新しい列を作成し、1と0で表現します。
まとめ
今回は、データ前処理の基本として、欠損値処理と特徴量のスケーリングについて解説しました。適切な前処理を行うことで、モデルがデータをより正確に学習し、予測精度が向上します。データ前処理は機械学習において非常に重要なステップであり、しっかりと理解しておくことで、より高度なモデルの構築が可能になります。
次回予告
次回は、単純な回帰モデルの実装について解説します。線形回帰モデルを実装し、データに基づいて予測を行う方法を学びましょう!
注釈
- 標準化(Standardization): データを平均0、標準偏差1に変換することで、異なるスケールの特徴量を統一する方法。
- 正規化(Normalization): データを0から1の範囲にスケーリングすることで、全ての特徴量が同じ範囲に収まるようにする方法。
コメント