忍者ブログ
統計、機械学習、AIを学んでいきたいと思います。 お役に立てば幸いです。

【Kaggle挑戦記】Titanic 攻略 #4:ランダムフォレストの正体

第2回では「最短ルート」での初提出を優先し、モデルの選定理由は「なんとなく」進めてきました。ここでは、そこで使用したモデルの正体を明らかにするとともに、その実行過程(個別の判断ルール)を可視化するための改良コードを整理します。

1. 【振り返り】前回のソースコード

まずは、第2回で実際に提出ファイルを生成したベースラインのソースコードを正確に振り返ります。この時点では「Pclass, Sex, SibSp, Parch」の4項目を特徴量としていました。

import pandas as pd
from sklearn.ensemble import RandomForestClassifier

# 1. データの読み込み
train_data = pd.read_csv('train.csv')
test_data = pd.read_csv('test.csv')

# 2. 特徴量の選択と前処理
features = ["Pclass", "Sex", "SibSp", "Parch"]
# get_dummiesでカテゴリ変数(Sex)を数値(Sex_male, Sex_female)に変換
X = pd.get_dummies(train_data[features])
y = train_data["Survived"]
X_test = pd.get_dummies(test_data[features])

# 3. モデルの構築と学習(100本の決定木を作成)
model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)
model.fit(X, y)

# 4. 予測の実行
predictions = model.predict(X_test)

# 5. 提出用ファイルの作成
output = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': predictions})
output.to_csv('submission.csv', index=False)
print("Your submission was successfully saved!")

2. 手法の解説:二値分類とランダムフォレスト

今回のタイタニック課題は、乗客が「生存したか、死亡したか」という二値分類問題を解くものです。代表的な手法には「ロジスティック回帰」「SVM」「ランダムフォレスト」「勾配ブースティング」などがありますが、今回は安定性が高くベースライン作りに適したランダムフォレストを採択しました。

3. 【改良】実行過程を可視化するソースコード

「100本の木による多数決」という実行プロセスを正確に把握するため、可視化用のライブラリをインポートし、model.fit(X, y) のすぐ下に処理を追加します。

import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import export_text # 可視化用のインポートを追加

# --- 前処理・モデル構築(前回と同じ) ---
train_data = pd.read_csv('train.csv')
features = ["Pclass", "Sex", "SibSp", "Parch"]
X = pd.get_dummies(train_data[features])
y = train_data["Survived"]
model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)

# 3. モデルの学習
model.fit(X, y)

# --- model.fit(X, y) の直下に可視化処理を追加 ---
# 100本の木から最初の1本(index=0)を取り出す
estimator = model.estimators_[0]

# 判断ルールをテキスト形式で出力(feature_namesを指定)
tree_rules = export_text(estimator, feature_names=list(X.columns))
print("--- 最初の1本の決定木による判断プロセス ---")
print(tree_rules)
# --- ここまで追加 ---

# 以降、予測の実行(前回と同じ)
# predictions = model.predict(X_test)

実行時の出力サンプル:

--- 最初の1本の決定木による判断プロセス ---
|--- Sex_female <= 0.50
| |--- SibSp <= 2.50
| | |--- Pclass <= 1.50
| | | |--- Parch <= 3.00
| | | | |--- Parch <= 1.50
| | | | | |--- class: 0.0
| | | | |--- Parch > 1.50
| | | | | |--- class: 1.0
| | | |--- Parch > 3.00
| | | | |--- class: 0.0
| | |--- Pclass > 1.50
| | | |--- Parch <= 0.50
| | | | |--- Pclass <= 2.50
| | | | | |--- class: 0.0
| | | | |--- Pclass > 2.50
| | | | | |--- class: 0.0
| |--- SibSp > 2.50
| | |--- class: 0.0

4. 【考察】最も精度の高い木が選ばれるのか?

ここで重要な疑問が浮かびます。「これら100本の木の中から、テストデータに対して最も精度の高い1本が選ばれて予測に使われるのか?」という点です。

