はじめに
機械学習モデルの性能を最大限引き出すためには、データの前処理が非常に重要です。
テーブルデータ(構造化データ)を用いる場合、データの質や構造を整えることで、モデルの学習を実施し予測をすることができます。本記事では、テーブルデータにおける主要な前処理方法とそのPython実装例を紹介します。
前処理は機械学習を実施する際には不可欠な技術となります。これらについて理解が難しい場合は、経験豊富な方とマンツーマンで学習していくのもオススメです。
データの確認
前処理を始める前に、まずデータの状況を正確に把握することが重要です。以下のことを確認し、前処理を行っていきましょう。
データの確認①:カラムのタイプ確認
データの各カラムのデータ型を確認することで、カテゴリカルデータや数値データを把握できます。
機械学習の場合は、データを数値に変更する必要があります。そのため、それぞれのカラムがカテゴリデータか数値データになっているか確認する必要があります。
# カラムのデータ型を確認
print(df.dtypes)
データの確認②:欠損値の確認
欠損値が含まれるカラムを確認し、その数を把握します。モデルによっては欠損値が埋まっていないと学習できないので、しっかり確認しましょう。
# 欠損値の数を確認
print(df.isnull().sum())
データの確認③:基本統計量の確認
数値データに対して基本統計量(平均値、中央値、最大値、最小値など)を確認し、データの分布や外れ値の存在を推測することができます。
外れ値はモデルに大きな影響を与える可能性があるので、しっかり確認しましょう。
# 基本統計量を確認
print(df.describe())
下記の書籍にデータの見方について全体感がまとめられているので、読んでみるのもいいと思います。
機械学習の前処理:データのクリーニング
次に機械学習をする際には、データを数値として読み込ませる必要があります。ここではデータとして使えるようにデータをクリーニングする方法を学んでいきます。
今回は以下のようにサンプルデータを使って、実際にコードを作ってみます。
import pandas as pd
import numpy as np
# サンプルデータの作成
data = {
'Age': [25, 30, np.nan, 35, 40],
'Income': [50000, 60000, 55000, np.nan, 70000],
'Gender': ['Male', 'Female', np.nan, 'Female', 'Male']
}
df = pd.DataFrame(data)
データのクリーニング①:欠損値の処理
データセットには欠損値が含まれることがあります。
これを放置すると、モデル自体学習できなかったり、モデルの学習に悪影響を与える可能性があります。欠損値の処理には以下の方法があります。
- 削除:欠損値を含む行または列を削除。
- 補完:平均値や中央値、最頻値で埋める、または推定モデルで補完。
- 特殊値として扱う:欠損を一つのカテゴリや値として扱う。
# 欠損値の補完 (平均値で埋める)
df['Age'].fillna(df['Age'].mean(), inplace=True)
df['Income'].fillna(df['Income'].median(), inplace=True)
# 欠損値を特殊値として扱う
df['Gender'].fillna('Unknown', inplace=True)
print(df)
ただ、決定木系のモデル(Light GBM)などは欠損値の処理をする必要がないので、そのようなモデルを使うのも良いでしょう。
データのクリーニング②:外れ値の処理
外れ値は、モデルに不要なノイズを与える可能性があります。外れ値を検出する方法として、以下があります。
これらを確認し、除去したりデータを置き換える等実施しましょう。
- IQR(四分位範囲)法:第1四分位数(Q1)と第3四分位数(Q3)を基に範囲外を検出。
- 3シグマ法:平均から標準偏差の3倍を超える値を外れ値と考える。
# IQR法による外れ値の検出
Q1 = df['Income'].quantile(0.25)
Q3 = df['Income'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# 範囲外の値を検出
outliers = df[(df['Income'] < lower_bound) | (df['Income'] > upper_bound)]
print(outliers)
機械学習の前処理:データの変換
データの変換①:スケーリング
異なるスケールの特徴量が存在すると、アルゴリズムによっては悪影響を与えます。以下の方法でスケーリングを行います。
- 標準化:平均0、標準偏差1に変換。
- 正規化:特徴量を0~1の範囲にスケーリング。
from sklearn.preprocessing import StandardScaler, MinMaxScaler
# 標準化
scaler = StandardScaler()
df['Income_scaled'] = scaler.fit_transform(df[['Income']])
# 正規化
normalizer = MinMaxScaler()
df['Income_normalized'] = normalizer.fit_transform(df[['Income']])
print(df)
データの変換②:カテゴリデータのエンコード
カテゴリデータは機械学習に読み込む場合は数値に変換する必要があります。一般的な手法は以下の通りです。
- Label Encoding:カテゴリを整数に変換。
- One-Hot Encoding:ダミー変数として変換。
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
# Label Encoding
label_encoder = LabelEncoder()
df['Gender_encoded'] = label_encoder.fit_transform(df['Gender'])
# One-Hot Encoding
df_one_hot = pd.get_dummies(df, columns=['Gender'])
print(df_one_hot)
まとめ
機械学習における前処理は、モデルの性能を左右する重要なステップです。
本記事で紹介した方法を活用することで、データの質を高め、効果的な学習プロセスを実現できます。前処理を適切に行い、高精度なモデル構築を目指しましょう。
機械学習の前処理を学ぶのにオススメの方法
書籍:Kaggleで勝つデータ分析の技術
下記の書籍に多くの前処理、特徴量エンジニアリングの事例がまとめられているので、読んでみるのもいいと思います。
スクール:現役データサイエンティストに教えてもらう
前処理は機械学習の際に必須です。難しいと感じる場合は、相談しながら進められるスクールもオススメです。





コメント