<?xml version="1.0" encoding="UTF-8" ?>
<feed xml:lang="ja" xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:thr="http://purl.org/syndication/thread/1.0">
  <title type="text">いけいけ機械学習</title>
  <subtitle type="html">統計、機械学習、AIを学んでいきたいと思います。 お役に立てば幸いです。</subtitle>
  <link rel="self" type="application/atom+xml" href="http://learnms.blog.shinobi.jp/atom"/>
  <link rel="alternate" type="text/html" href="http://learnms.blog.shinobi.jp/"/>
  <updated>2015-10-10T06:20:17+09:00</updated>
  <author><name>吟遊詩人</name></author>
  <generator uri="//www.ninja.co.jp/blog/" version="0.9">忍者ブログ</generator>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" />
  <entry>
    <id>learnms.blog.shinobi.jp://entry/108</id>
    <link rel="alternate" type="text/html" href="http://learnms.blog.shinobi.jp/Entry/108/" />
    <published>2026-04-30T20:26:05+09:00</published> 
    <updated>2026-04-30T20:26:05+09:00</updated> 
    <category term="DS検定＞1. データサイエンス＞1-4. 応用技術＞1-4-2. 言語モデル" label="DS検定＞1. データサイエンス＞1-4. 応用技術＞1-4-2. 言語モデル" />
    <title>【技術トレンド】AIと外部システムを繋ぐ架け橋！「MCP (Model Context Protocol)」とは？</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<p>生成AIに「自社のデータベースを見せたい」「外部APIを叩かせたい」。そんなカスタマイズを、共通のルールで簡単に実現するのがMCPです。</p>
<h3 style="color: blue;">1. 【 問題 】</h3>
<p>Anthropic社が発表した、大規模言語モデル（LLM）と外部のデータソースやツール、他システムとの連携を共通化するためのオープンな標準プロトコルを何と呼ぶでしょうか？</p>
<p>① MCP (Model Context Protocol)<br />
② RAG (Retrieval-Augmented Generation)<br />
③ API (Application Programming Interface)<br />
④ JSON-RPC Protocol</p>
<hr />
<h3 style="color: #d32f2f;">2. 【 解答 】</h3>
<div style="background-color: #eeeeee; border: 2px solid #333; padding: 15px; font-size: 1.2em; font-weight: bold; text-align: center;">正解： ① MCP (Model Context Protocol)</div>
<hr />
<h3 style="color: blue;">3. 整理：AIに「手足」と「目」を与える共通規格</h3>
<p>これまで、AIを外部システム（データベース、Slack、GitHubなど）と連携させるには、AIごとに個別の接続プログラムを書く必要がありました。MCPはここを「共通規格」で解決します。</p>
<p>【 MCPの役割イメージ 】</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6;">[ AIクライアント (Claudeなど) ]<br />
　　&uarr; (MCP規格で通信)<br />
[ MCPサーバー (中継役) ]<br />
　　&uarr; (各システム独自の接続)<br />
[ 外部データ・ツール ]<br />
(Google Drive, ローカルDB, GitHubなど)<br />
<br />
--------------------------<br />
<br />
◎ <b>メリット： 一度MCPサーバーを作れば、異なるAIモデルやアプリから同じように外部データへアクセスできるようになります。</b></div>
<h3 style="color: blue;">4. MCPでできること</h3>
<p>1. <b>コンテキストの提供</b>: AIに自社の最新ドキュメントやデータベースの内容を、リアルタイムな「背景知識（コンテキスト）」として渡せます。<br />
2. <b>ツールの実行</b>: AIに「このSQLを実行して結果をグラフにして」といった具体的な処理（アクション）を行わせることができます。<br />
3. <b>他AIとの連携</b>: 異なる役割を持つAI同士を連携させ、複雑なワークフローを自動化する土台になります。</p>
<hr />
<h3 style="color: orange;">5. エンジニア向け：実戦クイズ</h3>
<p><b>問：MCPを導入することで、開発者が個別のAIモデル（GPTやClaudeなど）ごとに、外部データベース接続コードを書き直す手間が減る理由は何か。</b></p>
<p>① AIが自動的に全てのプログラムを書き換えるから。<br />
② MCPがAIと外部リソース間の「共通インターフェース」として機能するから。<br />
③ データベースの構造自体をAI専用のものに変換するから。<br />
④ MCPを使うとインターネット経由の通信が不要になるから。</p>
<p><b>【 正解： ② 】</b></p>
<p><b>解説：</b> MCPは、いわば「AI用のUSB規格」のようなものです。規格さえ合っていれば、接続先がどのAIであっても、同じサーバー（リソース）を利用できるため、開発の効率が劇的に向上します。</p>
<hr />
<h3 style="color: blue;">6. まとめ</h3>
<p>最新のAI活用において「他システムとの連携」は避けて通れないテーマです。「Model Context Protocol (MCP)」という言葉を覚えておくと、AIを業務システムに組み込む際の強力な武器になります！</p>]]> 
    </content>
    <author>
            <name>吟遊詩人</name>
        </author>
  </entry>
  <entry>
    <id>learnms.blog.shinobi.jp://entry/107</id>
    <link rel="alternate" type="text/html" href="http://learnms.blog.shinobi.jp/Entry/107/" />
    <published>2026-04-30T20:13:45+09:00</published> 
    <updated>2026-04-30T20:13:45+09:00</updated> 
    <category term="DS検定＞1. データサイエンス＞1-4. 応用技術＞1-4-2. 言語モデル" label="DS検定＞1. データサイエンス＞1-4. 応用技術＞1-4-2. 言語モデル" />
    <title>【DS検定対策】AIの限界はどこだ？「スケーリング則」が示す成長の法則</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<p>大規模言語モデル（LLM）がなぜこれほどまでに巨大化しているのか。その理論的根拠となっているのが「スケーリング則」です。性能を決める3つの要素を整理しましょう。</p>
