学習コースLearn
開発データの前処理とデータセット構築
生のデータを洗浄・変換し、分析や機械学習に使えるデータセットへ仕立てる工程を、概要から理論、そして実際に動かせるコードまで、順を追って学ぶモジュールです。各ステップは「概要 → 仕組み(座学)→ コードで動かす」の3層で進みます。ページ内には手を動かせるデモを3つ用意しました。
この教材は日本語のみで提供していますThis learning material is available in Japanese only.
はじめにIntroduction
このモジュールの全体像
データの前処理(data preprocessing)とは、集めたばかりの生のデータを洗浄・変換し、分析や機械学習でそのまま使えるデータセットへ仕立てる工程の総称です。現場では、モデルづくりにかける時間の大半が、実はこの前処理に費やされると言われます。地味に見えて、成果の質を最も大きく左右する工程です。
その理由を端的に表すのが「garbage in, garbage out(ゴミを入れればゴミが出る)」という言葉です。どれほど高度なモデルでも、入力するデータが汚れていれば、出てくる結果も信頼できません。多くの分析に共通するのが、次のような処理の流れ(パイプライン)です。生のデータを洗い、数値の特徴量へ変換し、学習用と評価用に分けて、はじめてデータセットが完成します。
前処理の基本パイプライン
このモジュールは、上のパイプラインを左から順にたどります。各ステップは次の3層で構成します。
- 概要:その工程が何のためにあるのか、あらましをつかむ。
- 仕組み(座学):背後にある考え方・定義・式を、ていねいに理解する。
- コードで動かす:pandas や scikit-learn の定番 API や、ページ内デモで実際に動かして確かめる。
手を動かす題材には、実在の公開データセット(Titanic、UCI Adult、Iris など)や、ページ内の小さなサンプル表だけを使います。特別な環境がなくても、読みながら試せる構成です。
データセット構築とは
Building a dataset概要Overview
分析や機械学習を始めるとき、いきなりモデルに取りかかることはできません。まず、手元の生データを「整った表」に仕立てる必要があります。この工程が前処理であり、その成果物がデータセットです。前処理をおろそかにしたまま高度なモデルを使っても、良い結果は得られません。次のような場面で、前処理は成果を左右します。
- 欠損があるまま学習:値が抜けたセルをそのまま渡すと、多くのアルゴリズムはエラーになるか、偏った学習をします。
- 単位や尺度がばらばら:年齢(0〜100)と年収(数百万)を混ぜると、大きな値の特徴量ばかりが効いてしまいます。
- カテゴリが文字列のまま:「男/女」「東京/大阪」といった文字は、数値を前提とするモデルにそのまま入れられません。
- 評価用データの混入:前処理の手順を誤ると、答えを盗み見た「ずるい」評価になり、実力を過大評価します。
仕組みHow it works
表形式データの基本
もっとも基本的なデータの形が表形式(tabular)データです。多くの分析はこの形を前提にします。用語を押さえておきましょう。
- 行(row)=サンプル:1件のデータ点。1人の顧客、1つの計測、1件の記事など。
- 列(column)=特徴量:サンプルを説明する属性。年齢・年収・カテゴリなど。特徴量は数値型(連続・離散)とカテゴリ型(順序あり・なし)に大別されます。
- 目的変数(target / label):予測したい列。分類なら「クラス」、回帰なら「連続値」。教師なし学習ではこれがありません。
データ品質の観点
生データには、さまざまな汚れが混じっています。前処理は、これらを見つけて手当てする作業でもあります。代表的な観点は次の4つです。
- 欠損(missing):値が入っていないセル。測定漏れ、無回答、システムの都合などで生じます。
- 重複(duplicate):同じサンプルが複数回入っている。件数や統計をゆがめます。
- ノイズ・外れ値(noise / outlier):誤入力や異常な値。「年齢 999」のような明らかな誤りから、本物の極端値まで幅があります。
- 不整合(inconsistency):表記ゆれや単位違い。「東京 / 東京都」「kg / g」のように、同じ意味が違う形で現れます。
このモジュールの Step 2 以降は、これらの汚れを一つずつ手当てし、モデルに渡せる数値のデータセットへと仕上げる流れを、実際に体験していきます。
この Step のまとめ
前処理は生データを「整った表」に仕立てる工程で、その成果物がデータセットです。行=サンプル・列=特徴量・目的変数という基本を押さえ、欠損・重複・ノイズ・不整合という品質の観点で汚れを見つけて手当てします。「garbage in, garbage out」を避けることが、良い分析の第一歩です。
欠損値と外れ値
Missing values & outliers概要Overview
現実のデータには、ほぼ必ず欠損値(値が抜けたセル)と外れ値(極端に大きい/小さい値)が混じっています。ここをどう手当てするかで、後段の分析の質が大きく変わります。まずは、この2つを「見つけて、決めて、処理する」流れをつかみましょう。
仕組みHow it works
1. 欠損の種類
欠損は、なぜ抜けたかによって性質が変わります。統計学では次の3つに分けて考えます。処理方針を選ぶうえで大切な視点です。
- 完全にランダムな欠損(MCAR):欠損がどの変数とも無関係。単純な削除でも偏りが出にくい。
- 観測値に依存する欠損(MAR):他の観測できている列で欠損の起こりやすさが説明できる。補完が有効。
- 欠損自体に依存する欠損(MNAR):抜けた値そのものが原因(高所得者ほど収入を答えない等)。単純な補完では偏りが残る。
2. 除去するか、補完するか
欠損への対処は、大きく除去と補完(imputation)に分かれます。
- 行削除(listwise deletion):欠損を含む行を丸ごと落とす。手軽ですが、欠損が多いとサンプルが激減し、情報を捨てすぎることがあります。
- 列削除:欠損だらけの列を落とす。その特徴量をあきらめる判断です。
- 補完:欠けたセルを代表値で埋める。数値列は平均や中央値、カテゴリ列は最頻値が定番です。外れ値の影響を受けにくい中央値は、分布が偏ったデータで特に有効です。時系列では前後の値で埋める前方/後方補完もあります。
3. 外れ値の検出
外れ値は、誤入力(年齢 999 など)の場合もあれば、本物の極端値の場合もあります。まずは検出してから、除去・上限打ち切り(クリッピング)・そのまま残すのいずれかを選びます。定番の検出法が2つあります。
- IQR 法:四分位範囲
IQR = Q3 - Q1を使い、下限・上限からはみ出す点を外れ値とみなします。分布の形を仮定しない頑健な方法です。 - z スコア法:平均からの外れ具合を標準偏差で測り、
|z| > 3などを外れ値とします。おおむね正規分布に近いデータ向きです。
下限 = Q1 − 1.5 × IQR 上限 = Q3 + 1.5 × IQR Q1: 第1四分位数(下から25%) Q3: 第3四分位数(下から75%)
この下限・上限の外にある値を外れ値の候補とみなします。
欠損値ハンドリング
欠損セル(NaN と表示)を含む小さな表です。処理方式を選ぶと、結果の表を更新します。「行削除」は欠損を含む行を丸ごと落とし、「平均補完」「中央値補完」は各特徴量の平均・中央値で欠けたセルを埋めます。補完・変更されたセルは緑で示します。id は識別子なので補完の対象にしません。
コードで動かすRun the code
pandas なら、欠損の把握は isna() ひとつで済みます。まず、どの列にいくつ欠損があるかを数えてみましょう。
import pandas as pd
df = pd.DataFrame({
"age": [25, 32, None, 45, 29, 38],
"income": [350, None, 520, 610, 410, None],
"score": [68, 74, 81, None, 70, 88],
})
print(df.isna().sum()) # 列ごとの欠損数
age 1
income 2
score 1
dtype: int64scikit-learn の SimpleImputer を使うと、方式を指定して一括で補完できます。ここでは外れ値に強い中央値で埋めます(strategy を "mean" や "most_frequent" に変えれば平均・最頻値になります)。
from sklearn.impute import SimpleImputer
imp = SimpleImputer(strategy="median")
filled = pd.DataFrame(imp.fit_transform(df), columns=df.columns)
print(filled)
age income score
0 25.0 350.0 68.0
1 32.0 465.0 74.0
2 32.0 520.0 81.0
3 45.0 610.0 74.0
4 29.0 410.0 70.0
5 38.0 465.0 88.0欠けていた income の 2 セルは中央値 465、age は 32、score は 74 で埋まりました。中央値は、並べたときの真ん中の値です(income の観測値 350・410・520・610 の中央は (410+520)/2=465)。
外れ値の検出は、先ほどの IQR 法をそのまま書けます。明らかな誤入力(年齢 120)を見つけてみましょう。
import pandas as pd
ages = pd.Series([25, 32, 45, 29, 38, 120]) # 120 は誤入力の疑い
q1, q3 = ages.quantile(0.25), ages.quantile(0.75)
iqr = q3 - q1
low, high = q1 - 1.5 * iqr, q3 + 1.5 * iqr
print(f"下限={low:.1f} 上限={high:.1f}")
print(ages[(ages < low) | (ages > high)].tolist())
下限=9.5 上限=63.5
[120]この Step のまとめ
欠損は「除去するか、補完するか」を、欠損の起こり方を踏まえて決めます。数値は平均や中央値、カテゴリは最頻値が定番で、外れ値に強いのは中央値です。外れ値は IQR 法や z スコアで検出してから、除去・打ち切り・保持を選びます。次は、整えたデータを数値の特徴量へ変換します。
特徴量エンジニアリング
Feature engineering概要Overview
欠損や外れ値を手当てしても、そのままではモデルに渡せない列が残ります。文字列のカテゴリ、尺度のばらばらな数値、日時のような複合的な値です。これらを、モデルが扱える良い特徴量へと作り直す工程が特徴量エンジニアリング(feature engineering)です。代表的な作業は、カテゴリのエンコーディング・数値のスケーリング・ビン化・日時の分解です。
仕組みHow it works
1. カテゴリ変数のエンコーディング
「東京 / 大阪」「S / M / L」のような文字のカテゴリは、数値に変換します。カテゴリの性質で使い分けます。
- ラベルエンコーディング:各カテゴリに整数を割り当てる(S=0, M=1, L=2)。順序に意味がある(順序尺度)ときに向きます。名義尺度に使うと、本来ない大小関係をモデルに誤解させます。
- One-Hot エンコーディング:カテゴリごとに 0/1 の列を作る。「東京」→
[1,0,0]のように、順序のない名義尺度の定番です。カテゴリ数が多いと列が増える(次元の増加)点に注意します。
2. スケーリング(正規化・標準化)
数値特徴量は、列ごとに値の範囲が大きく異なります。年齢(0〜100)と年収(数百万)をそのまま混ぜると、大きな値の列ばかりが効いてしまいます。距離や勾配を使う手法(k近傍法・SVM・ニューラルネット等)では特に、スケールをそろえるのが大切です。代表的な方法が2つあります。
- Min-Max 正規化:最小を 0、最大を 1 に線形変換し、0〜1 の範囲に収めます。範囲が決まっているのが利点ですが、外れ値に引っぱられやすい弱点があります。
- 標準化(z スコア):平均 0・標準偏差 1 になるよう変換します。分布の形は保たれ、外れ値の影響も Min-Max より穏やかです。多くの場面での既定の選択です。
標準化: z = ( x − mean ) / std min / max: 列の最小・最大 mean: 平均 std: 標準偏差
Min-Max は 0〜1 に収め、標準化は平均 0・標準偏差 1 にそろえます。
3. ビン化(binning)
連続値を区間に区切って、カテゴリに変える処理です。年齢を「10代・20代・30代」に、点数を「低・中・高」にまとめるなど。非線形な関係を単純化でき、外れ値の影響もやわらぎます。等幅で区切る方法と、件数が等しくなるよう区切る方法(等頻度)があります。
4. 日時特徴の分解
日時(タイムスタンプ)は、そのままでは扱いにくい値です。年・月・日・曜日・時刻などに分解すると、意味のある特徴量になります。たとえば「曜日」や「休日かどうか」は、売上や交通量の予測で強く効くことがあります。周期性(月・曜日・時刻)を意識するのがコツです。
正規化 vs 標準化
数値をカンマか空白で区切って入力すると、Min-Max 正規化と標準化(z スコア)の両方を計算し、表とミニバーで比較します。Min-Max は 0〜1 に収まり、z スコアは平均 0(中央の縦線)を基準に左右へ広がります。標準偏差は scikit-learn の StandardScaler と同じ母標準偏差(ddof=0)で計算します。
コードで動かすRun the code
まずカテゴリの One-Hot 化です。scikit-learn の OneHotEncoder を使います。カテゴリはアルファベット順に並び、それぞれが 0/1 の列になります。
from sklearn.preprocessing import OneHotEncoder
import numpy as np
cities = np.array([["Tokyo"], ["Osaka"], ["Tokyo"], ["Kyoto"]])
enc = OneHotEncoder(sparse_output=False)
onehot = enc.fit_transform(cities)
print(enc.categories_[0])
print(onehot)
['Kyoto' 'Osaka' 'Tokyo']
[[0. 0. 1.]
[0. 1. 0.]
[0. 0. 1.]
[1. 0. 0.]]次に数値の標準化です。StandardScaler は各列を平均 0・標準偏差 1 にそろえます。学習した平均と標準偏差は mean_・scale_ で確認できます(標準偏差は母標準偏差)。0〜1 に収めたいときは MinMaxScaler を同じ使い方で呼べます。
from sklearn.preprocessing import StandardScaler
import numpy as np
X = np.array([[12.], [18.], [22.], [35.], [60.], [80.]])
scaler = StandardScaler()
z = scaler.fit_transform(X)
print("mean =", round(scaler.mean_[0], 3), "std =", round(scaler.scale_[0], 3))
np.set_printoptions(precision=3, suppress=True)
print(z.ravel())
mean = 37.833 std = 24.457
[-1.056 -0.811 -0.647 -0.116 0.906 1.724]上のデモに同じ 12, 18, 22, 35, 60, 80 を入れると、z スコアの列がこの出力と一致します。手計算・デモ・ライブラリの3つで、同じ式が同じ値を出すことを確かめられます。
この Step のまとめ
カテゴリは順序尺度ならラベル、名義尺度なら One-Hot でエンコードします。数値は Min-Max(0〜1)か標準化(平均0・標準偏差1)でスケールをそろえます。さらにビン化や日時分解で、意味のある特徴量を作れます。次は、目的変数(ラベル)側の課題を見ます。
ラベル付けとクラス不均衡
Labeling & class imbalance概要Overview
教師あり学習では、各サンプルに正解のラベル(目的変数)が必要です。このラベルをどう付け、どんな偏りに気をつけるかが、データセットの質を決めます。とりわけ実務でよく問題になるのが、クラスの件数が大きく偏るクラス不均衡(class imbalance)です。
仕組みHow it works
1. ラベル付け(アノテーション)
正解ラベルは、人手でのアノテーション、既存の記録(購入した/しなかった等)、あるいはルールによる自動付与などで用意します。人手の場合は、複数人で付けて一致度を測る(アノテータ間一致)と品質を確認できます。付け方の基準がぶれるとノイズラベル(誤った正解)が混じり、モデルの上限を下げてしまいます。
2. クラス不均衡という問題
不正検知や病気の判定のように、片方のクラスが極端に少ないデータはよくあります。たとえば 99% が正常・1% が異常のデータでは、すべて「正常」と答えるだけで正解率 99% になります。数字は高いのに、肝心の異常をまったく拾えていません。正解率だけを見てはいけない典型例で、少数派クラスの再現率や F 値を確認する必要があります(評価指標の詳しい説明は 機械学習のモジュールで扱います)。
3. 不均衡への対処
不均衡をやわらげる代表的な手立てが4つあります。
- アンダーサンプリング:多数派を間引いて件数をそろえる。手軽ですが情報を捨てます。
- オーバーサンプリング:少数派を複製・水増しして件数をそろえる。単純な複製は過学習を招きやすいです。
- クラス重み付け:学習時に少数派の誤りを重く扱う。多くの分類器で
class_weight="balanced"のように指定できます。 - SMOTE:少数派サンプルの間を補間して新しい合成サンプルを作るオーバーサンプリング法。単純複製より多様性が出ます。
imbalanced-learnで使えます。
いずれの手立ても、学習データにだけ適用します。評価用データにサンプリングをかけると、現実の分布と食い違い、評価がゆがみます。この「学習側だけに閉じる」考え方は、次の Step のデータリークとも深くつながります。
層化分割ビジュアライザ
2 クラス(A・B)の件数と、テストの割合を決めると、通常のランダム分割と層化分割で、クラスの構成がどう保たれるかを棒で比較します。層化分割は、各クラスを同じ割合で分けるので、元のクラス比が train・test の両方で保たれます。不均衡なデータほど、ランダム分割のずれが目立ちます。
コードで動かすRun the code
SMOTE で少数派を合成し、件数をそろえてみます。imbalanced-learn の fit_resample で、特徴量 X とラベル y をまとめて増やせます。Counter で前後の件数を確認します。
# pip install imbalanced-learn
from imblearn.over_sampling import SMOTE
from collections import Counter
# X: 特徴量, y: ラベル(0 が多数派 90 件, 1 が少数派 10 件)
print("before:", Counter(y))
X_res, y_res = SMOTE(random_state=0).fit_resample(X, y)
print("after :", Counter(y_res))
before: Counter({0: 90, 1: 10})
after : Counter({0: 90, 1: 90})少数派クラス 1 が、多数派と同じ 90 件まで合成されました。なお SMOTE は学習データにだけかけます。評価用データには適用しない、というのが鉄則です。
この Step のまとめ
ラベルは付け方の基準がぶれるとノイズになります。クラス不均衡があると正解率はあてになりにくく、少数派の再現率・F 値を見ます。対処はアンダー/オーバーサンプリング・クラス重み・SMOTE などで、いずれも学習データにだけ適用します。次は、その「学習側に閉じる」設計を、データ分割とリーク防止として体系立てます。
データ分割とリーク防止
Splitting & leakage概要Overview
モデルの本当の実力は、学習に使っていないデータで測ります。そのためにデータを分割します。ここで手順を誤ると、答えを盗み見た「ずるい」評価になり、実力を過大評価してしまいます。これがデータリーク(data leakage)で、前処理でもっとも気をつけたい落とし穴です。
仕組みHow it works
train / validation / test
データは役割で3つに分けます。学習用(train)でモデルを学習し、検証用(validation)でハイパーパラメータを調整し、テスト用(test)で最後に一度だけ実力を測ります。テストは「本番の代役」なので、調整には決して使いません。
データ分割の役割分担(一例)
学習用で学び、検証用で調整し、テスト用で最後に一度だけ評価します。割合はデータ量に応じて変えます(交差検証を使えば、検証用を別に取らずに済みます)。
層化抽出と交差検証
分割のときも、クラス比を保つ層化抽出(stratified sampling)が基本です(Step 4 のデモで見たとおり)。データが少ないときは、分割を変えながら繰り返し評価する交差検証(cross-validation)が有効です。データを k 個に分け、順番に 1 個を検証、残りを学習に使い、k 回の平均で性能を評価します(k-分割交差検証)。偶然のばらつきをならせます。
データリークの正体
データリークは、本来知り得ない情報が学習に混ざることです。前処理でよくやってしまうのが次の誤りです。
- 前処理を分割前に全体へ適用する:標準化の平均・標準偏差や、補完の中央値をデータ全体から計算すると、テストの情報が学習に漏れます。これらの統計量は学習データだけから求め、同じ変換をテストに当てるのが正解です。
- 目的変数のリーク:結果を知ってからでないと得られない特徴量(例:退会後にしか付かないフラグ)を入れてしまう。
- 時系列リーク:未来のデータで過去を予測してしまう。時系列では時間順に分割し、シャッフルしません(過去で学習し、未来で評価)。
この漏れを防ぐ強力な道具が Pipeline です。前処理と学習を1つにまとめると、交差検証や分割のたびに前処理が学習側だけで fitされ、テストには変換だけが当たります。手作業での漏れを構造的に防げます。
コードで動かすRun the code
実在データセット Iris(アヤメ 150 件を 3 品種に分類)で、層化分割・パイプライン・交差検証をまとめて体験します。stratify=y でクラス比を保ち、Pipeline で標準化を学習側に閉じ込めます。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression
X, y = load_iris(return_X_y=True)
# 層化して分割:train と test でクラス比を保つ
X_tr, X_te, y_tr, y_te = train_test_split(
X, y, test_size=0.3, random_state=0, stratify=y)
# 前処理を学習に閉じ込める:標準化は train でだけ fit される
pipe = Pipeline([
("scaler", StandardScaler()),
("clf", LogisticRegression(max_iter=1000)),
])
pipe.fit(X_tr, y_tr)
print("test accuracy:", round(pipe.score(X_te, y_te), 3))
# 交差検証:分割を変えながら平均性能を見る
scores = cross_val_score(pipe, X, y, cv=5)
print("CV mean:", round(scores.mean(), 3))
test accuracy: 0.978
CV mean: 0.973※ CV mean の値は scikit-learn のバージョンにより 0.96〜0.97 程度で変わります(test accuracy は 0.978 で一定)。
もし StandardScaler をパイプラインに入れず、分割前にデータ全体へ fit_transform していたら、それがデータリークです。Pipeline にまとめておけば、cross_val_score が内部で分割を切り替えるたびに、標準化はその都度の学習側だけで学び直されます。数値がわずかに変わるだけに見えて、評価の正しさを守る大切な違いです。
この Step のまとめ
データは train / validation / test に、クラス比を保って(層化)分けます。前処理の統計量は必ず学習データだけから求め、テストには変換だけを当てます。この漏れ防止を Pipeline で構造化すれば、交差検証でも安全です。時系列では時間順に分割し、シャッフルしません。
再現性とデータ管理・これから
Reproducibility & data management概要Overview
前処理は一度きりの作業ではありません。データが増えたり、手順を見直したりするたびに、同じ処理をやり直します。このとき「同じデータに同じ手順を通せば、いつでも同じ結果になる」こと、つまり再現性(reproducibility)が保てるかどうかが、地味ですが決定的に重要です。再現できない前処理は、あとで検証も改善もできません。
仕組みHow it works
パイプライン化
前処理の一つひとつを手作業で回すと、順番の取り違えや当て忘れが起こります。補完・スケーリング・エンコーディングといった工程をパイプライン(Pipeline)として1本にまとめておけば、同じ手順を確実に、同じ順で再実行できます。Step 5 で見たように、リーク防止にもつながります。
乱数シードの固定
データ分割、シャッフル、SMOTE のような処理には乱数が関わります。random_state(シード)を固定すると、乱数の並びが毎回同じになり、結果を再現できます。実験の比較や、不具合の追跡に欠かせません。
データのバージョン管理
コードだけでなく、データそのもののバージョンも記録します。「どの時点のデータで、どの前処理を通したモデルか」をたどれるようにするのが目的です。データにハッシュ(内容の指紋)を付けて管理する専用ツール(DVC など)もあります。生データ・中間データ・最終データセットを区別して保存する習慣も有効です。
記録(データシート)
データセットには、その出所・収集方法・前処理・既知の偏りや制限を文書として添えます。こうした説明書はデータシート(datasheets for datasets)と呼ばれ、他者が(そして未来の自分が)安全に使うための土台になります。どんな加工をしたかを残すことは、研究でも実務でも基本の作法です。
この Step のまとめ
良い前処理は「もう一度同じ結果を出せる」ことまで含みます。工程をパイプライン化し、乱数シードを固定し、データとコードのバージョンをそろえ、加工の記録(データシート)を残す。これで、作ったデータセットを安心して使い回せます。次のモジュールで、このデータセットを実際にモデルへ渡していきます。
まとめWrap-up
学びの振り返りと、さらに学ぶために
このモジュールでは、生データをデータセットへ仕立てる基本の道具を、パイプラインに沿って順に手に入れました。
- データセット構築:行=サンプル・列=特徴量・目的変数。品質の観点(欠損・重複・ノイズ・不整合)で汚れを見つける。
- 欠損値と外れ値:除去と補完(平均・中央値・最頻値)を使い分ける。外れ値は IQR や z スコアで検出する。
- 特徴量エンジニアリング:カテゴリを One-Hot 化し、数値を Min-Max か標準化でスケールする。ビン化・日時分解も。
- ラベルと不均衡:クラス不均衡は正解率をあてにせず、サンプリングや重み・SMOTE で対処する。
- 分割とリーク防止:層化して train / test に分け、前処理を
Pipelineで学習側に閉じ込める。 - 再現性:パイプライン化・乱数シード・データのバージョン管理・記録で、同じ結果を再現できるようにする。
次に進むなら、下の道具と資料が役に立ちます。
公開データセット
- Titanic:乗客の生存予測。欠損・カテゴリ・不均衡がそろう前処理の練習台(OpenML から取得可能)。
- UCI Adult:国勢調査から年収を分類。カテゴリ変数のエンコーディングの定番(UCI / OpenML)。
- Iris:アヤメ 3 品種の分類。scikit-learn 内蔵で、分割・評価の練習に最適。
ライブラリ
- pandas:表形式データの読み込み・洗浄・変換。
- NumPy:数値配列と数学演算の土台。
- scikit-learn:補完・スケーリング・エンコーディング・分割・パイプライン。
- imbalanced-learn:SMOTE などクラス不均衡への対処。
参考書
- 本橋智光『前処理大全』技術評論社
- Alice Zheng, Amanda Casari『Feature Engineering for Machine Learning』O'Reilly
次のモジュールへ
- 自然言語処理(NLP)(テキストの前処理と特徴量化)
- ネットワーク分析(グラフとしてのデータ)
- 機械学習(分類・回帰・評価)
おつかれさまでした
ここで学んだ「洗って → 数値にして → 学習側に閉じて分ける」という流れは、どんなデータを扱うときも共通の土台になります。3 つのデモの数値や件数を書き換えて、もう一度動かしてみてください。補完で表がどう変わるか、スケーリングで値がどう並び直すか、層化がクラス比をどう守るか。手を動かすと、理解がぐっと深まります。
発展トピックBeyond this module
このコースでは扱わない、関係する発展トピック
このモジュールでは、生データをデータセットへ仕立てる「基礎の流れ」を扱いました。いっぽうで近年は、前処理そのものを自動化・体系化する道具立てが急速に広がっています。ここでは、このコースでは踏み込まないものの、知っておくと視野が広がる発展的なトピックを、特に近年の主流を中心に紹介します。深掘りは各自の興味に合わせてどうぞ。
不均衡と自動特徴量生成
- 不均衡対策の発展:SMOTE の派生(Borderline-SMOTE・ADASYN)やアンダーサンプリングとの組み合わせ。
imbalanced-learnにまとまっている。 - 自動特徴量生成:関係のある複数の表から特徴量を自動で作る(Featuretools の深層特徴量合成)。
データ検証と品質保証
- データ検証:期待するスキーマや値の範囲を宣言し、逸脱を自動で検出する(Great Expectations・pandera)。
- データドリフト監視:運用中に入力分布が学習時とずれていないかを継続的に確かめる。
データ管理の基盤
- データバージョン管理:データセットと前処理の来歴を Git のように追跡する(DVC)。
- 特徴量ストア(feature store):作った特徴量を一元管理し、学習と推論で同じ定義を再利用する仕組み。
ラベルづくりの発展
- 弱教師あり学習・能動学習:ルールや少量の注釈からラベルを効率よく用意する(弱教師:Snorkel、能動学習:不確実なサンプルを優先注釈)。
- 合成データ:本物に近い人工データを生成して不足やプライバシーを補う。