Python機械学習のデータ前処理を徹底解説!正規化と標準化で精度を上げる
生徒
「Pythonで機械学習に挑戦しているのですが、データの数字がバラバラで、うまく学習が進まないんです。」
先生
「それは『データの前処理』が必要なサインですね。特に、数字の大きさを整える『正規化』や『標準化』という作業が重要になります。」
生徒
「正規化?標準化?なんだか難しそうな言葉ですが、パソコン初心者でもわかりますか?」
先生
「大丈夫ですよ!料理の下準備と同じで、コツさえ掴めば誰でもできます。基本的な考え方から、実際のPythonコードまで一緒に学んでいきましょう!」
1. 機械学習の「データ前処理」とは?
Pythonを使ってAIや機械学習のプログラムを作る際、一番最初に行う大切な作業が「データの前処理」です。 データの前処理とは、コンピュータが計算しやすいように、集めたバラバラなデータを綺麗に整えることを指します。
例えば、あるデータには「身長(cm)」が入っていて、別のデータには「体重(kg)」が入っているとします。 身長は150から180くらいの数字ですが、体重は40から80くらいの数字です。 このように、データの「単位」や「数値の範囲」が大きく異なると、コンピュータは「どの数字が本当に重要なのか」を正しく判断できなくなってしまいます。
そこで、すべてのデータを一定のルールで揃える必要が出てきます。 この「数字の大きさを揃える作業」の代表選手が、今回紹介する「正規化」と「標準化」なのです。 これをしっかり行うだけで、人工知能の賢さ(予測精度)が驚くほど向上することがあります。
2. 正規化(Normalization)の仕組み
「正規化」とは、データの値を「0から1の間」にギュッと詰め込む方法です。 一番小さい値を「0」、一番大きい値を「1」として、その間の数字をバランスよく配置します。
身近な例で考えてみましょう。テストの点数が100点満点の人と、50点満点の人を比べるとき、そのままでは比較しにくいですよね。 これを両方とも「達成率」として、最低を0%、最高を100%(1.0)として計算し直すのが正規化のイメージです。
画像処理の分野では、色の濃さを表す数字(0~255)を正規化して計算することが非常によくあります。 特定の範囲に収めることで、計算スピードが速くなるというメリットもあります。
Pythonでは、scikit-learnという有名なライブラリ(便利な道具箱のようなもの)の中にあるMinMaxScalerという道具を使って簡単に実行できます。
from sklearn.preprocessing import MinMaxScaler
import numpy as np
# サンプルのデータ(例えば商品の価格など)
data = np.array([[1000], [5000], [10000], [2500]])
# 正規化の準備(0から1の範囲に設定)
scaler = MinMaxScaler()
# データを変換する
normalized_data = scaler.fit_transform(data)
print("正規化後のデータ:")
print(normalized_data)
正規化後のデータ:
[[0. ]
[0.44444444]
[1. ]
[0.16666667]]
3. 標準化(Standardization)の仕組み
次に「標準化」について解説します。 標準化とは、データの平均を「0」、標準偏差(データのばらつき具合)を「1」にする変換方法です。 正規化が「0から1」という決まった枠に押し込めるのに対し、標準化は「平均からどれくらい離れているか」に注目します。
これは、学校のテストで使われる「偏差値」をイメージすると非常に分かりやすいです。 平均点を取れば偏差値は50になりますよね。標準化を行うと、平均的なデータは「0」になり、そこからプラスかマイナスかでデータの位置が決まります。
標準化の大きな特徴は、「外れ値」に強いことです。 例えば、1つだけ極端に大きな数字(1億円など)が混ざっていても、標準化ならデータ全体のバランスを崩さずに処理することができます。 多くの機械学習アルゴリズム(計算の仕組み)では、この標準化が推奨されています。
from sklearn.preprocessing import StandardScaler
import numpy as np
# サンプルのデータ(例えばテストの点数)
test_scores = np.array([[40], [90], [65], [70], [55]])
# 標準化の準備
scaler = StandardScaler()
# データを変換する
standardized_data = scaler.fit_transform(test_scores)
print("標準化後のデータ(平均が0になる):")
print(standardized_data)
標準化後のデータ(平均が0になる):
[[-1.50755672]
[ 1.63318645]
[ 0.06281486]
[ 0.37688918]
[-0.56533377]]
4. 正規化と標準化の使い分け方
「結局、どちらを使えばいいの?」と迷ってしまいますよね。 初心者の方が判断する際の簡単な目安を紹介します。
まず、データの最小値と最大値がはっきりと決まっていて、外れ値がない場合は「正規化」が適しています。 例えば、画像のピクセル値や、アンケートの5段階評価などです。
一方で、データに極端な値が含まれている可能性がある場合や、多くの統計的な機械学習手法(サポートベクターマシンやロジスティック回帰など)を使う場合は「標準化」を選ぶのが一般的です。
迷ったときは、まず「標準化」を試してみて、モデルの動きを確認するのがプロの現場でもよく取られる手法です。 どちらも「データのスケール(規模感)を合わせる」という目的は同じですので、恐れずに使ってみましょう。
5. パンダス(Pandas)を使った実践的な前処理
実際のデータ分析では、NumPyだけでなくPandasというライブラリを使って表形式のデータを扱うことが多いです。
複数の項目(列)をまとめて一気に変換する方法を見てみましょう。
例えば、「年齢」と「年収」という2つの項目がある名簿データを考えてみます。 年齢は20~60、年収は300万~1000万と、数字の桁が全く違いますよね。 これをそのまま学習させると、AIは「年収の数字が大きいから、年収の方が重要なんだ!」と勘違いしてしまいます。 それを防ぐために、一括で標準化を行います。
import pandas as pd
from sklearn.preprocessing import StandardScaler
# 表形式のデータを作成
df = pd.DataFrame({
'年齢': [25, 45, 35, 50, 22],
'年収': [400, 800, 550, 900, 350]
})
# 標準化の実行
scaler = StandardScaler()
df_scaled = pd.DataFrame(scaler.fit_transform(df), columns=df.columns)
print("変換前のデータ(最初の2行):")
print(df.head(2))
print("\n変換後のデータ(全ての単位が揃う):")
print(df_scaled.head(2))
変換前のデータ(最初の2行):
年齢 年収
0 25 400
1 45 800
変換後のデータ(全ての単位が揃う):
年齢 年収
0 -0.893110 -0.893110
1 0.849318 0.849318
6. 変換時に注意すべきポイント
前処理を行う際に、初心者が陥りやすい罠がいくつかあります。 最も重要なのは「訓練データ」と「テストデータ」の扱いです。
機械学習では、手元のデータを「練習用の問題(訓練データ)」と「本番用の確認問題(テストデータ)」に分けます。 このとき、データのスケーリング(正規化・標準化)の基準は、必ず「練習用の問題」だけで作らなければなりません。
本番の問題の答えを知った状態で練習してはいけないのと同じで、テストデータの平均や最大値を使って変換してしまうと、未来のデータをカンニングしたことになってしまいます。 これを「データリーク(情報の漏洩)」と呼び、予測精度が正しく測れなくなる原因になります。
Pythonのプログラムでは、訓練データでfit(基準を作る)を行い、その基準をテストデータに対してtransform(変換する)という手順を徹底しましょう。
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import numpy as np
# データの作成
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]])
y = np.array([0, 0, 1, 1, 1])
# データを訓練用とテスト用に分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# 標準化のインスタンス作成
scaler = StandardScaler()
# 訓練データだけで「平均」と「分散」を計算(学習)
scaler.fit(X_train)
# 訓練データとテストデータの両方を「訓練データの基準」で変換
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
print("訓練データの変換結果:")
print(X_train_scaled[0])
7. パソコン操作が苦手でも大丈夫!学習のコツ
プログラミングと聞くと、難しい数式をたくさん覚えないといけないイメージがあるかもしれません。 しかし、現代のPythonによる機械学習は、今回紹介したような「便利な道具(ライブラリ)」をパズルのように組み合わせるのが主流です。
大切なのは、数式の裏側を完璧に理解することよりも、「なぜこの作業が必要なのか?」という目的を理解することです。 「数字の大きさを揃えないと、AIが勘違いしてしまうから正規化するんだ」という理屈さえ分かっていれば、コードはコピー&ペーストから始めても全く問題ありません。
まずは、自分のパソコンにAnacondaやGoogle Colaboratoryといった環境を用意して、実際に数字を動かしてみることから始めましょう。
画面上の数字が変わる様子を見ることで、正規化や標準化の感覚が自然と身についていくはずです。
今回学んだ前処理は、データサイエンスの世界への第一歩です。 地味な作業に見えますが、この丁寧な下準備が、世界を変えるような素晴らしいAIを作る土台となります。 焦らず、一つ一つのステップを楽しみながら進んでいきましょう!
まとめ
今回の記事では、Pythonを用いた機械学習の成功に欠かせない「データの前処理」、特に「正規化」と「標準化」の重要性について詳しく解説してきました。 データサイエンスのプロジェクトにおいて、モデルのアルゴリズム選びと同じくらい、あるいはそれ以上に重要なのがこの前処理工程です。 生のデータをそのままAIに学習させてしまうと、数値の単位やスケールの違いがノイズとなり、本来の予測性能を発揮できなくなることが多々あります。
正規化と標準化のポイントをおさらい
改めて、今回学んだ二つの手法を整理しましょう。 正規化(Normalization)は、最小値を0、最大値を1とするようにスケーリングする手法です。 主に画像処理や、データの範囲が明確に決まっている場合に有効です。 一方、標準化(Standardization)は平均を0、標準偏差を1にする手法で、統計的な手法を用いる際や、外れ値が含まれる可能性がある実データに対して非常に強力な武器となります。
これらの処理を適切に行うことで、勾配降下法などの最適化アルゴリズムの収束が速くなり、計算コストの削減にも繋がります。 また、k近傍法やサポートベクターマシンのように、距離を計算の基礎とするアルゴリズムでは、スケーリングが結果に直結するため、必須の作業といえます。
実務で使える一歩進んだTips
実際の開発現場では、欠損値の処理やカテゴリ変数のエンコーディングと組み合わせて、これらの一連の流れを「パイプライン」として構築することが推奨されます。
また、scikit-learnのRobustScalerのように、より外れ値の影響を排除したスケーリング手法も存在します。
基本をマスターしたら、データの特性(分布の歪みや外れ値の多さ)に合わせて、最適な手法を選択できる柔軟性を身につけていきましょう。
応用サンプルコード:複数の特徴量を一括処理
最後に、これまで学んだ内容を応用して、複数のカラムを持つデータフレームに対して、特定の列は標準化し、別の列は正規化するという実践的なコード例を紹介します。 このように柔軟に使い分けることで、より精度の高い機械学習モデルの構築が可能になります。
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler, MinMaxScaler
# 1. 実践的なサンプルデータの作成
# 「走行距離(数万km)」と「年式(数年)」、「評価点(1-5点)」を持つ中古車データ
data = {
'走行距離': [12000, 45000, 5000, 80000, 22000],
'年式': [2020, 2015, 2022, 2010, 2018],
'評価点': [4.5, 3.0, 5.0, 2.0, 4.0]
}
df = pd.DataFrame(data)
# 2. 手法の使い分け
# 走行距離と年式は「標準化」
std_scaler = StandardScaler()
df[['走行距離', '年式']] = std_scaler.fit_transform(df[['走行距離', '年式']])
# 評価点は範囲が決まっているので「正規化」
mm_scaler = MinMaxScaler()
df[['評価点']] = mm_scaler.fit_transform(df[['評価点']])
print("--- 高度な前処理を適用した後のデータ ---")
print(df)
データ前処理は地味な作業に思えるかもしれませんが、これを怠るとどんなに高性能なAIモデルを使っても「ゴミを入れてもゴミしか出てこない(GIGO: Garbage In, Garbage Out)」という状態に陥ってしまいます。 今回学んだ手法を自分のプロジェクトに取り入れ、ぜひ精度の変化を実感してみてください。 Pythonと機械学習の世界は奥が深いですが、一歩ずつ進んでいけば必ず習得できる技術です。
生徒
「先生、ありがとうございました!正規化と標準化の違いがハッキリわかりました。特に偏差値の例えがすごく分かりやすかったです。データの単位が違っても、これで正しくAIに教えることができますね。」
先生
「その通りです!理解が早いですね。実際にコードを書いてみて、数値が綺麗に揃う様子を見ると安心感があるでしょう?機械にとってもそれは同じで、整理されたデータこそが学習の質を高めるんです。」
生徒
「はい!ただ、最後に教えてもらった『訓練データだけでfitさせる』という話、うっかりテストデータも含めてやってしまいそうです。そこだけは本当に気をつけないといけませんね。」
先生
「素晴らしい指摘です。データリークはプロでもやってしまうことがあるミスですから、今のうちに習慣づけておくのが一番です。前処理を制する者は機械学習を制すると言っても過言ではありません。次は、この整えたデータを使って、実際に予測モデルを動かしてみましょうか!」
生徒
「ワクワクしてきました!次のステップもよろしくお願いします!」