<h3 style="color: blue;">1. 【 問題 】</h3>
<p>大規模言語モデルにおいて、特定の要素を拡大することで、モデルの性能（精度）が予測可能な形で向上し続け、頭打ちにならないという法則を「スケーリング則」と呼びます。この法則において、性能と相関する「3つの要素」として正しい組み合わせはどれでしょうか？</p>
<p>① モデルのパラメータ数、学習データ量、計算資源（計算量）<br />
② データベースの容量、通信速度、ユーザー数<br />
③ CPUのクロック周波数、メモリ容量、ストレージ速度<br />
④ プロンプトの長さ、回答の文字数、学習の回数</p>
<hr />
<h3 style="color: #d32f2f;">2. 【 解答 】</h3>
<div style="background-color: #eeeeee; border: 2px solid #333; padding: 15px; font-size: 1.2em; font-weight: bold; text-align: center;">正解： ① モデルのパラメータ数、学習データ量、計算資源（計算量）</div>
<hr />
<h3 style="color: blue;">3. 整理：性能を伸ばす「3つのエンジン」</h3>
<p>スケーリング則（Scaling Laws）は、2020年にOpenAIの研究者らによって示されました。以下の3つを指数関数的に増やせば、性能は「べき乗則」に従って向上し続けます。</p>
<p>【 スケーリングを支える3要素 】</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6;">1. <b>モデルサイズ（N）</b><br />
&rarr; パラメータ数（脳の神経細胞の結びつきのようなもの）を増やす。<br />
<br />
2. <b>データセットサイズ（D）</b><br />
&rarr; 学習に読み込ませるテキストデータ（トークン）の量を増やす。<br />
<br />
3. <b>計算量（C）</b><br />
&rarr; 学習に使用するGPUなどの計算リソースと時間を増やす。<br />
<br />
--------------------------<br />
<br />
★ <b>ここがポイント！：</b><br />
単に「データが多い」だけでは不十分で、そのデータを処理できる「巨大なモデル」と、それを動かす「膨大な計算機パワー」がセットになって初めて、精度は上がり続けます。</div>
<h3 style="color: blue;">4. スケーリング則が変えたAI開発</h3>
<p>1. <b>予測可能性</b>: 巨額の投資をして巨大なモデルを作る前に、小さなモデルでの実験から「どのくらい賢くなるか」をあらかじめ予測できるようになりました。<br />
2. <b>創発への期待</b>: この法則に従ってスケールアップを続けた結果、ある地点で「推論能力」などの高度な知能が突然現れる（創発現象）ことが確認されました。</p>
<hr />
<h3 style="color: orange;">5. DS検定形式：実戦4択クイズ</h3>
<p><b>問：スケーリング則に関する記述として、誤っているものはどれか。</b></p>
<p>① モデルを大きくしても、学習データが少なければ性能向上は頭打ちになる。<br />
② 計算資源（GPUなど）を増やすことは、性能向上に寄与する。<br />
③ スケーリング則によれば、性能の向上は対数グラフ上で直線的に表される。<br />
④ スケーリング則は、データの質（クオリティ）に関わらず量さえあれば成立する。</p>
<p><b>【 正解： ④ 】</b></p>
<p><b>解説：</b> スケーリング則は「量」の重要性を説いていますが、近年では「質の高いデータ」を学習させる方が効率的に性能が上がることが分かってきました（Chinchilla Scaling Lawsなど）。単にゴミのようなデータ（ノイズ）を増やしても精度は上がりません。</p>
<hr />
<h3 style="color: blue;">6. まとめ</h3>
<p>DS検定において「パラメータ数・データ量・計算量」と「性能の向上」がセットで語られたら「スケーリング則」です。この法則を信じて突き進んだ結果、現在のGPT-4などの驚異的なAIが誕生したという背景を理解しておきましょう！</p>]]> 
    </content>
    <author>
            <name>吟遊詩人</name>
        </author>
  </entry>
  <entry>
    <id>learnms.blog.shinobi.jp://entry/106</id>
    <link rel="alternate" type="text/html" href="http://learnms.blog.shinobi.jp/Entry/106/" />
    <published>2026-04-30T19:30:40+09:00</published> 
    <updated>2026-04-30T19:30:40+09:00</updated> 
    <category term="【Kaggle挑戦記】" label="【Kaggle挑戦記】" />
    <title>【Kaggle挑戦記】Spaceship Titanic 攻略 #14：GroupSizeのカテゴリ化。重要度への反映と精度のトレードオフ</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<h3 style="color: blue;">1. 実験：人数の「意味」をモデルに教える</h3>
<p>前回の分析で判明した「4人グループの異常な転送率（64%）」をモデルに直接認識させるため、GroupSizeを <b>Solo / Small / Large</b> の3カテゴリに分類しました。 連続的な数値としてではなく、独立した属性として扱うことで、モデルの「気付き」を促す狙いです。</p>
<h3 style="color: blue;">2. 【実装】GroupCategory導入版・フルソースコード</h3>
<p>分析に基づき、最も転送率が高かった2〜4人を「Small」と定義。これを特徴量として追加したコードです。</p>
<pre style="border: 1px solid #ccc; padding: 15px; background-color: #f4f4f4; overflow-x: auto; font-family: Consolas, Monaco, 'Courier New', monospace; line-height: 1.5; font-size: 13px; color: #333;">import pandas as pd
import numpy as np
import lightgbm as lgb

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

# グループサイズ計算用
all_df = pd.concat([train, test], axis=0)
all_groups = all_df['PassengerId'].apply(lambda x: x.split('_')[0]).value_counts()

# 2. 特徴量エンジニアリング
spend_cols = ["RoomService", "FoodCourt", "ShoppingMall", "Spa", "VRDeck"]

def get_group_category(size):
    if size == 1:
        return 'Solo'
    elif 2 &lt;= size &lt;= 4:
        return 'Small' # 転送率が極めて高い層
    else:
        return 'Large' # 大家族層

for df in [train, test]:
    # --- A. 支出の論理補完 ---
    df[spend_cols] = df[spend_cols].fillna(0)
    total_spend = df[spend_cols].sum(axis=1)
    df.loc[(df['CryoSleep'].isnull()) &amp; (total_spend &gt; 0), 'CryoSleep'] = False
    df.loc[(df['CryoSleep'].isnull()) &amp; (total_spend == 0), 'CryoSleep'] = True
    df['Age'] = df['Age'].fillna(df['Age'].median())

    # --- B. Cabinの物理分解 ---
    df['Cabin'] = df['Cabin'].fillna('U/U/U')
    df['Cabin_Deck'] = df['Cabin'].apply(lambda x: x.split('/')[0])
    df['Cabin_Side'] = df['Cabin'].apply(lambda x: x.split('/')[-1])

    # --- C. GroupSizeのカテゴリ化 ---
    group_id = df['PassengerId'].apply(lambda x: x.split('_')[0])
    df['GroupSize'] = group_id.map(all_groups)
    df['GroupCategory'] = df['GroupSize'].apply(get_group_category)

# 3. 特徴量の選定
features = [
    "CryoSleep", "Age", "RoomService", "FoodCourt", "ShoppingMall", 
    "Spa", "VRDeck", "Cabin_Deck", "Cabin_Side", "GroupCategory"
]

