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

【DS検定対策】似たもの同士を集める!「k平均法」のアルゴリズム

答え(ラベル)のないデータから、AIが自らグループを見つけ出す「クラスタリング」。その中でも最も基本的で強力な手法が「k平均法」です。

1. 【 問題 】

k平均法(k-means法)を用いて、データの集合をk個のクラスタに分割する際の手順や条件として、適切なものはどれでしょうか?

① 各標本(データ)は、全データの平均値に最も近いクラスタに属する。
② 各標本は、k個の重心のうち、自身から最も距離が近い重心のクラスタに属する。
③ データの数(n)をkで割った同数のグループをランダムに作成する。
④ 各標本は、あらかじめ決められた「正解ラベル」に最も近いクラスタに属する。


2. 【 解答 】

正解: ② 各標本は、k個の重心のうち、自身から最も距離が近い重心のクラスタに属する。

3. 整理:繰り返しで「重心」を最適化する

k平均法は、以下の「割り当て」と「更新」のステップを繰り返すことで、最適なグループ分けを完成させます。

【 k平均法のステップ 】

[ STEP 1 ]
ランダムにk個の「重心」を決める。

[ STEP 2:割り当て ]
★ 各データは、一番近い重心のチームに所属する。

[ STEP 3:更新 ]
各チームに所属したデータの「平均位置」を計算し、そこを新しい重心にする。

[ STEP 4:繰り返し ]
重心の位置が動かなくなるまでSTEP 2と3を繰り返す。

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

特徴: 「非教師あり学習」であるため、正解データなしでデータを分類できます。

4. 知っておくべきポイント

1. kの値は人間が決める: 最初に「いくつのグループに分けるか(k)」を人間が指定する必要があります。
2. 初期値に依存する: 最初にランダムに決める重心の位置によって、結果が変わってしまうことがあります。
3. エルボー法: 最適なk(グループ数)を決めるための代表的な手法です。


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

問:k平均法において、クラスタ内のデータと重心の距離の合計(誤差の二乗和)が最小になるように最適化が行われますが、この「距離」として一般的に用いられるものはどれか。

① ハミング距離   ② ユークリッド距離   ③ ジャッカード係数   ④ 編集距離

【 正解: ② 】

解説: 直線的な距離を測る「ユークリッド距離」を用いるのが標準的です。データ同士の幾何学的な近さを基準にグループ化を行います。


6. まとめ

DS検定において「重心」「最も近いクラスタに属する」「非教師あり学習」というキーワードが出たら「k平均法」です。マーケティングの顧客セグメンテーションなど、実務でも非常に使い勝手の良い手法なので、しっかり押さえておきましょう!

PR

【DS検定対策】AI学習の原点!「ヘップの学習則」とシナプスの絆

「共に火を噴くニューロンは、共に繋がる(Cells that fire together, wire together)」。この一文に集約されるヘップの学習則を学びましょう。

1. 【 問題 】

心理学者ドナルド・ヘップが提唱した、ニューラルネットワークの学習の基礎となる考え方で、「シナプスの前後の神経細胞が同時に興奮するとき、そのシナプスの結合強度が強化される」という法則を何と呼ぶでしょうか?

① ムーアの法則
② ヘップの学習則(ヘブ則)
③ スケーリング則
④ べき乗則


2. 【 解答 】

正解: ② ヘップの学習則(ヘブ則)

3. 整理:学習とは「重み」が変わること

ヘップの学習則は、1949年に脳の学習メカニズムを説明するために提案されました。これが現代のAIにおける「重みの更新」のヒントになっています。

【 ヘブ則のメカニズム 】

[ 神経細胞A ] --- (シナプス) ---> [ 神経細胞B ]

1. 細胞Aが興奮し、信号を送る。
2. 同時に細胞Bも興奮する。
3. ★「この二つの連携は重要だ!」と脳が判断。
4. 次回から、Aの信号がより強くBに伝わるようになる(結合の強化)。

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

現代AIへの応用:
パーセプトロンなどのニューラルネットワークにおいて、入力と出力が連動する際に「重み(Weight)」の値を大きくする処理の理論的な裏付けとなっています。

4. なぜこれが「パーセプトロン」の基礎なのか?