答えは「NO」です。ランダムフォレストの本質は「選別」ではなく「合議制(多数決)」にあります。

  • アンサンブル学習: 1本の完璧な木を探すのではなく、少しずつ異なる視点を持つ100本の木全員に予測をさせます。
  • 多数決の原理: 例えば、60本の木が「死亡」、40本の木が「生存」と予測したら、最終回答は「死亡」となります。
  • なぜそうするのか: 1本の優秀すぎる木は、学習データに依存しすぎる(過学習)リスクがあります。多様な視点を持つ木々の平均をとることで、未知のデータに対しても安定した予測が可能になるのです。

手法の実行プロセスと「多数決」の論理を理解したことで、モデルの挙動に対する納得感が得られました。次は第3回で算出した相関係数に基づき、さらなる精度向上を目指します。

PR

【DS検定対策】AIの進化を攻略!複数データを統合する「マルチモーダル生成」

近年のAIは、文字だけでなく画像や音声など、人間と同じように複数の感覚を組み合わせて理解・生成ができるようになっています。この「マルチモーダル」というキーワードを正しく理解しましょう。

1. 【 問題 】

テキスト、画像、音声、動画といった異なる種類のデータ形式(モーダル)を複数組み合わせて入力し、それらを統合して判断したり、多様な形式の出力を生成したりする技術を何と呼ぶでしょうか?

① シングルモーダル生成
② マルチモーダル生成
③ アンサンブル学習
④ 転移学習


2. 【 解答 】

正解: ② マルチモーダル生成

3. 整理:異なるデータを「統合」する世界

「モーダル(様式)」が「マルチ(複数)」であることは、AIがより人間に近い柔軟な処理を行えることを意味します。

【 マルチモーダルの処理イメージ 】

[ 1. 多様な入力 ]
・テキスト(「この写真の説明をして」)
・画像(旅行中の風景写真)

[ 2. 内部での統合 ]
★ ここがマルチモーダル!
言葉の意味と、画像内の物体を関連付けて一つの「概念」として理解する。

[ 3. 多様な出力 ]
・音声での回答(「ここは名古屋のテレビ塔ですね」)
・関連する動画の生成

--------------------------

特徴: 異なる形式のデータを同じベクトル空間上で扱うことで、高度な推論が可能になります。

4. 代表的な活用例

1. 画像生成AI: 「テキスト(プロンプト)」を入力して「画像」を出力する。
2. 動画解析: 「映像」と「音声」の両方から、その場がどのような状況かを判断する。
3. 高度なチャットボット: 図表を含むドキュメントを読み取って、内容を要約・解説する。


5. DS検定形式:実戦4択クイズ

問:テキストから画像を生成するモデル(Stable Diffusionなど)において、言葉と画像の概念を対応付けるために使われる代表的な技術はどれか。

① RNN   ② CLIP   ③ ランダムフォレスト   ④ 協調フィルタリング

【 正解: ② 】

解説: CLIP(Contrastive Language-Image Pre-training)は、膨大な画像とテキストのペアを学習し、両者を結びつけるマルチモーダルの先駆け的なモデルです。これにより「言葉で画像を指示する」ことが可能になりました。


6. まとめ

DS検定において「複数のデータ形式を統合」「多様な出力を生成」というキーワードが出たら、それは「マルチモーダル」を指しています。AIが文字の世界から現実の世界へと理解を広げている象徴的な技術ですので、しっかり覚えておきましょう!

【Kaggle挑戦記】Titanic 攻略 #3:データの「当たり」をつける

最短ルートで初提出(スコア:0.76794)を終えた段階で、次に行うべきは、どのデータ(特徴量)が生存に直結しているのか、論理的な仮説と数値で切り分ける作業です。

1. 仕様確認:データ項目の定義一覧

まずは手元にあるテーブルの定義を正確に把握し、全12項目の中で何が利用可能かを確認します。