# 4. 整形と学習
X = pd.get_dummies(train[features], drop_first=True)
y = train["Transported"].astype(int)
X_test = pd.get_dummies(test[features], drop_first=True)
X, X_test = X.align(X_test, join='left', axis=1, fill_value=0)

model = lgb.LGBMClassifier(n_estimators=100, learning_rate=0.05, random_state=1)
model.fit(X, y)

# 5. 予測と保存
predictions = model.predict(X_test)
output = pd.DataFrame({'PassengerId': test['PassengerId'], 'Transported': predictions.astype(bool)})
output.to_csv('sub_v14_group_cat.csv', index=False)

# 6. 分析ログの出力
print("\n 特徴量寄与度 (Importance) - Top 15")
importances = pd.DataFrame({'Feature': X.columns, 'Importance': model.feature_importances_}).sort_values(by='Importance', ascending=False)
print(importances.head(15))
</pre>
<h3 style="color: blue;">3. 結果と分析：重要度の浮上と精度の乖離</h3>
<p>リーダーボードの結果は <b>0.79985</b>。惜しくも0.8を下回る結果となりました。 一方で、コンソールの Importance には明らかな変化が現れました。</p>
<pre style="border: 1px solid #ddd; padding: 15px; background-color: #eef2f7; color: #2c3e50; overflow-x: auto; font-family: Consolas, Monaco, 'Courier New', monospace; line-height: 1.5; border-left: 5px solid #3498db;"> 特徴量寄与度 (Importance)
...
13. Cabin_Deck_F         : 55
14. Cabin_Deck_U         : 54
15. GroupCategory_Small  : 24 (New!)
</pre>
<p>前回は圏外だったグループ関連の指標が、上位15項目に食い込んできました。 モデルが「2〜4人組であること」を判断の一助にしたことは確かです。 しかし、スコアが下がった理由は、カテゴリ化したことで「5人組」や「8人組」といった細かな人数の違いによる情報の解像度が失われ、予測がマイルドになりすぎたことにあると考えられます。</p>
<h3 style="color: blue;">4. 結論</h3>
<p>特徴量を「意味のある塊」にまとめる手法は、重要度を上げるのには有効でしたが、今回のような複雑なデータセットでは、生の数値が持っていた細かなニュアンスも重要だったようです。 次は、この「人数の意味」を消さずに、さらに情報の密度を高めるアプローチ（グループ内の他者の状態など）への転換が必要です。</p>
<hr />
<p>一歩下がって、データの解像度を見直す。スコアの変動は、モデルからのフィードバックに他ならない。<br />
<br />
<br />
<br />
<br />
</p>]]> 
    </content>
    <author>
            <name>吟遊詩人</name>
        </author>
  </entry>
  <entry>
    <id>learnms.blog.shinobi.jp://entry/102</id>
    <link rel="alternate" type="text/html" href="http://learnms.blog.shinobi.jp/Entry/102/" />
    <published>2026-04-29T08:21:52+09:00</published> 
    <updated>2026-04-29T08:21:52+09:00</updated> 
    <category term="DS検定＞1. データサイエンス＞1-4. 応用技術＞1-4-2. 言語モデル" label="DS検定＞1. データサイエンス＞1-4. 応用技術＞1-4-2. 言語モデル" />
    <title>【DS検定対策】文章の「生成プロセス」を逆算！トピックモデルの正体</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<p>大量のテキストデータから「何が語られているか」を自動で抽出するトピックモデル。実はこれ、AIが文章を書き上げる「生成プロセス」をシミュレーションしているんです。</p>
<h3 style="color: blue;">1. 【 問題 】</h3>
<p>トピックモデル（特に代表的なLDA）の考え方として、最も適切なものはどれでしょうか？</p>
<p>① 単語の意味を多次元のベクトルとして表現し、単語間の距離を計算する手法<br />
② 構文木を作成して、文章の文法的な構造を解析する手法<br />
③ 文章は「潜在的なトピック」から確率的に単語が選ばれて生成されると仮定し、そのトピックを推定する手法<br />
④ 過去の単語から次の単語を順番に予測して、新しい文章を書き起こす手法</p>
<hr />
<h3 style="color: #d32f2f;">2. 【 解答 】</h3>
<div style="background-color: #eeeeee; border: 2px solid #333; padding: 15px; font-size: 1.2em; font-weight: bold; text-align: center;">正解： ③ 文章は「潜在的なトピック」から確率的に単語が選ばれて生成されると仮定し、そのトピックを推定する手法</div>
<hr />
<h3 style="color: blue;">3. 整理：AIが文章を作る「想像上の手順」</h3>
<p>トピックモデルは、以下のステップで文章が作られるという「確率的な生成モデル」を想定しています。</p>
<p>【 生成の仕組み（仮定） 】</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6;">[ STEP 1 ]<br />
この文書には「政治」が60%、「経済」が40%含まれる、と決める。<br />
<br />
[ STEP 2 ]<br />
「政治」トピックからは「選挙」「議会」などの単語を確率的に選ぶ。<br />
<br />
[ STEP 3 ]<br />
「経済」トピックからは「円安」「株価」などの単語を確率的に選ぶ。<br />
<br />
<b>★ トピックモデルの仕事：</b><br />
実際に並んでいる単語を見て、「この単語の組み合わせなら、トピックの比率はこうだったはずだ！」と<b>逆算（推定）</b>します。<br />
<br />
--------------------------<br />
<br />
◎ <b>特徴： 単語の並び順は考慮しない「Bag-of-Words」という考え方がベースになっています。</b></div>
<h3 style="color: blue;">4. DS検定で問われる「LDA」とは？</h3>
<p>1. <b>潜在的ディリクレ配分法 (LDA)</b>: 最も代表的な手法です。1つの文書に複数のトピックが混ざっていることを許容します。<br />
2. <b>非教師あり学習</b>: 人間が事前に「これは政治の記事」とラベルを貼らなくても、AIが勝手に単語の偏りからトピックを見つけ出します。<br />
3. <b>活用シーン</b>: 膨大なニュースの分類、コールセンターのログ解析、商品レビューの傾向把握などに使われます。</p>
<hr />
<h3 style="color: orange;">5. DS検定形式：実戦4択クイズ</h3>
<p><b>問：トピックモデルの一つであるLDA（潜在的ディリクレ配分法）において、単語の出現確率を制御するために用いられる確率分布はどれか。</b></p>
<p>① 正規分布 &nbsp; ② 二項分布 &nbsp; ③ ディリクレ分布 &nbsp; ④ ポアソン分布</p>
<p><b>【 正解： ③ 】</b></p>
<p><b>解説：</b> 手法の名前（Latent <b>Dirichlet</b> Allocation）にある通り、ディリクレ分布が使われます。DS検定では「LDA ＝ ディリクレ分布 ＝ トピックモデル」という紐付けが非常に重要です。</p>
<hr />
<h3 style="color: blue;">6. まとめ</h3>
<p>DS検定において「潜在的なトピック」「単語の生成確率」という言葉が出たら「トピックモデル」です。文章を単なる単語の袋（Bag-of-Words）として捉え、その背後にあるテーマをあぶり出す強力なツールとして覚えておきましょう！</p>]]> 
    </content>
    <author>
            <name>吟遊詩人</name>
        </author>
  </entry>
  <entry>
    <id>learnms.blog.shinobi.jp://entry/100</id>
    <link rel="alternate" type="text/html" href="http://learnms.blog.shinobi.jp/Entry/100/" />
    <published>2026-04-29T06:00:54+09:00</published> 
    <updated>2026-04-29T06:00:54+09:00</updated> 
    <category term="DS検定＞1. データサイエンス＞1-3. 機械学習＞1-3-1. 学習モデル" label="DS検定＞1. データサイエンス＞1-3. 機械学習＞1-3-1. 学習モデル" />
    <title>【DS検定対策】生成AIの心臓部！「拡散モデル」の仕組みを攻略</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<p>画像生成AIの急速な発展を支えているのが「拡散モデル」です。一見すると複雑ですが、その基本原理は「壊して、直す」というシンプルなプロセスの繰り返しにあります。</p>
