「機械学習を始めよう!」と思い立ったとき、多くの人が最初に気になるのは どんなモデルを使うか だ。でも現場のエンジニアたちがいちばん頭を悩ませているのは、実は別のところにある。今日はその「本当の主役」を紹介しよう。
AIはデータで決まる ─ モデルより大事な下ごしらえ

「AIって、すごいモデルを選べば精度が上がるんでしょ?」
「気持ちはわかるけど、実はそこが大きな誤解なんだよな。」


「えっ、違うんですか?」
「料理で考えてみよう。どんなに腕のいい料理人でも、泥だらけで虫食いだらけの野菜を渡されたら、美味しい料理は作れないよな?」


「たしかに……材料がダメなら料理もダメですよね。」
「AIも同じ。モデルがどれだけ賢くても、渡すデータが汚ければ精度はガタ落ちになる。それどころか、まちがった予測や判断を出してしまう危険まである。だからデータの前処理──つまり”下ごしらえ”──が、予測精度の7〜8割を左右するって言われてるんだ。」


「7〜8割!?モデルより前処理の方が大事ってこと?」
「そう言い切っていい。実際、データ分析や機械学習のプロジェクトでは、作業時間全体の約8割が前処理に使われるとされてる。」



「なんでモデルの話ばかり盛り上がって、前処理の話は少ないんでしょう?」
「地味だからだよ(笑)。野菜の皮むきって、料理動画では省略されるじゃん。でも実際の厨房では、そっちに時間がかかってる。AIも同じで、派手なモデルの話の方がSNSでウケるんだよな。でもプロは絶対に前処理を手抜きしない。良い前処理はモデルの学習効率を高めて、訓練にかかる時間や計算リソースまで減らしてくれるからね。」

欠損値・外れ値・型変換 ─ まずは「ゴミ取り」から

「じゃあ、前処理って具体的に何をするんですか?」
「まず最初は”ゴミ取り”だ。野菜で言えば、腐ったところを切り落として、泥を洗い流す作業だな。」

欠損値(NaN)── 「抜けてる野菜」を補う
「ゴミ取りその1が欠損値の処理。データに空っぽのセル、つまり`NaN`ってやつが混じってることがよくあるんだけど、これがあるとモデルは計算できなくて困ってしまう。」


「空欄があるだけで困るんですか?」
「そう。モデルは数字しか扱えないのに、空欄は”数字でも文字でもない何か”だから、エラーになったり変な結果を出したりする。だから補完か削除で対処する必要があるんだ。」

主な対処法はこんな感じだ。
| 方法 | 内容 | 向いているケース |
|---|---|---|
| 平均値で埋める | その列の平均値を入れる | 数値データで外れ値が少ないとき |
| 中央値で埋める | その列の中央値を入れる | 外れ値が多い数値データ |
| 最頻値で埋める | いちばん多い値を入れる | カテゴリデータ |
| 予測モデルで補完 | 他の列から欠損値を予測する | 精度を追求したいとき |
| 行ごと削除 | 欠損のある行を丸ごと消す | 欠損が少数でデータが十分あるとき |

「どれを選べばいいんですか?」
「データの状況によって変わるから、”これが正解”はないんだよ。最初は中央値で埋めるが無難なことが多い。平均値は外れ値にひっぱられやすいから。」

外れ値 ── 「規格外に大きすぎる野菜」を取り除く
「次が外れ値の処理。他のデータと比べて極端に大きかったり小さかったりする値のことだ。たとえば『年齢』のデータに`999`って入ってたら、明らかにおかしいよな。」


「入力ミスとかですかね。」
「そう。センサーの誤作動や入力ミスがよくある原因だ。こういう値をそのまま学習させると、モデルがそっちに引っ張られてしまう。標準偏差やIQR(四分位範囲)という統計的な基準で”これは外れ値だ”と検出して、除去したり修正したりする。」


カテゴリ変数のエンコード ── 「文字を数字に変換」する
「最後がカテゴリ変数のエンコード。モデルは数字しか理解できないから、`東京・大阪・福岡`みたいな文字列のデータは、数字に変換してやらないといけない。」