1. 重みの更新: ニューラルネットワークが学習するとは、まさにこの「シナプス結合の強さ(重み)」を調整する作業そのものです。
2. 自己組織化: 外部から正解を与えられなくても、頻繁に起きるパターンを自然と記憶する「自己組織化マップ」などのモデルにも影響を与えています。
3. 生物学的妥当性: 数学的なアルゴリズムが、実際の生物の脳の仕組みに近いという点が、この分野の大きな強みになっています。


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

問:ニューラルネットワークにおいて、入力信号と出力信号の相関に基づいて「重み」を調整するアルゴリズムの最も初期的な考え方はどれか。

① 誤差逆伝播法(バックプロパゲーション)
② ヘップの学習則
③ 勾配降下法
④ 正則化

【 正解: ② 】

解説: ①や③は後の時代に登場したより高度な手法ですが、その「根っこ」にあるのは「連動する部分を強くする」というヘップの考え方です。


6. まとめ

DS検定において「シナプス」「前後で同時に興奮」「結合の強化」というフレーズが出たら「ヘップの学習則」です。AIの歴史の1ページ目として、しっかり記憶に刻んでおきましょう!

【Kaggle挑戦記】S4E11 #1:メンタルヘルス予測コンペ参戦。LightGBMで「0.94」の初陣

次なるターゲットに選んだのはKaggle Playground Series S4E11。 実在のアンケート結果をベースにした「メンタルヘルス(うつ病)の予測」です。 実務的なデータ構造を相手に、まずは何も考えずLightGBMでベースラインを構築してみました。

1. コンペの概要:生体ログから「心の状態」をデバッグする

今回のミッションは、年齢、性別、仕事のストレス、睡眠時間、食事習慣といった多角的なデータから、 対象者がうつ病(Depression)の状態にあるかどうかを予測する2値分類です。

主要な特徴量エンジニア的解釈
Academic/Work Pressure システムの負荷状況(リソース逼迫度)
Sleep Duration / Dietary Habits メンテナンス(自己回復)のログ
Financial Stress 外部環境によるエラー因子

2. 実装:特徴量は「すべてぶっ込んだ」最短ルート

「どの項目が重要か?」を人間が考える前に、まずはマシンパワーに任せてみます。 今回はID以外の特徴量をすべてぶっ込み、カテゴリ変数はLightGBMのcategory型指定で一気に処理する、いわば「全件スキャン」的なアプローチをとりました。

通常なら除外するはずの「Name(名前)」のような文字列データも、モデルがどう解釈するかを見るためにあえて残しています。

import pandas as pd
import lightgbm as lgb
from sklearn.preprocessing import LabelEncoder

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

target_col = 'Depression'

# ターゲットの数値化
le = LabelEncoder()
train[target_col] = le.fit_transform(train[target_col])

# 特徴量は全投入(idのみ除外)
X = train.drop(['id', target_col], axis=1)
y = train[target_col]
X_test = test.drop(['id'], axis=1)

# カテゴリ型への一括変換
cat_cols = X.select_dtypes(include=['object']).columns.tolist()
for col in cat_cols:
    X[col] = X[col].astype('category')
    X_test[col] = X_test[col].astype('category')

# モデル構築(2値分類:Binary)
model = lgb.LGBMClassifier(objective='binary', random_state=42)
model.fit(X, y)

# 予測と提出ファイルの作成
submission = pd.DataFrame({
    'id': test['id'],
    target_col: model.predict(X_test)
})
submission.to_csv('submission.csv', index=False)

3. 結果と考察:見えてきた「データの罠」

初回のSubmit結果は以下の通りです。

Public Score: 0.94008 / Private Score: 0.93868

なかなかの高スコアですが、Feature Importance(重要度)を見るとデバッグすべき点が見つかりました。

--- Feature Importance Top 5 ---
1. Name              : 1308
2. City              : 223
3. Age               : 204
4. Financial Stress  : 174
5. Profession        : 159

「Name(名前)」が重要度のトップに君臨しています。 「全特徴量投入」の結果、モデルは名前に含まれる特定のパターン(あるいは個別のID的な性質)を、うつ病の判定材料として「暗記」してしまったようです。 これは典型的な過学習の予兆であり、システム開発で言えば「テストデータのみに通るハードコーディング」に近い状態かもしれません。