<h3 style="color: blue;">1. 問題：拡散モデルの生成プロセス</h3>
<p><b>【 問題 】</b> 拡散モデル（Diffusion Model）が新しい画像を生成する仕組みとして、最も適切な説明はどれでしょうか？</p>
<p>① 大量の画像をパズルのように切り貼りして合成する &nbsp; <br />
② 入力された「完全なノイズ」から、学習した知識を用いて段階的にノイズを取り除き、データを復元する &nbsp; <br />
③ 既存の画像の色や形をランダムに変化させて別の画像を作る &nbsp; <br />
④ 画像を一度テキストに変換し、それを再度画像に描き直す</p>
<p><b>【 正解： ② 】</b></p>
<h3 style="color: blue;">2. 整理：拡散モデルの「学習」と「生成」</h3>
<p>拡散モデルの最大の特徴は、ノイズを「敵」ではなく、データを理解するための「ヒント」として活用する点にあります。</p>
<p>【 世界の切り出し 】</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6;">[ ステップ1：学習（壊して学ぶ） ]<br />
・元のデータに少しずつ<b>ノイズを加えていく</b>。<br />
・AIは「どの程度のノイズが加わったか（ノイズの成分）」を予測するように訓練される。<br />
・これにより、AIは「データの戻し方」を習得する。<br />
<br />
[ ステップ2：生成（無から生み出す） ]<br />
・AIに<b>「完全なノイズ（砂嵐のようなデータ）」</b>を渡す。<br />
・学習した知識を使い、ノイズを少しずつ除去していく。<br />
・最終的に、元の学習データには存在しない、<b>新しい出力</b>が得られる。<br />
<br />
★ <b>結論：ノイズ除去のプロが、無から有を生む</b><br />
<br />
--------------------------<br />
<br />
◎ <b>活用例： Stable Diffusion, Midjourney などの画像生成</b></div>
<h3 style="color: blue;">3. 解説プロセス</h3>
<p>1. <b>学習段階</b>: 綺麗な写真にわざと霧（ノイズ）をかけていき、その霧の晴らし方をAIに徹底的に教え込みます。<br />
2. <b>生成段階</b>: 霧しかない状態から、AIが「ここにはこんな形があるはずだ」と霧を晴らしていくことで、新しい絵が浮かび上がります。<br />
3. <b>答えを出す</b>: 拡散モデルの本質は「ノイズからの復元」による生成なので、 <b>②</b> が正解です。</p>
<hr />
<h3 style="color: orange;">4. DS検定形式：実戦4択クイズ</h3>
<p><b>問：拡散モデルにおいて、学習データにノイズを付加していく過程を何と呼ぶか。</b></p>
<p>① 逆拡散過程（リバース過程） &nbsp; ② 順拡散過程（フォワード過程） &nbsp; ③ 潜在変数変換 &nbsp; ④ 敵対的生成</p>
<p><b>【 正解： ② 】</b></p>
<p><b>解説：</b> 元のデータからノイズを増やして壊していく方向を「順拡散過程（フォワード過程）」、逆にノイズからデータを取り出していく生成の方向を「逆拡散過程（リバース過程）」と呼びます。この2つのプロセスをセットで覚えるのがポイントです。</p>
<hr />
<h3 style="color: blue;">5. まとめ</h3>
<p>拡散モデルは、「ノイズを予測する」というシンプルなタスクを積み重ねることで、驚くほど高精細な画像を生成します。DS検定においても、生成AIの代表的な手法として「ノイズの付加と除去」というキーワードをセットで押さえておきましょう！<br />
<br />
<br />
</p>]]> 
    </content>
    <author>
            <name>吟遊詩人</name>
        </author>
  </entry>
  <entry>
    <id>learnms.blog.shinobi.jp://entry/99</id>
    <link rel="alternate" type="text/html" href="http://learnms.blog.shinobi.jp/Entry/99/" />
    <published>2026-04-28T19:37:21+09:00</published> 
    <updated>2026-04-28T19:37:21+09:00</updated> 
    <category term="【Kaggle挑戦記】" label="【Kaggle挑戦記】" />
    <title>【Kaggle挑戦記】Spaceship Titanic 攻略 #13：IDに隠された「絆」を解く。グループ人数と転送率の意外な相関&lt;</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<h3 style="color: blue;">1. PassengerId の仕様から「集団」を定義する</h3>
<p>これまで乗客一人ひとりのスペック（年齢や支出）に注目してきましたが、今回は視点を広げ、乗客が属する「グループ」に着目しました。<code>PassengerId</code> の前半4桁を抽出し、同じIDを持つメンバーの数をカウント。新特徴量 <b>GroupSize</b> としてモデルに投入しました。</p>
<h3 style="color: blue;">2. 【実装】グループ解析機能付き・フルソースコード</h3>
<p>支出の論理補完、Cabinの物理分解、そして今回のグループサイズ抽出を統合したコードです。最後に、データの裏側を暴くための分析ログを出力するように設計しています。</p>
<pre style="border: 1px solid #ccc; padding: 15px; background-color: #f4f4f4; overflow-x: auto; font-family: Consolas, Monaco, 'Courier New', monospace; line-height: 1.5; font-size: 13px; color: #333;">import pandas as pd
import numpy as np
import lightgbm as lgb

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