「どうやって変換するんですか?」
「代表的な方法が2つある。ラベルエンコーディングは`東京=0、大阪=1、福岡=2`みたいに番号を振る方法。ワンホットエンコーディングは`東京か否か`、`大阪か否か`、`福岡か否か`という列を新しく作る方法だ。」


「何が違うんですか?」
「ラベルエンコーディングは番号の大小に意味が出てしまうんだ。`東京=0、福岡=2`だと、なんとなく”福岡>東京”みたいに解釈されてしまうことがある。都市名に順番はないから、この場合はワンホットエンコーディングの方が安心だな。」


正規化と標準化 ─ 単位をそろえる「計量」の作業

「ゴミを取り除いたら、次は何をするんですか?」
「”計量”だ。料理で言えば、材料の量をそろえる作業。数値のスケール(単位)をそろえることだな。」


「スケールをそろえる?」
「たとえば`年齢(0〜100)`と`年収(0〜10,000,000円)`を同じデータに入れるとする。数値の大きさが全然違うよな?」


「年収は0が7つついてますね。」
「そう。これをそのままモデルに渡すと、数値が大きい年収ばかりがモデルに影響して、年齢はほぼ無視されるという問題が起きる。重要度じゃなくて、数値の大きさで判断されてしまうんだ。これを防ぐために数値のスケールをそろえる。」


正規化(Normalization)
「正規化は、すべての値を0〜1の範囲に収める方法だ。最小値を0、最大値を1にして、他の値は比例した位置に並べる。」

標準化(Standardization)
「標準化は、データの平均を0、標準偏差を1に変換する方法だ。外れ値があっても極端に影響されにくい。」


「どっちを使えばいいんですか?」
「外れ値が少なくてデータがキレイなら正規化、外れ値が含まれている可能性があるなら標準化が無難なことが多い。でもどちらが向いているかはデータ次第だから、両方試してみるのが正直なところだな。」

特徴量エンジニアリング ─ データに「味付け」する技術

「下ごしらえって、ゴミを取って量をそろえるだけじゃないんですか?」
「甘い!本当に美味しくするには”味付け”も必要だ。AIで言うと、特徴量エンジニアリングがそれに当たる。」


「特徴量エンジニアリングって何ですか?」
「既存のデータから、モデルが学習しやすい新しい特徴量(説明変数)を作り出したり、不要なものを削ったりするプロセスのことだ。」

新しい特徴量を作る
「たとえば`生年月日`というデータがあったとする。生年月日そのままよりも、今日の日付から引き算して年齢を計算した方がモデルは学習しやすい。あるいは`購入回数`と`購入金額`があったら、割り算して1回あたりの平均購入金額を作ってあげるとか。」


「データから新しいデータを生み出すんですね!」
「そう!それが特徴量エンジニアリングの醍醐味だ。ドメイン知識、つまりその分野の専門知識をうまく活かすほど、良い特徴量が作れる。」

不要な特徴量を削る
「逆に、要らない特徴量を削ることも大事なんだ。不要な情報がたくさんあると、モデルがノイズを学習してしまって、訓練データにだけ過剰にフィットする”過学習”が起きやすくなる。PCAという次元削減の手法なんかを使って、情報量の少ない特徴量を整理することで、モデルの汎化性能──つまり”未知のデータにも通用する力”──を高められる。」


「味付けが濃すぎると料理が台無しになるのと同じですね。」
「その通り!素材の良さを引き出す程度がちょうどいい。」


データ分割 ─ 学習データとテストデータを分ける理由

「ここまでの前処理をしたら、さっさとモデルに全部のデータを学習させればいいんじゃないですか?」
「それが大きな落とし穴なんだよ!」


「えっ、なんでですか?」
「料理の試食で考えてみよう。自分で作った料理を自分で食べて”美味しい!”と言っても、それは信用できないよな。作ったときに味見してるし、自分の好みに合わせて作ってるから。」