4. まとめと次回の課題

まずは「動くもの」を作り、0.94というベンチマークを得ることに成功しました。
次回は、この「Name」というノイズを除去した際にスコアがどう変化するか、そしてLog Lossを意識した確率予測のチューニングに挑みます。


【Kaggle挑戦記】House Prices #1:予測対象は「価格」。回帰モデルによる住宅見積もり

1. 新たな戦場:House Prices - Advanced Regression Techniques

Spaceship Titanicを終え、次に挑むのは「住宅価格予測」です。 アイオワ州エイムズにある住宅のスペックから、その販売価格(SalePrice)を予測します。 前回の「転送されたか否か(0/1)」の分類とは異なり、今回は具体的な数値を当てる「回帰(Regression)」問題に挑みます。

2. 「分類」と「回帰」の決定的な違い

エンジニアとして、まずは評価指標を頭に叩き込みます。出力型が根本から変わるため、デバッグの指標も切り替える必要があります。

  • ターゲット: Boolean(生存/死亡)から Float(住宅価格)へ。 「0か1か」のラベルではなく、連続的な数値を予測します。
  • 評価指標: RMSE(Root Mean Squared Error:平均平方二乗誤差)。 「何人当たったか」ではなく、予測価格と実際の価格の「ズレ(誤差)」を評価します。
  • モデル: LGBMClassifier ではなく、回帰専用の LGBMRegressor を使用します。

3. 設計思想:なぜ「最小二乗法」ではなく「決定木」なのか

回帰といえば「最小二乗法(線形回帰)」で一本の直線を引くイメージが強いですが、本攻略では現代的なLightGBM(決定木モデル)を採用します。

  • 伝統的な回帰(最小二乗法): 「面積が2倍なら価格も2倍」といった単純な比例関係に強いが、市場の複雑な歪みに弱い。
  • 現代的な回帰(LightGBM): 「築年数が古くても、リフォーム済みなら高値」といった、条件の組み合わせ(非線形な関係)を数千もの分岐でデバッグし、多角形的に価格を近似していきます。

住宅市場の「不連続な境界線(このエリアに入った瞬間に価格が跳ね上がる、など)」を捉えるには、決定木によるアプローチが極めて有効です。

4. 本アプローチの設計図

■ 今回使う特徴量(数値データに限定)

79個のカラムのうち、初回は「数値データ(int/float)」のみを抽出して投入します。 敷地面積(LotArea)、築年(YearBuilt)、1階の広さ(1stFlrSF)、バスルームの数(FullBath)などが含まれます。文字列(立地など)は一旦除外します。

■ 指標:二乗誤差の最小化

本コンペのゴールは、二乗誤差(の平均)を最小化することです。 誤差(予測 - 実測)を二乗することで、大きな予測ミスに対して指数関数的に厳しいペナルティを課し、モデルに「大外れを出すな」と教育します。 ※最終スコアは「対数をとった後のRMSE」になりますが、まずは生の数値で誤差を削ります。

5. 【初陣】回帰ベースライン・ソースコード

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. ターゲットの設定
y_train = train['SalePrice']
# 数値データのみを抽出し、IDとターゲットを除外
X_train = train.select_dtypes(include=[np.number]).drop(['Id', 'SalePrice'], axis=1)
X_test = test.select_dtypes(include=[np.number]).drop(['Id'], axis=1)

# 3. 欠損値の補完
# 回帰問題の初期デバッグとして中央値(median)で埋める
X_train = X_train.fillna(X_train.median())
X_test = X_test.fillna(X_test.median())

# 4. 回帰モデルの構築
# 二乗誤差の最小化(regression)を目的関数に設定
model = lgb.LGBMRegressor(
    objective='regression',
    n_estimators=1000, 
    learning_rate=0.05,
    random_state=1
)

# 5. 学習
model.fit(X_train, y_train)

# 6. 予測(出力は具体的なドル建て価格の配列)
predictions = model.predict(X_test)

# 7. 提出用ファイルの作成
output = pd.DataFrame({'Id': test['Id'], 'SalePrice': predictions})
output.to_csv('submission_v1_baseline.csv', index=False)

print("✅ LightGBM Regressor baseline trained.")
print(f"Sample Predictions: {predictions[:5]}")