# グループサイズを正確に測るため全データを結合
all_df = pd.concat([train, test], axis=0)
all_groups = all_df['PassengerId'].apply(lambda x: x.split('_')[0]).value_counts()

# 2. 特徴量エンジニアリング
spend_cols = ["RoomService", "FoodCourt", "ShoppingMall", "Spa", "VRDeck"]

for df in [train, test]:
    # --- A. 支出の論理補完 ---
    df[spend_cols] = df[spend_cols].fillna(0)
    total_spend = df[spend_cols].sum(axis=1)
    df.loc[(df['CryoSleep'].isnull()) &amp; (total_spend &gt; 0), 'CryoSleep'] = False
    df.loc[(df['CryoSleep'].isnull()) &amp; (total_spend == 0), 'CryoSleep'] = True
    df['Age'] = df['Age'].fillna(df['Age'].median())

    # --- B. Cabinの物理分解 ---
    df['Cabin'] = df['Cabin'].fillna('U/U/U')
    df['Cabin_Deck'] = df['Cabin'].apply(lambda x: x.split('/')[0])
    df['Cabin_Side'] = df['Cabin'].apply(lambda x: x.split('/')[-1])

    # --- C. GroupSize（グループ人数）の抽出 ---
    df['Group_ID'] = df['PassengerId'].apply(lambda x: x.split('_')[0])
    df['GroupSize'] = df['Group_ID'].map(all_groups)

# 3. 学習の準備
features = ["CryoSleep", "Age", "RoomService", "FoodCourt", "ShoppingMall", "Spa", "VRDeck", "Cabin_Deck", "Cabin_Side", "GroupSize"]
X = pd.get_dummies(train[features], drop_first=True)
y = train["Transported"].astype(int)
X_test = pd.get_dummies(test[features], drop_first=True)
X, X_test = X.align(X_test, join='left', axis=1, fill_value=0)

# 4. モデル学習
model = lgb.LGBMClassifier(n_estimators=100, learning_rate=0.05, random_state=1)
model.fit(X, y)

# 5. 予測と保存
predictions = model.predict(X_test)
output = pd.DataFrame({'PassengerId': test['PassengerId'], 'Transported': predictions.astype(bool)})
output.to_csv('sub_v13_groupsize.csv', index=False)

# 6. 分析ログの出力
print("\n グループサイズ別 統計データ")
analysis = train.copy()
analysis['GroupSize'] = analysis['PassengerId'].apply(lambda x: x.split('_')[0]).map(all_groups)
summary = analysis.groupby('GroupSize')['Transported'].mean()
for size, rate in summary.items():
    print(f"グループ人数 {int(size)}人 : 転送率 {rate:.2%}")

print("\n 特徴量寄与度 (Importance)")
importances = pd.DataFrame({'Feature': X.columns, 'Importance': model.feature_importances_}).sort_values(by='Importance', ascending=False)
print(importances.head(15)) # 傾向把握のため上位15件を表示
</pre>
<h3 style="color: blue;">3. 結果と考察：データが語る「家族の運命」</h3>
<p>リーダーボードの結果は <b>0.80243</b>。前回のベストスコア（0.80406）には一歩届きませんでしたが、コンソールが出力した統計データには驚くべき事実が隠されていました。</p>
<pre style="border: 1px solid #ddd; padding: 15px; background-color: #eef2f7; color: #2c3e50; overflow-x: auto; font-family: Consolas, Monaco, 'Courier New', monospace; line-height: 1.5; border-left: 5px solid #3498db;"> グループサイズ別 統計データ
グループ人数 1人 : 転送率 45.24%
グループ人数 2人 : 転送率 53.80%
グループ人数 3人 : 転送率 59.31%
グループ人数 4人 : 転送率 64.08%
グループ人数 8人 : 転送率 39.42%
</pre>
<p>1人旅の転送率が約45%なのに対し、4人家族（グループ）では64.08%と跳ね上がっています。一方で、8人の大家族になると39.42%まで急落します。「中規模な家族ほど、何らかの理由で揃って異次元へ転送されやすかった」というドラマチックな偏りが見て取れます。</p>
<h3 style="color: blue;">4. Importanceが示す「支出データの壁」</h3>
<p>スコアが伸び悩んだ理由は、モデルが弾き出した <b>Importance（重要度）</b> の数値に如実に表れていました。</p>
<pre style="border: 1px solid #ddd; padding: 15px; background-color: #f9f9f9; color: #333; overflow-x: auto; font-family: Consolas, Monaco, 'Courier New', monospace; line-height: 1.5;"> 特徴量寄与度 (Importance)
1. Spa           : 436
2. VRDeck        : 429
3. FoodCourt     : 414
4. Age           : 375
...
10. Cabin_Deck_E : 89
(GroupSize は圏外)
</pre>
<p>上位を占めるのは依然として <b>Spa, VRDeck, FoodCourt</b> といった「個人の状態」を示す支出データです。今回投入した <code>GroupSize</code> は、統計的な傾向（4人組は危ない、など）こそあるものの、LightGBMが「Spaに金を使っているかどうか」以上に優先すべき判断基準とは見なさなかったようです。</p>
<h3 style="color: blue;">5. まとめ：0.8突破のその先にある「壁」</h3>
<p>今回の実験で、宇宙船内の「社会的な繋がり」が運命を左右している確証は得られました。しかし、単なる「人数」という数字だけでは、支出データが持つ圧倒的な情報量には勝てないことも浮き彫りになりました。</p>
<p>「傾向はあるが、決め手にならない」。このジレンマを解消するには、次は単なる人数だけでなく、グループ内での「全員寝ていたか？」「全員同じデッキか？」といった、より深い関係性の抽出――つまり、集団としての「文脈」をさらに深掘りする必要がありそうです。</p>]]> 
    </content>
    <author>
            <name>吟遊詩人</name>
        </author>
  </entry>
  <entry>
    <id>learnms.blog.shinobi.jp://entry/96</id>
    <link rel="alternate" type="text/html" href="http://learnms.blog.shinobi.jp/Entry/96/" />
    <published>2026-04-27T06:17:55+09:00</published> 
    <updated>2026-04-27T06:17:55+09:00</updated> 
    <category term="【Kaggle挑戦記】" label="【Kaggle挑戦記】" />
    <title>【Kaggle挑戦記】Spaceship Titanic 攻略 #12：最強タッグ「LGBM × XGBoost」結成。しかし、正解は一つとは限らない</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<h3 style="color: blue;">1. 次なる一手：二大巨頭のアンサンブル</h3>