項目名 (Column)意味 (Description)型 (Type)補足 (Notes)
PassengerId 乗客ID int 連番。予測には使わない主キー
Survived 生存フラグ int 【正解データ】 0=死亡、1=生存
Pclass チケットクラス int 1=上層(1等)、2=中層(2等)、3=下層(3等)
Name 氏名 object 文字列
Sex 性別 object male / female
Age 年齢 float 欠損値あり
SibSp 兄弟・配偶者数 int 同乗している兄弟や配偶者の数
Parch 両親・子供数 int 同乗している両親や子供の数
Ticket チケット番号 object 文字列
Fare 旅客運賃 float 数値データ
Cabin 客室番号 object 欠損値多
Embarked 出港地 object C / Q / S

2. 仮説:項目の切り分け

各項目が生存に関係しそうかどうかを、とりあえず、勘で事前に切り分けます。

項目名 (Column)関連性の推論
Sex ありそう
Pclass ありそう
Age ありそう
Fare ありそう
SibSp / Parch ありそう
Name なさそう
Embarked なさそう
Ticket / Cabin なさそう
PassengerId なさそう

3. 検証:相関分析の実行(完全なソースコード)

「ありそう」と踏んだ項目について、実際に Survived(生存率) との関係性を算出します。汎用性が高く、まずは全体像を把握するために適しているためピアソンの積率相関係数を採用する。

import pandas as pd

# 1. データの読み込み
train_df = pd.read_csv('train.csv')

# 2. 相関計算のため「文字列」を「数値」に一時変換(エンコード)
train_encoded = train_df.copy()
train_encoded['Sex'] = train_encoded['Sex'].map({'male': 0, 'female': 1})

# 3. 算出対象の項目選定(「ありそう」と踏んだ項目に限定)
target_columns = ['Survived', 'Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare']

# 4. 相関係数(ピアソン)の算出
pearson_corr = train_encoded[target_columns].corr(method='pearson')

# 5. 「Survived」との相関を表示
print("--- Survived との相関係数(ピアソン) ---")
print(pearson_corr['Survived'].sort_values(ascending=False))

【 分析結果:生存率との相関係数 】

  • Sex:0.543
  • Fare:0.257
  • Pclass:-0.338
  • Age:-0.077
  • Parch:0.081
  • SibSp:-0.035

4. 前回プログラムの振り返り

第2回の最短ルートで使用した特徴量と、今回の相関計算の結果を照らし合わせます。

# 前回の特徴量選択
features = ["Pclass", "Sex", "SibSp", "Parch"]

前回は「ありそう」と推測した項目のうち、FareAge を除いた 4項目を特徴量として利用しました。今回の計算結果を見ると、利用しなかった Fare が一定の相関(0.25)を示しており、これを特徴量に加えることでモデルの判断材料がどう変化するかを試す価値はありそうです。

また、Age については相関係数こそ低いですが、欠損値を適切に補完した上で投入することで、どのような変化が出るかを検証する必要があります。



【DS検定対策】深層学習の壁を攻略!学習が暴走する「勾配爆発」とは?

ディープラーニングの学習において、勾配が消えてしまう「勾配消失」とは逆に、勾配が指数関数的に大きくなってしまうのが「勾配爆発」です。学習が成立しなくなるこの現象を整理しましょう。

1. 【 問題 】

ニューラルネットワークの学習において、誤差逆伝播法で算出される勾配が極端に大きな値となり、パラメータの更新が異常に大きくなることで学習が発散・不安定になる現象を何と呼ぶでしょうか?

① 勾配消失問題
② 勾配爆発問題
③ オーバーフィッティング
④ 局所最適解


2. 【 解答 】

正解: ② 勾配爆発問題

3. 整理:なぜ「勾配」が暴走するのか?

勾配消失が「1より小さい値の掛け算」で起こるのに対し、勾配爆発は「1より大きな値の掛け算」が繰り返されることで起こります。

【 勾配爆発のイメージ 】

[ 1. 誤差の逆伝播 ]
層をさかのぼる際、重み行列の値を何度も掛け合わせる。

[ 2. 値が急激に膨れ上がる ]
★ ここが勾配爆発!
大きな値(重み)の掛け算が重なり、勾配が巨大な数値になる。