「たしかに、第三者に食べてもらわないと客観的な評価にならないですね。」
「AIも同じ。全データで学習すると、モデルが訓練データを丸暗記してしまって、見たことのないデータには全然対応できなくなる。これが過学習だ。本番環境では必ず”見たことのないデータ”が来るから、これは致命的だよな。」


「だからテストデータを取っておいて、学習後に”初見で”評価するんですね。」
「完璧な理解だ!一般的な分割比率は訓練:テスト = 8:2 または 7:3が多い。」


分割は特徴量エンジニアリングの”前”にやる
「あと、これは超重要なポイントなんだけど──データ分割は、特徴量エンジニアリングより先にやらないといけない。」


「え?さっきの話だと、前処理してから分割するんじゃないんですか?」
「欠損値補完とかスケーリングなら分割後でもいいんだけど、特徴量エンジニアリングを分割前にやるとデータリークが起きる可能性があるんだ。」


「データリーク?」
「テストデータの情報が、知らない間に学習データに”漏れ”てしまうことだ。テスト前に答えを見ちゃうようなものだな。そうするとテストの評価が嘘になってしまう。だからまずデータを分割して、テストデータには一切触れないようにしてから、特徴量エンジニアリングを進めるのが正しい順序だ。」


「なるほど!テストデータは封印しておくんですね。」
まとめ ─ 良い料理は良い下ごしらえから

「今日学んだこと、整理してもらえますか?」
「まとめると、前処理はこんな流れで進めるんだ。」


① クリーニング(欠損値・外れ値の処理、文字列→数値の変換)
↓
② 変換(正規化・標準化でスケールをそろえる)
↓
③ データ分割(訓練用・テスト用に分ける)
↓
④ 特徴量エンジニアリング(新特徴量の追加・不要特徴量の削除)
↓
⑤ モデルへ投入!

「特徴量エンジニアリングが最後の方なんですね。」
「そう。データリーク防止のために分割を先にやるのを忘れないようにな。」


「モデルを選ぶことばかり考えてましたけど、前処理の方がずっと奥深いんですね。」
「そうなんだよ。良いデータ前処理がモデルの予測能力と汎化能力を決定づける。どんな高性能なモデルも、下ごしらえのできてないデータには勝てない。料理人が腕より先に包丁の手入れをするのと同じだな。」


「まず前処理をしっかり覚えます!」
「その心がけがあれば、AIプロジェクトの8割は成功したも同然だ。次はモデル選びの話もしていこう。」

初心者がまず取り組むべき前処理チェックリスト
- [ ] 欠損値(NaN)がどの列にどれくらいあるか確認した
- [ ] 明らかに異常な外れ値がないか確認した
- [ ] 文字列のカテゴリデータを数値に変換した
- [ ] 数値のスケールが列によって大きく違う場合、正規化か標準化を行った
- [ ] データを訓練用とテスト用に分割してから特徴量エンジニアリングを行った
「この5つを意識するだけで、最初の前処理は十分スタートできるぞ。」


「ありがとうございます!野菜の皮むきを侮ってました(笑)」
「”下ごしらえ8割”、忘れるなよ!」

参考文献
- https://xtech.nikkei.com/atcl/learning/lecture/19/00110/00001/
- https://www.couchbase.com/blog/data-preprocessing-in-machine-learning/
- https://www.aibrilliance.com/blog/the-importance-of-data-preprocessing-in-machine-learning
- https://promo.digital.ricoh.com/ai-for-work/column/detail009/
- https://encord.com/blog/data-cleaning-data-preprocessing/
- https://www.matrixflow.net/case-study/14/
- https://www.datacamp.com/blog/data-preprocessing
- https://tech.aru-zakki.com/feature-engneering/
- https://www.appliedaicourse.com/blog/data-preprocessing-in-machine-learning/
- https://www.salesanalytics.co.jp/column/no00366/
- https://intelliarts.com/blog/data-preprocessing-in-machine-learning-best-practices/
- https://www.everpuredata.com/jp/knowledge/what-is-data-preprocessing.html

コメント