<p>前回、物理情報「Cabin」の導入により、ついに 0.80406 という大台を突破しました。 さらなる高みを目指し、今回は Kaggle の定石である<b>「アンサンブル（学習器の平均化）」</b>に挑戦します。 単独で高スコアを出した鋭い LightGBM に、手堅い XGBoost を組み合わせることで、予測の「揺らぎ」を抑え、さらなる精度向上を狙いました。</p>
<h3 style="color: blue;">2. 【実装】アンサンブル・ハイブリッドモデル全文</h3>
<p>性格の違う2つのAIに「確率」を出させ、その平均をとる合議制ロジックです。Macのターミナルで実行した、今回のフルコードを公開します。</p>
<pre style="border: 1px solid #ccc; padding: 15px; background-color: #f4f4f4; overflow-x: auto; font-family: Consolas, Monaco, 'Courier New', monospace; line-height: 1.5; font-size: 13px; color: #333;">import pandas as pd
import numpy as np
import lightgbm as lgb
import xgboost as xgb

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

# 2. 特徴量エンジニアリング（最高スコア時のロジックを継承）
spend_cols = ["RoomService", "FoodCourt", "ShoppingMall", "Spa", "VRDeck"]

for df in [train, test]:
    # 支出の論理補完
    df[spend_cols] = df[spend_cols].fillna(0)
    total_spend = df[spend_cols].sum(axis=1)
    df.loc[(df['CryoSleep'].isnull()) &amp; (total_spend &gt; 0), 'CryoSleep'] = False
    df.loc[(df['CryoSleep'].isnull()) &amp; (total_spend == 0), 'CryoSleep'] = True
    df['Age'] = df['Age'].fillna(df['Age'].median())

    # Cabinの分解（物理情報の追加）
    df['Cabin'] = df['Cabin'].fillna('U/U/U')
    df['Cabin_Deck'] = df['Cabin'].apply(lambda x: x.split('/')[0])
    df['Cabin_Side'] = df['Cabin'].apply(lambda x: x.split('/')[-1])

# 3. 特徴量の選定と整形
features = ["CryoSleep", "Age", "RoomService", "FoodCourt", "ShoppingMall", "Spa", "VRDeck", "Cabin_Deck", "Cabin_Side"]
X = pd.get_dummies(train[features], drop_first=True)
y = train["Transported"].astype(int)
X_test = pd.get_dummies(test[features], drop_first=True)
X, X_test = X.align(X_test, join='left', axis=1, fill_value=0)

# 4. モデル1：LightGBM の学習と確率予測
model_lgb = lgb.LGBMClassifier(n_estimators=100, learning_rate=0.05, random_state=1)
model_lgb.fit(X, y)
prob_lgb = model_lgb.predict_proba(X_test)[:, 1]

# 5. モデル2：XGBoost の学習と確率予測
model_xgb = xgb.XGBClassifier(n_estimators=100, learning_rate=0.05, max_depth=6, random_state=1)
model_xgb.fit(X, y)
prob_xgb = model_xgb.predict_proba(X_test)[:, 1]

# 6. アンサンブル（二人の予測確率を平均する）
final_prob = (prob_lgb + prob_xgb) / 2

# 7. 最終判定（0.5を閾値とする）
final_predictions = (final_prob &gt;= 0.5)

# 8. 保存
output = pd.DataFrame({'PassengerId': test['PassengerId'], 'Transported': final_predictions.astype(bool)})
output.to_csv('sub_v12_ensemble.csv', index=False)
</pre>
<h3 style="color: blue;">3. コンソールが示した「完璧な調和」</h3>
<p>実行後、コンソールに出力された数字は驚くほど均衡が取れていました。</p>
<pre style="border: 1px solid #ddd; padding: 15px; background-color: #eef2f7; color: #2c3e50; overflow-x: auto; font-family: Consolas, Monaco, 'Courier New', monospace; line-height: 1.5; border-left: 5px solid #3498db;"> Ensemble Complete!
LGBM Mean Prob: 0.5029
XGB Mean Prob: 0.5039
</pre>
<p>学習データの正解割合 0.5036 に対して、両モデルとも極めて近い数値を算出。二つのAIが、どちらもデータの全体像（分布）を正確に捉えていたことがわかります。</p>
<h3 style="color: blue;">4. 結果と考察：安定を選んだ代償</h3>
<p>リーダーボードの結果は <b>0.80360</b>。前回（0.80406）からわずか 0.00046 の微減となりました。 なぜ「最強の二人」を混ぜたのに下がったのか？ここにはエンジニアリングの面白い側面があります。</p>
<ul>
<li><b>「尖った正解」がマイルドになった：</b> LightGBMがギリギリの判断で正解していた難問を、XGBoostの慎重な判断が打ち消してしまった可能性があります。</li>
<li><b>汎化性能の向上：</b> スコアは僅かに下がりましたが、平均確率が安定したことで、未知のデータに対して「大外し」しにくい、より頑健なモデルになったと言えます。</li>
</ul>
<h3 style="color: blue;">5. まとめ：次なるフロンティアへ</h3>
<p></p>
<p>「混ぜれば上がる」という神話を、自分のコードで検証した今回の実験。 0.8台を安定して出せるようになったことは大きな前進です。現在の特徴量においてアンサンブルが「安定」に寄ったということは、さらなるスコアアップには<b>「新たな特徴量」</b>が必要であるというサインでもあります。</p>
<hr />
<p>次は、もう一つの物理情報、<b>「グループ（PassengerId）」</b>の解析に切り込み、さらなる高みを目指します。<br />
<br />
</p>]]> 
    </content>
    <author>
            <name>吟遊詩人</name>
        </author>
  </entry>
  <entry>
    <id>learnms.blog.shinobi.jp://entry/92</id>
    <link rel="alternate" type="text/html" href="http://learnms.blog.shinobi.jp/Entry/92/" />
    <published>2026-04-26T21:05:08+09:00</published> 
    <updated>2026-04-26T21:05:08+09:00</updated> 
    <category term="【Kaggle挑戦記】" label="【Kaggle挑戦記】" />
    <title>【Kaggle挑戦記】Spaceship Titanic 攻略 #11：ついに0.8突破！物理情報「Cabin」の導入が運命の分かれ道となった</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<h3 style="color: blue;">1. 前回の敗北から原点回帰へ</h3>