6. 実行結果のデバッグ:スコア 0.14679 の意味

Macのターミナルに出力された結果を解読します。

[LightGBM] [Info] Start training from score 180921.195890
Sample Predictions: [124527.61, 154677.30, 183652.70, ...]
Score: 0.14679

この 0.14679 というスコアは、ざっくり言うと「平均して14〜15%程度の見積もり誤差がある」状態を指します。

  • 0.14〜0.15(現在): 数値データのみの「とりあえず動くシステム」。
  • 0.12付近: 文字列データ(カテゴリ変数)を適切に処理した「実用レベル」。
  • 0.10以下: 上位ランカー。高度な特徴量生成とアンサンブルが必要な「プロの仕事」。

文字列データを一切使わず、数値のみでこの数値が出たのは、かなり幸先の良いスタートと言えます。

7. まとめ:次なる一歩

数値データだけで土俵に立ちましたが、まだ以下の「伸び代」が残っています。

  1. 無視された文字列データ: 立地(Neighborhood)などの、価格に直結する重要な情報がまだ「コメントアウト」されている状態です。
  2. 価格の歪み: 100万ドルの家と10万ドルの家では、同じ1万ドルのミスでも意味が違います。これを比率で評価させる「対数変換」の導入が必要です。

一本の直線を引くのではなく、数千の分岐で見積もりを研ぎ澄ます。15%の誤差を削る、新たな戦いの始まり。


【DS検定対策】AIと外部システムを繋ぐ架け橋!「MCP (Model Context Protocol)」とは?

生成AIに「自社のデータベースを見せたい」「外部APIを叩かせたい」。そんなカスタマイズを、共通のルールで簡単に実現するのがMCPです。

1. 【 問題 】

Anthropic社が発表した、大規模言語モデル(LLM)と外部のデータソースやツール、他システムとの連携を共通化するためのオープンな標準プロトコルを何と呼ぶでしょうか?

① MCP (Model Context Protocol)
② RAG (Retrieval-Augmented Generation)
③ API (Application Programming Interface)
④ JSON-RPC Protocol


2. 【 解答 】

正解: ① MCP (Model Context Protocol)

3. 整理:AIに「手足」と「目」を与える共通規格

これまで、AIを外部システム(データベース、Slack、GitHubなど)と連携させるには、AIごとに個別の接続プログラムを書く必要がありました。MCPはここを「共通規格」で解決します。

【 MCPの役割イメージ 】

[ AIクライアント (Claudeなど) ]
  ↑ (MCP規格で通信)
[ MCPサーバー (中継役) ]
  ↑ (各システム独自の接続)
[ 外部データ・ツール ]
(Google Drive, ローカルDB, GitHubなど)

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

メリット: 一度MCPサーバーを作れば、異なるAIモデルやアプリから同じように外部データへアクセスできるようになります。

4. MCPでできること

1. コンテキストの提供: AIに自社の最新ドキュメントやデータベースの内容を、リアルタイムな「背景知識(コンテキスト)」として渡せます。
2. ツールの実行: AIに「このSQLを実行して結果をグラフにして」といった具体的な処理(アクション)を行わせることができます。
3. 他AIとの連携: 異なる役割を持つAI同士を連携させ、複雑なワークフローを自動化する土台になります。


5. エンジニア向け:実戦クイズ

問:MCPを導入することで、開発者が個別のAIモデル(GPTやClaudeなど)ごとに、外部データベース接続コードを書き直す手間が減る理由は何か。

① AIが自動的に全てのプログラムを書き換えるから。
② MCPがAIと外部リソース間の「共通インターフェース」として機能するから。
③ データベースの構造自体をAI専用のものに変換するから。
④ MCPを使うとインターネット経由の通信が不要になるから。

【 正解: ② 】

解説: MCPは、いわば「AI用のUSB規格」のようなものです。規格さえ合っていれば、接続先がどのAIであっても、同じサーバー(リソース)を利用できるため、開発の効率が劇的に向上します。


6. まとめ

最新のAI活用において「他システムとの連携」は避けて通れないテーマです。「Model Context Protocol (MCP)」という言葉を覚えておくと、AIを業務システムに組み込む際の強力な武器になります!