[ 3. パラメータの更新が「跳ねる」 ]
更新幅が大きすぎて、最適値(谷底)を飛び越えて発散してしまう。

--------------------------

結果: 重みが「NaN(非数)」になったり、学習が全く進まなくなったりします。

4. 代表的な対策

1. 勾配クリッピング: 勾配がある一定の閾値を超えたら、強制的に値を抑え込む手法です。
2. バッチ正規化: データの偏りを抑え、勾配が極端な値になるのを防ぎます。
3. 適切な重みの初期化: 最初から重みの値が大きくなりすぎないように調整します。


5. DS検定形式:実戦4択クイズ

問:勾配爆発を防ぐために、算出された勾配のノルム(大きさ)が一定値を超えた場合にその値を制限する手法を何と呼ぶか。

① ドロップアウト   ② 勾配クリッピング   ③ 正則化   ④ 早期終了

【 正解: ② 】

解説: 「クリッピング(切り取り)」という名前の通り、勾配が暴走しないよう上限を設ける手法です。RNN(再帰型ニューラルネットワーク)など、層が深い(時間方向に長い)モデルで特によく使われます。


6. まとめ

DS検定で「勾配が極端に大きな値になる」「学習が発散する」という記述があれば、それは「勾配爆発」を指しています。勾配消失(ReLUなどで対策)と勾配爆発(クリッピングなどで対策)はペアで出題されやすいため、セットで覚えておきましょう!


【DS検定対策】深層学習の壁を攻略!学習が止まる「勾配消失問題」とは?

ディープラーニングの層を深くしすぎると、かえって学習がうまく進まなくなることがあります。その主な原因の一つである「勾配消失問題」の仕組みを正しく理解しましょう。

1. 【 問題 】

ニューラルネットワークの学習において、層が深くなるにつれて誤差の情報(勾配)が極端に小さくなり、入力層に近い層のパラメータがほとんど更新されなくなる現象を何と呼ぶでしょうか?

① 過学習(オーバフィッティング)
② 勾配消失問題
③ 局所最適解へのトラップ
④ 次元の呪い


2. 【 解答 】

正解: ② 勾配消失問題

3. 整理:なぜ「勾配」が消えてしまうのか?

ニューラルネットワークは「誤差逆伝播法」という仕組みで、後ろの層から前の層へと「間違いの修正情報」を伝えていきます。

【 勾配消失のイメージ 】

[ 1. 出力層でエラーを発見 ]
「答えが少しズレているぞ!」という情報を逆方向に送る。

[ 2. 層をさかのぼる(掛け算の連続) ]
活性化関数の微分値を何度も掛け合わせていく。

[ 3. 値がどんどん小さくなる ]
★ ここが勾配消失!
1より小さい値を何度も掛けることで、入力層に届く頃には値が「ほぼゼロ」になる。

--------------------------

結果: 前の方の層にある重みが更新されず、学習がストップしてしまいます。

4. 解決のためのアプローチ

1. 活性化関数の工夫: シグモイド関数ではなく、勾配が消えにくい「ReLU関数」などを使用する。
2. バッチ正規化: 各層の出力を適切な範囲に調整し、学習を安定させる。
3. 適切な重みの初期化: 「Heの初期値」などを用い、最初から値が小さくなりすぎないようにする。


5. DS検定形式:実戦4択クイズ

問:勾配消失問題を緩和するために、隠れ層(中間層)の活性化関数として一般的に推奨される関数はどれか。

① シグモイド関数   ② ReLU関数   ③ ステップ関数   ④ 線形関数

【 正解: ② 】

解説: シグモイド関数は値が大きくなると微分値がほぼ0になるため、勾配消失が起きやすい特徴があります。一方、ReLU(Rectified Linear Unit)関数は入力が正であれば微分値が1のまま保たれるため、深い層でも学習が進みやすくなります。


6. まとめ

DS検定で「誤差逆伝播法」「勾配がゼロに近い」「パラメータが更新されない」というセットが出たら、正解は「勾配消失」です。歴史的に深層学習が停滞した理由の一つでもあるため、背景知識としてもしっかり押さえておきましょう!