<p>前回、統計的な分布調整による「閾値最適化」に挑みましたが、結果は 0.79003 へのダウン。 エンジニアとしての仮説「学習データとテストデータの分布は同じはず」は間違っていないと確信しつつも、AIに与える「判断材料（特徴量）」そのものを強化する必要性を痛感しました。 そこで今回、満を持して投入したのが、船内の物理的な位置を示す <b>Cabin（客室番号）</b> です。</p>
<h3 style="color: blue;">2. 実装：ドメイン知識と物理情報の融合</h3>
<p>これまでの最高得点（0.79611）を出した「支出データからの睡眠状態逆算」というドメイン知識に基づく論理補完に、Cabinからパースした「Deck（デッキ）」と「Side（右舷・左舷）」を掛け合わせました。 Macのターミナルで実行した、今回の決定版コードがこちらです。</p>
<pre style="border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; overflow-x: auto; font-family: Consolas, Monaco, 'Courier New', monospace; line-height: 1.5; font-size: 13px;">import pandas as pd
import numpy as np
import lightgbm as lgb

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

# 2. 特徴量エンジニアリング（論理補完 ＆ Cabin分解）
spend_cols = ["RoomService", "FoodCourt", "ShoppingMall", "Spa", "VRDeck"]

for df in [train, test]:
    # --- A. 支出実績から CryoSleep を論理的に推論 ---
    df[spend_cols] = df[spend_cols].fillna(0)
    total_spend = df[spend_cols].sum(axis=1)
    
    # 支出があれば起きている(False)、なければ寝ている(True)
    df.loc[(df['CryoSleep'].isnull()) &amp; (total_spend &gt; 0), 'CryoSleep'] = False
    df.loc[(df['CryoSleep'].isnull()) &amp; (total_spend == 0), 'CryoSleep'] = True
    
    # 年齢の欠損値を中央値で補完
    df['Age'] = df['Age'].fillna(df['Age'].median())

    # --- B. Cabin（客室）を Deck/Num/Side に分解 ---
    df['Cabin'] = df['Cabin'].fillna('U/U/U')
    df['Cabin_Deck'] = df['Cabin'].apply(lambda x: x.split('/')[0])
    df['Cabin_Side'] = df['Cabin'].apply(lambda x: x.split('/')[-1])

# 3. 学習に使用する特徴量の選定
features = [
    "CryoSleep", "Age", "RoomService", "FoodCourt", 
    "ShoppingMall", "Spa", "VRDeck", "Cabin_Deck", "Cabin_Side"
]

# 4. データの整形（ダミー変数化）
X = pd.get_dummies(train[features], drop_first=True)
y = train["Transported"].astype(int)
X_test = pd.get_dummies(test[features], drop_first=True)

# 列の整合性を整える
X, X_test = X.align(X_test, join='left', axis=1, fill_value=0)

# 5. モデル学習（LightGBM）
model = lgb.LGBMClassifier(
    n_estimators=100, 
    learning_rate=0.05, 
    random_state=1
)
model.fit(X, y)

# 6. 予測と提出ファイルの出力
predictions = model.predict(X_test)
output = pd.DataFrame({
    'PassengerId': test['PassengerId'], 
    'Transported': predictions.astype(bool)
})
output.to_csv('submission_v11.csv', index=False)
</pre>
<h3 style="color: blue;">3. リーダーボードの結果：歓喜の瞬間</h3>
<p>Kaggleにファイルをアップロードし、リーダーボードが更新された瞬間、思わずガッツポーズが出ました。</p>
<pre style="border: 1px solid #dcdcdc; padding: 15px; background-color: #ffffff; color: #333333; overflow-x: auto; font-family: Consolas, Monaco, 'Courier New', monospace; line-height: 1.5; border-left: 5px solid #5cb85c;"> Previous Best : 0.79611
 New Score     : 0.80406 (0.8の壁を突破！)
</pre>
<h3 style="color: blue;">4. 考察：なぜ「Side」が効いたのか</h3>
<p>今回追加した「Cabin_Side（右舷・左舷）」は、事故の被害がどちらから来たかという物理的な衝突面をモデルに示唆しました。 「寝ていたか、起きていたか（状態）」&times;「船のどちら側にいたか（位置）」。 このミクロな情報の掛け合わせが、これまでのマクロな調整を凌駕し、ついに 0.80 の大台へと連れて行ってくれました。</p>
<hr />
<p>一つ一つの仮説を積み上げ、データで検証する。エンジニアとしての地道なアプローチが報われた瞬間でした。<br />
しかし、まだ上には上がいます。この勢いを止めることなく、さらなる高みを目指します。<br />
<br />
<br />
<br />
</p>]]> 
    </content>
    <author>
            <name>吟遊詩人</name>
        </author>
  </entry>
  <entry>
    <id>learnms.blog.shinobi.jp://entry/87</id>
    <link rel="alternate" type="text/html" href="http://learnms.blog.shinobi.jp/Entry/87/" />
    <published>2026-04-26T17:04:50+09:00</published> 
    <updated>2026-04-26T17:04:50+09:00</updated> 
    <category term="【Kaggle挑戦記】" label="【Kaggle挑戦記】" />
    <title>【Kaggle挑戦記】Spaceship Titanic 攻略 #10：統計的補正の罠。AIの「楽観」を抑えた結果、見えてきたもの</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<h3 style="color: blue;">1. 独自の仮説：分布不変の原則</h3>
<p>LightGBMで 0.796 まで到達した今、次なる一手として<b>「学習データとテストデータの分布は同じはずだ」</b>という統計的な仮説を立てました。 AIが一律「0.5」という閾値で判断するなら、その結果としての True（転送された）の割合は、学習データの事実（50.36%）に一致すべき。もしズレているなら、閾値を動かして矯正すべきではないか、と考えたのです。</p>
<h3 style="color: blue;">2. 実装と、Macのターミナルが示した驚愕の数字</h3>
<p>AIに「確率」を出させ、上位50.36%だけを True と判定するように閾値を調整したところ、コンソールには衝撃的なログが流れました。</p>
<pre style="border: 1px solid #dcdcdc; padding: 15px; background-color: #ffffff; color: #333333; overflow-x: auto; font-family: Consolas, Monaco, 'Courier New', monospace; line-height: 1.5; border-left: 5px solid #5bc0de;"> 学習データの True 割合 (目標): 0.5036
...
[LightGBM] [Info] [binary:BoostFromScore]: pavg=0.503624 -&gt; initscore=0.014495
⚙️ 算出された最適な閾値: 0.5950
   (デフォルトの 0.5 から +0.0950 調整されました)
------------------------------
 調整後の予測 True 割合: 0.5036 (目標との差: 0.0000)
</pre>
<p>なんと、AI（LightGBM）をそのまま信じると、True の割合が統計的予測を大きく上回ってしまっていたのです。私は判定ラインを約10%引き上げ、<b>0.5950</b> という厳しい基準で「選別」を行いました。</p>
<h3 style="color: blue;">3. リーダーボードの結果：無情な 0.79003</h3>
<p>結果は、自己ベスト更新ならず。</p>
<pre style="border: 1px solid #dcdcdc; padding: 15px; background-color: #ffffff; color: #333333; overflow-x: auto; font-family: Consolas, Monaco, 'Courier New', monospace; line-height: 1.5; border-left: 5px solid #d9534f;"> Current Best (LightGBM) : 0.79611
 Ratio Adjusted Result    : 0.79003 (▼ 0.00608)
</pre>
<p>あえて統計に寄せた判断が、スコアを落とす結果となりました。</p>
<h3 style="color: blue;">4. 考察：なぜ「正論」が通じなかったのか？</h3>
<p>エンジニアとして、この結果から2つの教訓を得ました。</p>
<ul>
<li><b>テストデータの分布差：</b> 「学習用」と「テスト用」のデータ分布は、必ずしも完全一致するとは限らない。今回の事故では、テストデータ側の転送率は 50.36% より高かった可能性があります。</li>
<li><b>確率は「相対的」なもの：</b> AIが出す確率は「確信度」であって、絶対的な数値ではない。AIが 0.6 と言っても、それは「0.5の人よりは可能性が高い」という順位付けには有効ですが、その数値そのものを統計に当てはめるのは時期尚早だったのかもしれません。</li>
</ul>
<h3 style="color: blue;">5. それでも、方向性は間違っていない</h3>
<p>「0.5」というデフォルト設定を疑い、マクロな視点で補正を試みたことは、今後の複雑なコンペティションにおいて必ず活きる経験です。 AIに盲従せず、エンジニアとしての仮説をぶつけ、その反応をデータで確認する。 この試行錯誤こそが、0.8 への唯一の道。次はいよいよ、物理情報である<b>「Cabin（客室）」</b>のパースに挑みます。<br />
<br />
<br />
</p>
<hr />
<p>データは正直だ。そして、だからこそ面白い。<br />
<br />
</p>]]> 
    </content>
    <author>
            <name>吟遊詩人</name>
        </author>
  </entry>
  <entry>
    <id>learnms.blog.shinobi.jp://entry/84</id>
    <link rel="alternate" type="text/html" href="http://learnms.blog.shinobi.jp/Entry/84/" />
    <published>2026-04-26T11:32:42+09:00</published> 
    <updated>2026-04-26T11:32:42+09:00</updated> 
    <category term="DS検定＞1. データサイエンス ＞1-1. 数理基礎・統計学 ＞1-1-2. 統計数理" label="DS検定＞1. データサイエンス ＞1-1. 数理基礎・統計学 ＞1-1-2. 統計数理" />
    <title>【Kaggle挑戦記】Spaceship Titanic 攻略 #9：最強の刺客 XGBoost 投入。しかし、LightGBM の牙城は崩せず</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<h3 style="color: blue;">1. 今回の挑戦：勾配ブースティングの「二大巨頭」対決</h3>
<p>LightGBMで <b>0.79611</b> という自己ベストを更新した前回。次なる一手として、Kaggleで不動の人気を誇るもう一つの最強エンジン、<b>XGBoost</b> を投入しました。 同じ「勾配ブースティング」という系譜に属しながら、計算の進め方（木の育て方）が異なるこの2つのアルゴリズム。どちらが今回の宇宙船タイタニックのデータと相性が良いのか、真剣勝負です。</p>
<h3 style="color: blue;">2. 【実装】XGBoost 換装モデル</h3>
<p>Macのターミナルで <code>pip install xgboost</code> を実行し、環境を構築。最高スコア時の前処理ロジックはそのままに、学習器だけを差し替えました。</p>
<pre style="border: 1px solid #ccc; padding: 10px; background-color: #f9f9f9; overflow-x: auto; font-family: Consolas, Monaco, 'Courier New', monospace; line-height: 1.5;">import xgboost as xgb

# 特徴量と前処理は最高スコア時を継承
model = xgb.XGBClassifier(
    n_estimators=100,
    learning_rate=0.05,
    max_depth=6,
    random_state=1,
    use_label_encoder=False,
    eval_metric='logloss'
)

model.fit(X, y)
# 予測結果を sub_xgboost_v1.csv として出力
</pre>
<h3 style="color: blue;">3. 実行結果：LightGBM の底力</h3>
<p>期待を込めて提出した結果、リーダーボードに刻まれた数字は意外なものでした。</p>
<pre style="border: 1px solid #dcdcdc; padding: 15px; background-color: #ffffff; color: #333333; overflow-x: auto; font-family: Consolas, Monaco, 'Courier New', monospace; line-height: 1.5; border-left: 5px solid #d9534f;"> LightGBM (Current Best) : 0.79611
 XGBoost (New Trial)    : 0.79448 (▼ 0.00163)
</pre>
<p>わずかな差ではありますが、XGBoostは前回の記録に届かず。今回のデータセットにおいては、LightGBMの方が「急所（重要な分岐）」をより的確に捉えていたようです。</p>
<h3 style="color: blue;">4. 考察：なぜ「同じ手法」で差が出たのか？</h3>
<p>どちらも「勾配ブースティング」ですが、その違いが結果に現れました。</p>
<ul>
<li><b>木の育て方の違い：</b> LightGBMは「誤差が大きい部分をピンポイントで掘り下げる（Leaf-wise）」のに対し、XGBoostは「層ごとにバランスよく育てる（Level-wise）」。今回のデータでは、LightGBMの尖った学習スタイルが有利に働いたと考えられます。</li>
<li><b>アルゴリズムの相性：</b> 特定の数値（支出額など）が重要な意味を持つこのコンペでは、LightGBMの高速で柔軟な分岐がフィットしたのでしょう。</li>
</ul>
<h3 style="color: blue;">5. 次なる一手：最強の「合体（アンサンブル）」へ</h3>
<p>XGBoostが負けたからといって、無駄だったわけではありません。エンジニアには<b>「アンサンブル（平均化）」</b>という必殺技が残されています。 LightGBMの予測とXGBoostの予測。性格の違う2つの知性を組み合わせることで、単体では届かなかった 0.8 の壁を突破できるかもしれません。</p>
<hr />
<p>失敗はデータの蓄積。次は「二人の知才」を一つに合わせて、大台を狙います。<br />
<br />
<br />
</p>]]> 
    </content>
    <author>
            <name>吟遊詩人</name>
        </author>
  </entry>
</feed>