import os for d, _, files in os.walk("/kaggle/input"): for f in files: print(os.path.join(d, f))
Kaggle、
とりあえず1周してみる。
アカウント作成 → Notebookでデータに触る → Titanicコンペに初提出。3つの短いコースでKaggleの全体像をつかんだら、3つのボーナス編(野球・音楽・開催中のポケモンAI対戦)で一段深く。順に進めるだけで、Kaggleがどんな場所かの地図が頭に入ります。難しい理論は後回し、まず手を動かしましょう。
🏅 ゴール : Kaggleの称号ラダー
Kaggleには4分野(Competitions / Notebooks / Datasets / Discussions)ごとに称号があります。このラボは一番左「Novice」を卒業して「Contributor」に手が届くまでの地図です。
🧭 Kaggleを楽しむ・上達する 7つの考え方
テクニックより先に効く"心得"です。どのコースにも通底しているので、迷ったらここに戻ってきてください。
1行のルールでもいいから"提出を1周"。0点より0.5点。動く土台を先に。
公開Notebookを Copy&Edit → 動かす → 1箇所だけ変える。ゼロから書かない。
手元の検証スコアで判断。Public LBは一部だけ。順位に一喜一憂しない。
凝ったモデルより、良い特徴量と丁寧な前処理が効く。特に最初は。
大改造を一発より、小さな変更を何度も。1変更 = 1提出 = 1メモ。
Descriptionに「何をしてどうなったか」。未来の自分への手紙になる。
全部理解してから、ではなく、動かしながら分かる。手が先、理解は後。
Kaggleってどんな場所?
まだコードは書きません。「何ができるサイトなのか」「どこに何があるのか」を先に地図として頭に入れます。ここが分かると、この後の手を動かす作業が一気にラクになります。
そもそも、Kaggleって何?
ひとことで言うと、世界中の人が「同じデータ・同じ問題」に取り組んで、予測の良さを自動採点で競い合ったり学び合ったりできる場所です。2010年創業、2017年からGoogleの傘下。データサイエンス界では知らない人がいないほど定番の存在です。
なぜこんな場所が存在するの?
関わる三者それぞれに"うれしい"があるからです。
- 課題を出す側(企業・研究者) … 手元の難問とデータを公開すれば、世界中の頭脳が解きにきてくれる。優秀な人材も見つかる。
- 挑む側(あなた) … 教科書と違って本物のデータが手に入り、提出すればすぐ点数(答え合わせ)が返り、しかも上位者が解法を公開してくれる。独学の3大不足(データ・フィードバック・お手本)が全部そろう。
- コミュニティ全体 … みんなが解法を共有し合うので、界隈ぜんたいの実力が底上げされていく。
Kaggleは「1つのサイト」に見えて、実は5つの部屋がある
Kaggleを初めて開くと情報が多くて圧倒されますが、機能はざっくり5つに分けられます。これだけ覚えれば迷いません。
企業/研究者がお題とデータを出し、予測精度を競う本丸。賞金付きも。
誰でも公開・利用できるデータ置き場。巨大なオープンデータ倉庫。
ブラウザで動くJupyter。無料でGPU/TPUも使える作業場。
攻略法・質問・雑談の掲示板。上位者の知見が集まる宝庫。
Python/ML/SQLなどの無料ミニ講座。数時間で終わる実践型。
ゲームみたいに「ランク」が上がっていく
Kaggleのモチベの源が称号(Tier)です。Novice → Contributor → Expert → Master → Grandmaster の5段階があり、しかも Competitions / Notebooks / Datasets / Discussions の4分野それぞれ独立して進みます。
- Contributor になる条件はやさしく、「プロフィール入力・スクリプト実行・コンペ初提出・コメント投稿」など基本操作を一通りやるだけ。このラボのゴールがまさにここです。
- Expert 以上からは メダル(銅🥉/銀🥈/金🥇) が必要になります。メダルはコンペ順位・Notebookやコメントへの高評価(upvote)で獲得します。
実際に登録してみよう(5分)
ここは実際にブラウザで作業してください。
- kaggle.com を開き Register → Googleアカウント等で登録。
- プロフィールの表示名を設定(後で変えられます)。
- 電話番号認証(Phone Verify) を済ませておく。これで GPU/TPU・インターネット接続・Submit が解禁されます。Settings → Phone Verification から。これをやらないと後のコース2/3で詰まります。
済んだらチェック ✓
上部メニューだけ覚えれば迷子にならない
画面左上のメニューが5つの部屋の入り口です。最初に触るべき場所はここ:
- Competitions → 「Getting Started」タブ … 初心者向けの練習用コンペが並ぶ。Titanicはここ。
- Code(Notebooks) … 自分の作業場。「+ New Notebook」で始める。
- 公開Notebook … 他人の分析を読む・フォーク(コピー)して改造できる。最強の教材。
1問だけクイズ
Q.「Novice を卒業して Contributor になる」ために最も適切なのは?
コース1 修了 : 地図が頭に入った 🗺️
Kaggleの5つの部屋と称号ラダーが分かりました。次はいよいよ Notebook を開いて、本物のデータに触ります。
Notebookでデータに触れる
ここから手を動かします。Kaggle Notebook上でTitanicのデータを読み込み、中身を眺めて「どんなデータなのか」を感じ取ります。下のコードセルは ▶ Run で出力イメージが見られます。実際は同じコードをKaggle上で動かしてください。
Titanicチュートリアルのゴールは「418人の生死を当てて提出する」こと
Titanicは「タイタニック号の乗客名簿」を使った練習問題です。答えが載っている891人分のデータから「どんな人が助かったか」の法則を学び、答えが伏せられた418人について 1(生存) / 0(死亡) を予測して、CSVで提出する。提出すると正解率が返ってきて、順位表に自分の名前が載ります。ここまでが1周。モデルの賢さは後回しでOKです。
train.csv(891人・答えあり)を眺め、生死を分けた手がかりを見つける
← コース2
test.csv(418人・答えなし)の1人ずつに 1 か 0
を付ける ← コース3
配られる3つのファイルの意味
コンペページの Data タブに置かれているのはこの3つだけ。役割がまったく違うので、ここで押さえておくと迷いません。
| ファイル | 中身 | 大きさ | 役割(学校でいうと) |
|---|---|---|---|
| train.csv |
乗客の情報 + Survived列(答え) 名前・性別・年齢・客室クラス・運賃など |
891行 × 12列 |
答え付きの問題集 これを読んで法則を学ぶ |
| test.csv |
乗客の情報のみ (Survived列がない) train と同じ項目から答えの列だけ抜いたもの |
418行 × 11列 |
本番の試験問題 この418人の生死を当てる |
| gender_submission.csv |
PassengerId と Survived の2列だけ「女性は全員生存」と仮に埋めたサンプル |
418行 × 2列 |
解答用紙の見本 この形式に合わせて自分の予測を出す |
📋 中に入っている12個の列それぞれの意味は、下のステップ3に早見表があります。
先に知っておくと霧が晴れる用語
答え付きのデータから法則を学ばせるやり方。Titanicはまさにこれで、train.csv
の Survived
が「教師(答え)」にあたります。答えのないデータからグループ分けする教師なし学習と対になる言葉。
答えが 0 か 1 の2択である問題。生存/死亡、スパム/非スパム、クリックする/しない など。Titanicは二値分類の入門教材です。(家の値段のように連続した数値を当てる場合は回帰と呼びます)
当てたい列(Survived)が目的変数(ターゲット)、手がかりに使う列(Sex, Pclass, Age …)が特徴量(説明変数)。「どの列を特徴量に選ぶか」がスコアを大きく左右します。
418人のうち何人当てられたかの割合。Titanicの採点はこれ一本です。全員を「死亡」と答えても約0.62出るので、0.62を下回ったら何かがおかしいという目安にもなります。
📍 そもそもデータ分析はどんな順番で進めるのか(前処理・評価・過学習…)をまとめて知りたい人は → 機械学習の地図(座学・G検定の下地)
ブラウザで動くJupyter。環境構築ゼロ。
Kaggle Notebookは、PCに何もインストールせずPythonが動く作業環境です。pandasやscikit-learnなど主要ライブラリは最初から入っています。
- 無料でGPU/TPUが使える(週あたり数十時間の枠)。ディープラーニングもここで回せます。
-
データが隣にあるのが最大の利点。コンペやDatasetのデータをボタン一つで
/kaggle/input/に接続でき、パス管理で悩みません。
Titanicデータをアタッチする
- Titanicコンペ(kaggle.com/c/titanic)を開き Join Competition → 規約に同意。
- コンペページの Code タブ → + New Notebook。これでTitanicデータが自動で接続された状態で始まります。
-
右パネルの Input に
titanicがあり、train.csv/test.csv/gender_submission.csvが見えればOK。
/kaggle/input/titanic/…、空Notebookに後から Add すると
/kaggle/input/competitions/titanic/… のように
competitions/
が挟まることも。だから決め打ちせず、まず下のコードで実際の場所を確かめるのが鉄則です。
まずは表として開いてみる
pandasでtrain.csvを読み込みます。パスは環境で変わるので、候補から実在するものを自動で選ぶ形にしておくと安全です。
import pandas as pd, os # データの場所を自動判定(どちらの作り方でもOK) for BASE in ["/kaggle/input/titanic", "/kaggle/input/competitions/titanic"]: if os.path.exists(f"{BASE}/train.csv"): break print("BASE =", BASE) train = pd.read_csv(f"{BASE}/train.csv") train.head()
| PassengerId | Survived | Pclass | Sex | Age | Fare | Embarked | |
|---|---|---|---|---|---|---|---|
| 0 | 1 | 0 | 3 | male | 22.0 | 7.25 | S |
| 1 | 2 | 1 | 1 | female | 38.0 | 71.28 | C |
| 2 | 3 | 1 | 3 | female | 26.0 | 7.92 | S |
| 3 | 4 | 1 | 1 | female | 35.0 | 53.10 | S |
| 4 | 5 | 0 | 3 | male | 35.0 | 8.05 | S |
Survived列が答え(1=生存/0=死亡)。この列を、test.csv側で予測するのがゴールです。
pandasが扱う表形式のデータのこと。Excelのシートに近い感覚で、1行=1件のデータ(ここでは乗客1人)、1列=1つの項目です。1行をレコード / サンプル、1列をカラム / 特徴量と呼びます。
head() は先頭5行、tail() は末尾5行、info()
は列の型と欠損の有無をざっと見るための定番メソッド。
12個の列(カラム)の意味 早見表
Titanicのデータは全部で12列。「何の列があるのか」を一度眺めておくと、この先の作業がぐっと速くなります。欠損数は train.csv(891行) / test.csv(418行) の実際の数です。
| 列名 | 日本語 | 中身 | 欠損 train / test | 使いどころ |
|---|---|---|---|---|
| PassengerId | 乗客ID | 1から順に振られた通し番号。中身に意味はない | 0 / 0 | 予測には使わない。提出CSVの1列目に必要な"名札" |
| Survived | 生存したか | 1 = 生存 / 0 = 死亡 | 0 / 列ごと無い | これが答え(目的変数)。test.csv には存在せず、当てにいく対象 |
| Pclass | チケットの等級 | 1 = 1等 / 2 = 2等 / 3 = 3等 | 0 / 0 | 実質的な社会階級の代わり。生死を強く分ける主力の特徴量 |
| Name | 氏名 |
Braund, Mr. Owen Harris の形式
|
0 / 0 | そのままでは使えないが、敬称(Mr/Mrs/Miss/Master)を抜き出すと強い特徴量になる |
| Sex | 性別 | male / female |
0 / 0 | いちばん効く特徴量。文字列なので0/1に変換して使う |
| Age | 年齢 | 小数のものは推定値(例: 0.42 は生後5か月、28.5 は推定28歳前後) | 177 / 86 | 効くが欠損が多い。中央値などで補完してから使うのが定番 |
| SibSp | 兄弟姉妹・配偶者の数 | 同乗している Siblings + Spouses の人数 | 0 / 0 | 単独では弱い。Parchと足すと家族の規模が分かる |
| Parch | 親・子の数 | 同乗している Parents + Children の人数 | 0 / 0 | 同上。子連れかどうかの手がかり |
| Ticket | チケット番号 |
A/5 21171, 113803 など表記がバラバラ
|
0 / 0 | 扱いが難しく最初は捨ててよい。同じ番号=同行者、という使い方もある |
| Fare | 運賃 | 支払った金額(ポンド) | 0 / 1 | Pclassと連動するが、同じ等級内の"羽振りの良さ"も表す |
| Cabin | 客室番号 | C85, B28 など。頭文字はデッキ |
687 / 327 | 約8割が欠損。最初は列ごと捨てるのが定石(「記録がある=上等客」として使う手も) |
| Embarked | 乗船した港 | C = シェルブール(仏) / Q = クイーンズタウン(愛) / S = サウサンプトン(英) | 2 / 0 | 港によって客層が違うため、そこそこ効く。最頻値のSで補完するのが定番 |
・
FamilySize = SibSp + Parch + 1(自分を足して家族の人数)・
IsAlone(FamilySizeが1なら1)・
Title(Nameから Mr / Mrs / Miss / Master を抽出)
「形」と「欠け」と「傾向」を見る
分析の第一歩は決まっています。大きさ・欠損・分布を確認すること。この「いきなりモデルを作らず、まずデータを眺める」作業には名前があります——EDA(探索的データ分析)です。
モデルを作る前に、データを集計したりグラフにしたりして「これはどんなデータなのか」の当たりをつける工程。このページでやっている「形」「欠け」「傾向」を見る作業がまさにEDAです。
Kaggleの公開Notebookに Titanic EDA のようなタイトルが
異常に多いのはこのため。上位者ほどEDAに時間をかけます。
📍 EDAが分析全体のどこに位置するのか、前処理や評価との関係は → 機械学習の地図(座学)
| この教材の言い方 | 正式には | 使うコード |
|---|---|---|
| 形 | データの形状(行数×列数=サンプル数と特徴量数) | df.shape |
| 欠け | 欠損値の確認(Missing Value / NaN) | df.isnull().sum() |
| 傾向 | 分布とグループ集計(層別集計)による関係の把握 |
df.describe() / df.groupby(...)
|
# 行数・列数と、欠損値の数を確認 print(train.shape) print(train.isnull().sum())
891人分・12列。Ageが177件、Cabinが687件も欠けています。「Cabinは欠けすぎだから捨てる」「Ageは埋める」といった判断がここから生まれます。
記録が無い空欄のこと。pandasでは NaN
と表示されます。多くのモデルは欠損値があると学習できないので、EDAで必ず数え、「列ごと捨てる」か「何かで埋める」を決めます。
埋める作業は欠損補完(Imputation)。中央値・平均値で埋めるのが定番で、コース3では
Age を中央値で補完します。
欠損を埋める・文字列(male/female)を数値に変換する など、データをモデルに入れられる形に整える工程の総称。分析作業の体感8割はここです。
次に「生存率の傾向」を見る
# 性別ごと・客室クラスごとの生存率 print(train.groupby("Sex")["Survived"].mean()) print(train.groupby("Pclass")["Survived"].mean())
ある列で仲間分けしてから平均などを取る手法。groupby("Sex")["Survived"].mean()
は「性別で分けて、それぞれの生存率を比べる」という意味です。2つの列で表にする場合はクロス集計(pd.crosstab)。
「AとBで結果が違う」を見つける最短の道具。EDAの主力です。
平均・中央値・標準偏差・最大最小などでデータの姿を数字に要約すること。pandasなら
train.describe()
の1行で主要な数値がまとめて出ます。ヒストグラムを描いて分布を見るのも同じ目的。
1問クイズ
Q.train.isnull().sum() を実行する目的は?
コース2 修了 : データと会話できた 📊
Notebookでデータを開き、欠損と傾向を読み取りました。「女性・1等客ほど生存」という手がかりも掴めました。次はこれを使って予測モデルを作り、初提出します。
初めてのコンペ提出
いよいよ本番。予測結果のCSVを作ってTitanicコンペに提出し、リーダーボードに自分のスコアを載せます。これが終われば Contributorへの一歩です。
ゴールのおさらい : test.csv にいる418人それぞれに
1(生存)/0(死亡) を付け、PassengerId, Survived
の2列CSVとして提出する。返ってくるスコアは正解率(Accuracy)。
「予測CSVを出す → 採点される」だけ
コンペの流れは驚くほどシンプルです。
- train.csv(答えあり)でモデルを学習する。
- test.csv(答えなし)の各乗客について生死を予測する。
- 予測を submission.csv の形式で書き出し、Submit する。
- Kaggleが正解と照合してスコア(Titanicは正解率=Accuracy)を返し、リーダーボードに順位が出る。
提出フォーマットはこの2列だけ:
PassengerId,Survived
892,0
893,1
894,0
...
「女性なら生存」ルールだけで出してみる
コース2で「女性の生存率74%」と分かりました。まずは機械学習すら使わず、女性=1, 男性=0
と決め打ちで提出してみます。目的はスコアより「提出の流れを1周する」こと。(コース2と同じNotebookの続きなら
BASE
は再利用できます。別Notebookなら下の1〜3行目で再設定)
import pandas as pd, os for BASE in ["/kaggle/input/titanic", "/kaggle/input/competitions/titanic"]: if os.path.exists(f"{BASE}/test.csv"): break test = pd.read_csv(f"{BASE}/test.csv") # 女性(female)なら1、それ以外は0 pred = (test["Sex"] == "female").astype(int) sub = pd.DataFrame({ "PassengerId": test["PassengerId"], "Survived": pred }) sub.to_csv("submission.csv", index=False) print("saved:", sub.shape)
418人分の予測が入った
submission.csv が作れました。このルールだけで
正解率 約0.765 出ます。侮れません。
一番シンプルな方法で先に出しておく基準スコアのこと。今回の「女性なら生存」ルールがそれです。これがあると、その後の改良が 本当に効いたのかを比べられるようになります。
凝ったモデルを作ったのにベースラインを超えない、はよくある話。だからKagglerは必ず最初に低コストな1本を提出します。
scikit-learnで機械学習モデルを作る
次はランダムフォレストで、複数の手がかり(客室クラス・性別・年齢・運賃など)を組み合わせて予測します。前処理は最小限に。
決定木は「性別は?→女性→客室は?→1等→生存」のように質問を枝分かれさせて答えに辿り着くモデル。1本だと当てずっぽうに寄りやすいので、少しずつ違う木を何百本も作って多数決を取るのがランダムフォレストです。
n_estimators=200 は「木を200本作る」という意味。表形式データで最初に試す定番。
model.fit(X, y)
が学習——特徴量Xと答えyを見せて法則を覚えさせる工程。model.predict(...)
が推論(予測)——覚えた法則を使って未知のデータに答えを出す工程。scikit-learnはどのモデルでもこの2つの名前で統一されています。
from sklearn.ensemble import RandomForestClassifier train = pd.read_csv(f"{BASE}/train.csv") features = ["Pclass", "Sex", "Age", "Fare"] def prep(df): df = df.copy() df["Sex"] = (df["Sex"] == "female").astype(int) # 文字→数値 df["Age"] = df["Age"].fillna(df["Age"].median()) # 欠損を中央値で補完 df["Fare"] = df["Fare"].fillna(df["Fare"].median()) return df[features] X = prep(train) y = train["Survived"] model = RandomForestClassifier(n_estimators=200, random_state=0) model.fit(X, y) print("train accuracy:", round(model.score(X, y), 3))
学習データを丸暗記してしまい、未知のデータに弱くなる状態。過去問の答えだけ覚えて本番で解けない受験生と同じです。「学習データの点数だけ異常に高い」ときは疑ってください。
過学習を見抜くために、train.csv の一部をわざと学習に使わず採点用に取っておくのが検証データ。分け方を変えて何回も試し平均を取るのが交差検証(CV)です。
提出は1日10回までなので、Kagglerは手元のCVスコアを頼りに改良を進めます。sklearn.model_selection
の train_test_split / cross_val_score
が入口。
📍 正則化・バイアス/バリアンス・評価指標まで通しで知りたい → 機械学習の地図(座学)
test を予測して submission を書き出す
ここが「答えを作る」工程です。やっていることは4つだけ。
-
答えのない418人を読み込む(
test.csv)。 -
学習時とまったく同じ前処理をかける(
prep())。ここが最重要で、Sexを0/1に、Ageを中央値で補完——を test にも同じように適用しないと、列の形が合わずモデルが受け付けません。 -
学習済みモデルに0/1を出させる(
model.predict())。418個の予測が返ります。 -
PassengerId と並べて2列のCSVに保存する(
to_csv())。これが提出物。
test = pd.read_csv(f"{BASE}/test.csv") pred = model.predict(prep(test)) sub = pd.DataFrame({ "PassengerId": test["PassengerId"], "Survived": pred }) sub.to_csv("submission.csv", index=False) print("done!") sub.head(3)
| PassengerId | Survived | |
|---|---|---|
| 0 | 892 | 0 |
| 1 | 893 | 1 |
| 2 | 894 | 0 |
「submission」が3回出てくるけど、どれが何?
ここで一度つまずきやすいので整理します。名前は似ていますが別物が3つあります。
| どれ | 置き場所 | 誰が作った | 中身 |
|---|---|---|---|
| gender_submission.csv |
/kaggle/input/titanic/読み取り専用 |
Kaggle(主催者) | 「女性は全員生存」で埋めた書き方の見本。あなたの答えではない |
| submission.csv ステップ2 |
/kaggle/working/ |
あなた | 女性ルールで作った予測 418行 |
| submission.csv ステップ3(今ここ) |
/kaggle/working/ |
あなた | ランダムフォレストの予測 418行。ファイル名が同じなので、ステップ2の中身は上書きされて消えます |
/kaggle/input/ の中は読み取り専用で、編集も削除もできません。to_csv("submission.csv")
は、Notebookの作業フォルダ /kaggle/working/
に自分のファイルを新しく作る動作です。見本の
gender_submission.csv はそのまま残ります。
sub.to_csv("submission_rf.csv", index=False)
のように別名で保存すればOK。Output に2つ並び、提出時にどちらを出すか選べます。なお行数(418行)と列(PassengerId, Survived)はどちらも同じで、変わるのは
Survived の 0/1 の並びだけです。
で、精度は結局いくつなの?
この時点では分かりません。test.csv の正解はKaggleだけが持っているので、提出して初めて採点されます。 混同しやすい3つの数字を並べておきます。
| 数字 | 意味 | いつ分かる | 目安 | 信頼度 |
|---|---|---|---|---|
| train accuracy | 学習に使った891人を、そのまま採点した点数 | 手元ですぐ | ≈ 0.90 | 甘い。丸暗記した分が乗るので当てにならない |
| CVスコア 交差検証 |
trainの一部をわざと学習に使わず採点する、を分け方を変えて繰り返した平均 | 手元で、提出前に | ≈ 0.80 | 本番に近い。改良が効いたかの判断はこれで行う |
| Public LB スコア | test.csv の一部に対する本当の正解率 | 提出した数十秒後 | ≈ 0.77 | 本番。ただしテストの一部だけで計算された値 |
提出は1日10回までという上限があるので、思いつきを全部提出して確かめる、はできません。だから手元のCVスコアで見込みを立ててから提出するのが定石です。CVは次の3行で測れます。
from sklearn.model_selection import cross_val_score scores = cross_val_score(model, X, y, cv=5, scoring="accuracy") print("CV accuracy:", round(scores.mean(), 3), "±", round(scores.std(), 3))
(実際の値は乱数やライブラリのバージョンで少し前後します) train 0.90 → CV 0.81 → 本番 0.77 と下がっていくのが普通です。この下がり幅が過学習の大きさで、差が小さいほど素直なモデル。手元の数字がそのまま本番の点数になることはない、と覚えておいてください。
Submit してリーダーボードに載る
- Notebook右上の Save Version でNotebookを実行保存(Save & Run All)。
-
実行が終わると、もう一度生成された
submission.csvが、そのバージョンの Output に現れる。 - コンペページの Submit Prediction、またはNotebookのOutputから直接 Submit。
- 数十秒でスコアが表示され、Leaderboard に自分の名前が載る 🎉
「もう作ったのに、また submission.csv が作られるの?」
はい、作られます。ただし新しいファイルが増えるのではなく、まっさらな環境で作り直された2回目です。Kaggle Notebookには実行される場所が2つあるためです。
| 編集中のセル実行 | Save Version の実行 | |
|---|---|---|
| きっかけ | ▶ を押したとき | Save Version を押したとき |
| 環境 | いま開いている作業セッション | 新しい空のコンテナ(ゼロから起動し直す) |
| 実行範囲 | 押したセルだけ | 上から下まで全セル |
| できた submission.csv | 作業セッションの中だけに存在 | そのバージョンに保存され、提出に使えるのはこちら |
Save & Run All (Commit) = 全セル再実行。時間はかかるが確実で、基本はこちら。Quick Save = 再実行せず今の状態のまま保存。
submission.csv をダウンロードして、コンペページの
Submit Prediction
に直接アップロードしてもOK。手元のPCで作ったCSVを出したいときはこちらになります。
元の列をそのまま使うのではなく、予測に効く新しい列を人間が作り出す作業。Titanicなら「Nameから敬称(Mr/Mrs/Miss/Master)を取り出す」「SibSp+Parch+1で家族人数を作る」が定番で、これだけでスコアが0.80前後まで伸びます。
モデルを豪華にするより効くことが多く、コンペの勝敗を分けやすいのはこことよく言われます。
「Version name」と「Description」に何を書く?
提出の途中で入力欄が2つ出てきて戸惑いがちなので、役割を整理します。どちらも必須ではなく空でも提出できますが、書く習慣をつけると上達が速くなります。
-
Version name(Save Version時) …
そのNotebook保存版につける自分用のラベル。空なら日時が自動で入る。何度も改良するので
rf-baseline/v2 Age追加のような短い目印にしておくと後で見分けやすい。 - Description(Submit時) … 「このスコアは何をした結果か」のメモ。提出履歴にスコアと並んで残るので、「0.77のやつ何やったっけ?」を防げる。これが改善ループの生命線。
・
女性ルール baseline・
RandomForest, 特徴量=Pclass/Sex/Age/Fare, Age=中央値補完・
v3: 敬称(Mr/Mrs)を特徴量に追加
提出したあと、スコアと順位はどこを見る?
「数十秒でスコアが出る」と言われても、どの画面を見ればいいのか分かりにくいところです。見る場所はこの3つだけ。上から順に辿れば必ず自分のスコアに行き着きます。
※ 待っている間にページを閉じても採点は続きます。閉じてしまったら次の 2 を見てください。
直リンク
kaggle.com/competitions/titanic/submissions
直リンク
kaggle.com/competitions/titanic/leaderboard
下の吹き出しがKaggleからのメッセージで、「Your score represents your submission's accuracy(スコアはあなたの提出の正解率です)」と書かれています。0.74880 なら、418人中およそ75%を当てたという意味。上部の「This leaderboard is calculated with all of the test data」は、Titanicがテストデータ全体で採点する練習用コンペであることを示しています。
My Submissions はこんな見え方になります(イメージ)
| Submission and Description | Submitted | Public Score | Status |
|---|---|---|---|
|
submission.csv RandomForest, 特徴量=Pclass/Sex/Age/Fare |
2 minutes ago | 0.77511 | Complete |
|
submission.csv 女性ルール baseline |
an hour ago | 0.76555 | Complete |
sub.shape(→ (418, 2))と
sub.isnull().sum()(→ すべて0)を見れば一発で分かります。
できたらチェック ✓
Novice卒業後、どう伸ばす?
- 公開Notebookをフォークして改造。人気Notebookを Copy & Edit → 1行変えて再提出。これが最速の学習ループ。
- 他のGetting Startedコンペへ。House Prices(住宅価格予測=回帰)、Spaceship Titanicなど。
- Learnコースの "Intro to Machine Learning" → "Intermediate ML" を1本。数時間で地力が付きます。
- Discussionを読む/コメントする。上位者の解法解説はタダの宝。コメント投稿もContributor条件のひとつ。
Q.提出後、スコアをさらに上げる現実的な次の一手は?
コース3 修了 : 初提出、完了 🚀
データを読み、モデルを作り、コンペに提出してリーダーボードに載る——Kaggleの1サイクルを丸ごと体験しました。ここまでで基礎は完了。もう一段、分析の面白さを味わうなら「野球データ編」へ。
野球データで"割安な価値"を探す
基礎はもう身についています。ここでは別テーマで分析の面白さを。テーマは映画にもなったマネーボール——2002年、貧乏球団オークランド・アスレチックスは「データで過小評価された価値」を見つけて勝ちまくりました。同じ問いを150年ぶんのMLBデータに投げかけます。
このコースのゴールは「データで"通説"を検証する」こと
提出もスコアもありません。ここはコンペではなく、公開データ(Dataset)を使った自由分析です。150年分のMLB記録から、2つの問いに自分の手で答えを出します。Titanicが「予測して当てる」練習だったのに対し、こちらは「集計して読み解く」練習。Kaggleでやることの、もう半分がこれです。
Titanic(コース2・3)とは、そもそも種類が違う
| Titanic = Competition | 野球編 = Dataset | |
|---|---|---|
| データの出どころ | コンペページの Data タブ | 誰かが公開した Dataset(Lahman Baseball Database) |
| ゴール | 答えのない行を予測して提出する | 問いに答えを出して考察する |
| 提出物 | submission.csv |
なし(Notebookを公開するだけ) |
| 採点 | Kaggleが自動採点してスコアを返す | 自分で解釈する。正解は用意されていない |
| 主な道具 | モデル(ランダムフォレストなど) | 集計・相関・可視化。モデルは使わない |
先に知っておくと読みやすい用語
2つの数値がどれくらい一緒に動くかを -1 〜 +1
で表した数字。+1に近いほど「片方が増えるともう片方も増える」、-1に近いほど逆、0なら無関係。pandasでは
df["A"].corr(df["B"]) の1行で出せます。
正確にはピアソンの積率相関係数といい、直線的な関係だけを測ります。曲線的な関係は捉えられないので、必ず散布図も併せて見るのが作法です。
対象分野そのものの知識(ここでは野球)。「出塁率という指標を作ろう」「1961年以降に絞ろう」という発想は、統計の知識ではなく野球を知っているから出てくるものです。
良い特徴量はドメイン知識から生まれる——Kaggleでも実務でも、これが最終的に効いてきます。データサイエンティストが業務担当者と組む理由もここ。
問い : 得点を生むのは打率か、出塁率か
チームがたくさん得点(R)するために本当に効くのは、有名な打率(AVG)なのか、当時あまり注目されなかった出塁率(OBP)なのか。もし「OBPの方が得点に効くのに市場は打率にお金を払っている」なら、そこに割安な勝ち筋があります。これがマネーボールの発想です。
もう1問、「得点と失点から勝ち星は予測できるか?」にも挑戦。野球で最も美しい経験則、ピタゴラス勝率を自分の手で確かめます。
Lahmanデータを繋いで読み込む
-
新規Notebookで右パネル + Add Input →
Datasets タブで
Lahman Baseball Databaseを検索して追加。(kaggle.com/datasets/dalyas/lahman-baseball-database) -
接続すると
/kaggle/input/…/にTeams.csvなど多数のCSVが現れます。今日の主役はチーム×シーズンの成績表Teams.csv。
import pandas as pd teams = pd.read_csv("/kaggle/input/lahman-baseball-database/Teams.csv") print(teams.shape) teams[["yearID","teamID","W","R","RA","AB","H","BB"]].tail()
| yearID | teamID | W | R | RA | AB | H | BB | |
|---|---|---|---|---|---|---|---|---|
| 3010 | 2024 | SDN | 93 | 760 | 676 | 5497 | 1390 | 484 |
| 3011 | 2024 | SEA | 85 | 676 | 642 | 5479 | 1250 | 530 |
| 3012 | 2024 | SFN | 80 | 674 | 696 | 5484 | 1329 | 498 |
| 3013 | 2024 | TBA | 80 | 604 | 662 | 5389 | 1269 | 522 |
| 3014 | 2024 | TOR | 74 | 671 | 729 | 5519 | 1382 | 486 |
1行 = 「あるチームのある年」。列は48もありますが、今日使うのはほんの数個です。
今日使う列(カラム)の意味 早見表
48列すべてを覚える必要はありません。この10個だけ分かれば、このコースは最後まで走れます。野球用語がそのまま列名になっているのがポイントです。
| 列名 | 読み | 意味 | 使いどころ |
|---|---|---|---|
| yearID | — | シーズン(西暦) | 時代を絞り込むのに使う |
| teamID | — | チームの略号(NYA=ヤンキース など) |
チームの識別 |
| G | Games | その年の試合数(通常162) | 短縮シーズンを除外する条件に使う |
| W / L | Wins / Losses | 勝利数 / 敗戦数 | 問い2の答え合わせの対象 |
| R | Runs | そのチームが取った得点 | 問い1の的(まと)。何と強く連動するかを調べる |
| RA | Runs Allowed | 取られた失点 | ピタゴラス勝率の材料 |
| AB | At Bats | 打数(四球などを除いた"打った回数") | 打率の分母 |
| H | Hits | 安打数 | 打率の分子 / 出塁率の材料 |
| BB | Base on Balls | 四球(フォアボールで歩いた数) | 打率には一切入らないが、出塁率には入る。今日の主役 |
| HBP | Hit By Pitch | 死球(デッドボール) | 出塁率の材料 |
| SF | Sacrifice Fly | 犠牲フライ | 出塁率の分母の調整に使う |
H / AB なので、四球(BB)で塁に出ても打率は1ミリも上がりません。でも塁に出れば得点は生まれる。この「打率が見落としているもの」を拾いにいくのが出塁率(OBP)で、マネーボールの出発点です。
Teams.csv(チーム×年)のほか、Batting.csv(選手×年の打撃成績)、Pitching.csv(投球成績)、People.csv(選手の基本情報)、Salaries.csv(年俸)など。Salaries と Batting を繋げば「1出塁あたりいくら払っているか」が出せる——これが映画で球団がやっていたことそのものです。
打率と出塁率を自分で計算する
OBPは生データに無いので、安打H・四球BB・死球HBP・犠飛SF・打数ABから組み立てます。ノイズを減らすため、モダンな時代・フルシーズンに絞ります。
# 1961年以降・ほぼフルシーズンに限定 df = teams[(teams["yearID"] >= 1961) & (teams["G"] >= 150)].copy() df["AVG"] = df["H"] / df["AB"] # 打率 df["OBP"] = (df["H"] + df["BB"] + df["HBP"]) \ / (df["AB"] + df["BB"] + df["HBP"] + df["SF"]) # 出塁率(近似) df[["yearID","teamID","R","AVG","OBP"]].head(4).round(3)
| yearID | teamID | R | AVG | OBP | |
|---|---|---|---|---|---|
| 0 | 1961 | BAL | 691 | 0.254 | 0.328 |
| 1 | 1961 | BOS | 729 | 0.254 | 0.334 |
| 2 | 1961 | CHA | 765 | 0.265 | 0.334 |
| 3 | 1961 | DET | 841 | 0.266 | 0.347 |
得点との相関を測る : AVG vs OBP
「どちらが得点(R)と強く連動するか」を相関係数で比べます。1.0に近いほど強い関係です。
相関係数の読み方の目安
| 絶対値 | 解釈 | イメージ |
|---|---|---|
| 0.0 〜 0.2 | ほとんど関係なし | 散布図は雲のように散らばる |
| 0.2 〜 0.4 | 弱い相関 | 言われてみれば傾いている程度 |
| 0.4 〜 0.7 | 中程度の相関 | はっきり傾きが見える |
| 0.7 〜 1.0 | 強い相関 | 細長い帯状に並ぶ。今回のAVG(.83)もOBP(.91)もここ |
※ 分野によって基準は変わります(物理は0.9でも不満、社会科学は0.4で十分など)。大事なのは絶対値そのものより「AとBを同じ土俵で比べたときどちらが大きいか」です。今回まさにそれをやっています。
for col in ["AVG", "OBP"]: r = df["R"].corr(df[col]) print(f"R vs {col}: {r:.3f}")
「一緒に動く」ことと「原因である」ことは別物です。有名な例に「アイスの売上と水難事故の数」——この2つの相関は強いですが、アイスが事故を起こすわけではなく、裏に気温という共通の原因が隠れています。
このように、両方に影響する隠れた変数を交絡因子、それによって生じる見せかけの相関を疑似相関と呼びます。G検定でも頻出の考え方。今回「1961年以降・150試合以上」に絞ったのも、時代による違い(球の質・試合数)が交絡しないようにという予防策でした。
2つの数値を縦横にとって点を打つグラフ。相関係数という「1個の数字」では見落とすもの——曲線的な関係、外れ値、2つの集団に分かれている、といった構造が一目で分かります。
相関係数を出したら必ず散布図も見る。数字が同じでも中身が全く違うデータが作れることは アンスコムの例 として有名です。
散布図で"目で"確かめる
import matplotlib.pyplot as plt plt.scatter(df["OBP"], df["R"], s=8, alpha=.4) plt.xlabel("OBP"); plt.ylabel("Runs"); plt.show()
Q.相関の結果から言える"マネーボール的"な結論は?
得失点から勝ち星を予測 : ピタゴラス勝率
野球には驚くほどよく当たる経験則があります。勝率 ≈ 得点² / (得点² + 失点²)。機械学習なしで、四則演算だけで勝ち星を当てます。
exp = 2 df["pytWpct"] = df["R"]**exp / (df["R"]**exp + df["RA"]**exp) df["pytW"] = (df["pytWpct"] * df["G"]).round() mae = (df["W"] - df["pytW"]).abs().mean() print(f"平均誤差: {mae:.2f} 勝") df[["yearID","teamID","R","RA","W","pytW"]].sample(4, random_state=7)
| yearID | team | R | RA | W(実際) | pytW(予測) | |
|---|---|---|---|---|---|---|
| · | 2001 | SEA | 927 | 627 | 116 | 109 |
| · | 2016 | CHN | 808 | 556 | 103 | 102 |
| · | 1998 | NYA | 965 | 656 | 114 | 108 |
| · | 2019 | HOU | 920 | 640 | 107 | 103 |
コード中の
(df["W"] - df["pytW"]).abs().mean()
がまさにこれ。予測と実際のズレの絶対値を、全部平均した値です。「平均して何勝ぶん外したか」がそのまま読めるので解釈しやすいのが長所。
誤差を2乗して平均するMSE、その平方根のRMSEもよく使われます。2乗する方は大きな外し方をより強く罰する性質があり、外れ値に敏感。回帰(数値を当てる問題)の評価はこの3つが基本セットです。
極端に良い(悪い)結果を出した対象は、次の機会には平均に近づきやすいという統計的な性質。実力ではなく運の振れが結果に混ざっているためです。
「予測より勝ちすぎたチームは翌年落ちやすい」はこれ。ビジネスでも「今期突出した店舗は来期落ちる」など至るところで顔を出し、これを実力の変化と誤読するのがよくある失敗です。
ピタゴラス勝率は機械学習を一切使わない、たった1行の式。それで平均±3勝まで当ててしまいます。「まず単純な式で試す」はコース3のベースラインと完全に同じ発想で、これを超えられないモデルには価値がありません。
実務でも「凝ったモデルを作ったのに、経験則の式に負けた」は日常茶飯事。まず簡単な方法、が常に正解です。
Q.予測より実際の勝ちが大きく多いチームは、何が起きていた可能性が高い?
Notebookを公開して、次の打席へ
分析ができたら公開(Publish)できます。これ自体がContributor称号の条件のひとつ。「何を調べ・何が分かったか」をMarkdownセルで一言添えると、ぐっとNotebookらしくなります。
さらに深掘りするなら
-
選手単位で同じことを :
Batting.csvを使えば「割安な出塁マシン」を個人で探せます。まさに映画の球団がやったこと。 - OPS (=OBP+SLG) を作って相関を比較。得点との相関が .93 前後まで上がるのを体感できます。
-
日本のプロ野球 / 大谷選手に興味があれば、Kaggleで
NPBやStatcast系データセットを検索。投打の指標で同じ分析が回せます。
このコースで通った"分析の型"
やったことを工程名に置き換えると、実は教科書どおりの分析プロセスをなぞっていました。
| やったこと | 正式には |
|---|---|
| 「打率と出塁率、どちらが得点に効く?」と問いを立てた | 課題設定(ビジネス理解)。分析で一番大事な工程 |
| Teams.csv を読んで列と行数を確かめた | データ理解 / EDA |
| 1961年以降・150試合以上に絞った | データの絞り込み。交絡を減らすための前処理 |
| H・BB・HBP・SF から OBP を組み立てた | 特徴量エンジニアリング。ドメイン知識で新しい列を作る作業 |
| 相関係数を出し、散布図で確かめた | 関係の把握 / 可視化 |
| ピタゴラス勝率の誤差(MAE)を測った | 評価。回帰の評価指標 |
| Notebookに考察を書いて公開した | 報告・共有。実務ではここが成果物 |
📍 この工程全体の地図(CRISP-DM)、相関・交絡・評価指標の体系立った説明は → 機械学習の地図(座学・G検定の下地)
スカウト任務、完了 ⚾
データから「出塁率という割安な価値」を見つけ、得失点だけで勝ち星まで予測しました。感覚ではなく数字で選手を語れる、立派なデータ・スカウトです。
音楽データでヒットの謎に迫る
約11万曲のSpotifyデータには、1曲ずつ「踊りやすさ・エネルギー・明るさ」などの音の特徴が数値で付いています。これを使って2つ確かめます。①ジャンルは音だけで当てられる? ②"人気"は音だけで決まる? 答えが対照的で、「データで分かること・分からないこと」まで見えてきます。
曲の"体質"を数字で読む
Spotifyは各曲に、耳で感じる印象を0〜1などの数値にしたオーディオ特徴を付けています。まずは道具になる用語だけ。
今回の2つの的(まと): track_genre(ジャンル=分類で当てる) と popularity(人気=当てられるか検証する)。
Spotifyデータを繋いで読み込む
新規Notebookで + Add Input → Datasets で
Spotify Tracks Dataset(maharshipandya)を追加。フォルダ名が
-spotify-tracks-dataset(先頭にハイフン!)なので、パスは
glob で探してから読むのが安全です。
import pandas as pd, glob path = glob.glob("/kaggle/input/*spotify*/*.csv")[0] print(path) df = pd.read_csv(path, index_col=0) print(df.shape) df[["track_name","artists","track_genre","popularity","danceability","energy"]].head()
| track_name | artists | track_genre | popularity | dance | energy | |
|---|---|---|---|---|---|---|
| 0 | Comedy | Gen Hoshino | acoustic | 73 | 0.68 | 0.46 |
| 1 | Ghost | Ben Woodward | acoustic | 55 | 0.42 | 0.17 |
| 2 | To Begin… | Ingrid Michaelson | acoustic | 57 | 0.44 | 0.36 |
| 3 | Can't Help… | Kina Grannis | acoustic | 71 | 0.27 | 0.09 |
| 4 | Hold On | Chord Overstreet | acoustic | 82 | 0.62 | 0.44 |
11.4万曲・125ジャンル。1行が1曲です。
ジャンルごとに"音の体質"は違う?
いきなりモデルの前に、直感を作ります。対照的な4ジャンルで、特徴の平均を比べてみましょう。
genres = ["edm", "classical", "acoustic", "hip-hop"] sub = df[df["track_genre"].isin(genres)] sub.groupby("track_genre")[["energy","danceability","acousticness","valence"]].mean().round(2)
| track_genre | energy | dance | acoustic | valence |
|---|---|---|---|---|
| acoustic | 0.45 | 0.56 | 0.76 | 0.46 |
| classical | 0.22 | 0.35 | 0.90 | 0.24 |
| edm | 0.80 | 0.65 | 0.08 | 0.40 |
| hip-hop | 0.64 | 0.72 | 0.20 | 0.50 |
モデルは"耳"の代わりに聴き分けられるか
音の特徴だけを手がかりに、4ジャンルのどれかを当てる分類モデルを作り、検証データで精度を測ります(特徴は数値なのでエンコード不要)。
from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier feats = ["danceability","energy","acousticness", "valence","tempo","loudness","speechiness"] X = sub[feats] y = sub["track_genre"] X_tr, X_val, y_tr, y_val = train_test_split(X, y, test_size=0.2, random_state=0) clf = RandomForestClassifier(n_estimators=200, random_state=0, n_jobs=-1) clf.fit(X_tr, y_tr) print("検証accuracy:", round(clf.score(X_val, y_val), 3))
4択(当てずっぽうなら0.25)に対して0.85。モデルは音の特徴だけでジャンルをかなり聴き分けられました。何が効いたか見てみましょう。
imp = pd.Series(clf.feature_importances_, index=feats) imp.sort_values(ascending=False).round(3)
Q.音の特徴だけでジャンルをかなり当てられたのはなぜ?
じゃあ"人気"は音で決まる?
同じ音の特徴で、今度は popularity(人気度0〜100) を予測してみます。うまくいくでしょうか。全ジャンルで回帰(数値予測)し、決定係数 R²(1に近いほど説明できている)で測ります。
from sklearn.ensemble import RandomForestRegressor Xp = df[feats] yp = df["popularity"] Xp_tr, Xp_val, yp_tr, yp_val = train_test_split(Xp, yp, test_size=0.2, random_state=0) reg = RandomForestRegressor(n_estimators=150, random_state=0, n_jobs=-1) reg.fit(Xp_tr, yp_tr) print("人気予測 R²:", round(reg.score(Xp_val, yp_val), 3))
Q.人気(popularity)が音の特徴ではうまく当たらない、最も的確な解釈は?
できたらチェック ✓
もっと遊ぶ / 深める
- 自分の推し曲で試す。好きな曲のオーディオ特徴(Spotifyのアプリや対応サイトで見られる)を入れて、モデルがどのジャンルと言うか試すと楽しい。
-
ジャンルを増やす / 混同を見る。5〜10ジャンルに増やし、
confusion_matrixで「どのジャンル同士を間違えるか」を見ると発見がある(pop↔dance系は紛らわしい等)。 -
クラスタリングで、ジャンル名を使わず曲を自動グループ分け(
KMeans)。レコメンドの入り口。 - できたら Notebookを公開して発見を共有(Contributor条件のひとつ)。
音楽編 修了 : データの耳を手に入れた 🎧
音の特徴でジャンルを聴き分け、そして「人気は音だけでは決まらない」という限界まで見抜きました。分類・検証・重要度に加えて、データで分かること/分からないことを見極める目が身につきました。
エージェント提出型コンペの始め方
いま開催中の ポケモンカードゲーム AI Battle Challenge を舞台に、これまでと"仕組みが違う"コンペの入り方を学びます。予測CSVではなく、対戦するAI(エージェント)そのものを提出し、世界中のエージェントと自動対戦させて強さを競う——という新ジャンル。"最小の提出"だけならTitanicと同じくらい簡単です。
勝率を上げる=毎ターン"一番マシな手"を選ばせて、その良し悪しを"勝率"で測りながら、1つずつ直す。本質はこれだけ。
- AIの仕事は「合法手から1つ選ぶ」だけ。強くする=手に点数を付けて良い順に選ぶこと(倒せる→攻撃→エネ付け→進化→ドロー)。
- 効いたかは感覚で分からない → 勝率で測る。固定の相手と100戦。変更は必ず1つずつ、上がれば残す・下がれば戻す。
- デッキは"借りて、勝率で選ぶ"。ルールを完璧に覚えてから、ではなく回しながら覚える。知識不足は勝率の計測が肩代わりしてくれる。
ゴールは「対戦するAIを1体提出して、ラダーに載る」こと
提出するのはCSVではなくプログラムです。main.py(AI本体)と
deck.csv(使う60枚)を
submission.tar.gz に固めて提出すると、あなたのAIが他の参加者のAIと自動で何百試合も対戦し、その勝敗でレーティング(Elo)が決まります。まずは「合法手からランダムに1手選ぶだけ」のAIで構いません。動いてラダーに載れば、そこが1周目のゴールです。
これまでのコースと、何が同じで何が違う?
| Titanic(CSVコンペ) | ポケモンAI(エージェントコンペ) | |
|---|---|---|
| 提出物 | 予測結果の submission.csv |
動くプログラム submission.tar.gz
|
| 採点の仕組み | 正解と照合して即スコア | 他のAIと対戦させて勝敗からレーティングを算出 |
| スコアの動き | 提出したら確定 | 提出後も対戦のたびに上下する |
| 失敗の仕方 | 行数・列名のミスでスコアエラー | 実行時エラー・時間切れ・反則手で"負け"扱い |
| そのまま効くこと | まずベースライン / 1つずつ変える / 記録を残す / 検証を信じる——このラボの合言葉は、そっくりそのまま通用します | |
これはCSVコンペじゃない
Titanicや中古車は「予測CSVを出す → 正解と照合して採点」でした。エージェント提出型(シミュレーション)コンペは根本が違います。
- 提出するのは「対戦するAIのコード」そのもの。
- あなたのAIは、他の参加者のAIと自動で何百試合も対戦する。
- 順位は静的なスコアではなく、対戦成績から決まるレーティング(Elo)で上下する。
実はここ、G検定の「強化学習」の舞台そのもの
エージェント・環境・行動・報酬——これらは強化学習の基本用語で、そのままG検定の出題範囲です。ポケモンAIを作ることは、その言葉を体で覚えることでもあります。
エージェント(=あなたのAI)が、環境(=対戦の場)の状態を観測し、行動を選ぶ。その結果報酬を受け取り、報酬の合計が最大になるように行動の選び方(方策)を改善していく——これが強化学習の枠組みです。
今回のポケモン大会では、obsが状態、legal_actionsから選ぶのが行動、勝敗が報酬にあたります。学習させなくても、この枠組み自体は同じです。
将棋・囲碁・チェスのように盤面がすべて見えているのが完全情報ゲーム。ポケカ・ポーカー・麻雀のように相手の手札が見えず、山札の引きに運も絡むのが不完全情報ゲームです。
後者の方がAIには格段に難しい。見えない情報を確率的に推定する必要があり、同じ手を選んでも結果が運で変わるため「その手が良かったのか」の判定も難しくなります。だからこそ1試合の勝敗ではなく、何十戦もの勝率で測る必要があるわけです。
ルールベース=人間が「こういうときはこうする」を書き下ろす方式。機械学習=データから法則を自動で学ばせる方式。今回のLv1〜3はルールベース、Lv5が機械学習です。
ルールベースは第2次AIブームのエキスパートシステムの系譜。「知識を人手で入れ続けるのが限界(知識獲得のボトルネック)」という弱点はありますが、範囲が狭く要件がはっきりした問題では今でも極めて強力です。
対戦成績から強さを推定する仕組み。格上に勝つと大きく上がり、格下に勝ってもあまり上がらないのが特徴で、チェス由来。全員が総当たりしなくても実力の順序が推定できるため、対戦型コンペの標準になっています。
📍 強化学習・探索・AIの歴史をまとめて知りたい → 機械学習の地図(座学・G検定の下地)
まず公式スターターを Fork する
エージェントの入出力の作法(API)はコンペごとに違います。ここで一番やってはいけないのが「推測でAPIを自作する」こと。正解は決まっています。
- コンペの Code タブで、公式・人気のサンプルエージェントNotebookを開く(ポケモンなら「A Sample Rule-Based Agent」「Beginner Guide: From Deck to First Valid Submission」など)。
- Copy & Edit で自分の環境に複製。
-
そこで提出物の形と関数の呼ばれ方を確認する。ポケモン大会では、提出は
main.pyとdeck.csvをsubmission.tar.gzにまとめる形式です。
形はだいたい「obsを受け取って、合法手を1つ返す」
多くのエージェントは
agent(obs) -> action
という関数です。「今の盤面(obs)」を受け取り、「選べる手(合法手)の中から1つ」を返すだけ。まずはランダムに合法手を返す最小版で十分です(強さは後回し、動くことが最優先)。
import random def agent(obs): # obs = 今の局面。合法手の一覧を取り出す(キー名は公式サンプルに合わせる) legal = obs["legal_actions"] if not legal: return 0 # フォールバック : 絶対にクラッシュさせない return random.choice(legal) # まずは合法手からランダムで1手
Q.エージェント提出型で、いちばん最初にやるべきことは?
"強いAI"より先に"動く提出"
ポケモン大会の提出物は、main.py(AI本体)と
deck.csv(使う60枚。サンプルのをそのまま使ってOK)を、トップ階層に置いた
submission.tar.gz。Notebook上でこう固めます。
import tarfile with tarfile.open("submission.tar.gz", "w:gz") as tar: tar.add("main.py") # AI本体 tar.add("deck.csv") # 使う60枚(サンプル流用でOK) print("built submission.tar.gz")
提出は2通り。NotebookのOutputから Submit、または端末/コードからKaggle CLIで。
# Kaggle CLI で提出する場合 kaggle competitions submit pokemon-tcg-ai-battle \ -f submission.tar.gz -m "random baseline"
スコアは"対戦しながら"決まる (Eloラダー)
CSVコンペのように提出直後に確定スコアが出るのではありません。提出後、あなたのエージェントは他のエージェントと自動対戦を繰り返し、勝てばレーティングが上がり負ければ下がる——という形で順位がだんだん定まります。
# イメージ : 対戦を重ねてレーティングが動く show_leaderboard()
| 順位 | エージェント | Elo |
|---|---|---|
| 1 | strong-heuristic | 1180 |
| 2 | mega-lucario-rule | 1120 |
| … | … | … |
| 842 | your-random ←まずここ | 780 |
提出したあと、どこを見る?
CSVコンペと違い提出してすぐには数字が出ません。見る場所と、それぞれの状態が何を意味するかを押さえておきましょう。
submission.tar.gz の行に状態が出ます。Validating = 形式チェック中 → Running / Active = 対戦に参加中(正常) → Error / Invalid = 動かなかった。まず Active になることが1周目のゴールです。
Q.CSVコンペと違い、提出後にスコア(順位)が変動していくのはなぜ?
できたらチェック ✓
「何をすればいいか分からない」からの勝率アップ順
ここが本題。効く順に並べました。上から順にやるのが正解で、いきなり下(学習)に行くのが一番の遠回りです。
効く順のロードマップ
- Lv1 : デッキを借りる(最重要) … 環境で強いとされるデッキ(今は Mega Evolution ex 系が中心)をサンプルからそのまま使う。弱いデッキは何をしても勝ちにくい。まず"強いと言われるデッキ"に乗るだけで勝率が動く。
-
Lv2 : ランダムをやめて優先順位を入れる(一番コスパ良い) …
合法手に点数を付けて一番良い手を選ぶだけ。型はこう →
倒せる相手は倒す(リーサル) > 攻撃できるなら攻撃 > 毎ターンのエネルギー付け > 進化できるなら進化 > ドロー/サーチで手札補充 > 瀕死のアタッカーは下げる - Lv3 : 局面を点数化する … 手を打った後の"自分の有利さ"を数値化(自軍の合計HP・エネルギー数・相手のサイド残り・手札枚数・倒せる相手の有無)。各合法手を1手だけ試して、評価が最大の手を選ぶ"貪欲法"。
- Lv4 : 少し先読み … 余裕が出たら数手先読み or モンテカルロ(ランダムに何度も試して勝率が高い手を選ぶ)。不完全情報+制限時間なので軽めに。
- Lv5 : 学習(RL/模倣) … PPO等の強化学習や上位エージェントの模倣。上級。Lv1〜3だけで十分ラダーは登れるので後回しでOK。
Lv3でやることの正式名称。先のことは考えず、その場でいちばん良さそうな選択肢を毎回選ぶ方法です。実装が簡単で速い一方、目先の得に釣られて長期的に損をするのが弱点(いま攻撃するより準備した方が良い場面、など)。
今わかっている一番良い手を使う(活用)か、まだ試していない手を試す(探索)か、というトレードオフ。活用ばかりだと未知のもっと良い手に出会えず、探索ばかりだと勝てません。強化学習の中心的なテーマで、G検定でも頻出です。
一定確率でわざとランダムな手を選ぶ ε-greedy法 が最も基本的な対処法。「1つずつ変えて勝率を測る」という改善の進め方自体も、探索と活用のバランス取りにほかなりません。
Lv4の「ランダムに何度も試して勝率が高い手を選ぶ」の正式名称。その手を打った先をランダムに何度もプレイさせ、勝率が高かった手を採用するという考え方で、盤面の良し悪しを人間が定義しなくて済むのが強みです。
AlphaGoが囲碁で人間のトップ棋士を破った際の中核技術(ディープラーニングと組み合わせて使用)。G検定の定番トピックでもあります。
最初の3日プラン(迷子脱出用)
- Day 1 … 公式サンプル(ルールベース)をそのまま提出して、動作とラダー掲載を確認。
- Day 2 … デッキを強いものに差し替え、旧版とローカル対戦で勝率を比較。
- Day 3 … 優先順位(攻撃→エネ付け→進化→ドロー)を1つずつ足し、都度勝率を計測。
Titanicで身につけたことは、ここでどう効く?
「予測モデルの話は終わったから、ここは全部ゼロから?」——そんなことはありません。効くもの・新しく必要なものを分けておきます。
| コース1〜3で身につけたこと | ポケモンAI編での効き方 |
|---|---|
| まずベースラインを提出する | そのまま最重要。「合法手をランダムに返すAI」がここでのベースライン |
| 1つずつ変えて効果を測る | そのまま通用。ただし測る道具が正解率ではなく勝率になる |
| 手元の検証を信じる(CV) | ローカル対戦の勝率がCVの役割。提出枠を無駄にしないための命綱 |
| Descriptionに記録を残す | そのまま。「どのバージョンで何を変えたか」が分からなくなると改善が止まる |
| 公開Notebookを Copy & Edit | そのまま。むしろAPI仕様が公開サンプルにしか書かれていないぶん必須度が高い |
| 新しく必要になるのは … ①ゲームのルール理解 ②絶対に落ちないコードを書く姿勢 ③1試合の結果ではなく勝率で判断する忍耐。機械学習の知識そのものは、実はほとんど要りません。 | |
ポケモンAI編 修了 : 対戦AIを提出できた ⚡
予測CSVとは別世界の「エージェント提出型コンペ」の入り方——公式Fork → 合法手を返す最小エージェント → tar.gzで提出 → Eloラダー、までを掴みました。開催中の大会に、今日から実際に参加できます。
データ分析・機械学習の「流れ」と用語の地図
手を動かすコースの裏側には、決まった型(プロセス)があります。ここではその全体の流れと、各工程で必ず出てくる用語を一気に整理します。G検定(JDLA ジェネラリスト検定)の出題範囲を意識した構成なので、資格を視野に入れている人の下地にもなります。
コードは出てきません。読み物として流し読み → コースで手を動かす → また戻ってくる、の順がいちばん定着します。
機械学習プロジェクトは 「課題設定 → データ収集 → データ理解(EDA) → 前処理 → モデリング → 評価 → 運用」 の順に進み、行ったり来たりしながら精度を上げていきます。Kaggleは工程1・2を主催者が済ませてくれているので、工程3〜6の練習に集中できる場所です。時間の大半を食うのは前処理と特徴量作りで、モデル選びではありません。
分析プロジェクトは、この7工程をぐるぐる回る
この流れには CRISP-DM という業界標準の名前がついています。1990年代に策定され、今でもデータ分析プロセスの共通言語として使われています。
分析プロジェクトを ビジネス理解 → データ理解 → データ準備 → モデリング → 評価 → 展開(デプロイ) の6フェーズで表したプロセスモデル。一方通行ではなく循環する(戻る)のが最大のポイントで、「評価してダメだったらデータ準備に戻る」が前提になっています。
G検定でも「AIプロジェクトの進め方」として頻出。似た枠組みに KDD(Knowledge Discovery in Databases)、実務寄りのものに MLOps があります。
fit)。ハイパーパラメータの調整もここ。
機械学習は大きく3種類。まずどれかを見分ける
「答え(正解ラベル)があるか」「何を最大化するか」で3つに分かれます。手元のデータがどれに当たるかを判断するのが最初の分岐点です。
答え付きデータから法則を学ぶ。分類(カテゴリを当てる)と回帰(数値を当てる)。Titanicは分類。
答えなしで構造を見つける。クラスタリング(仲間分け)、次元削減(情報を圧縮)、異常検知など。
試行錯誤しながら報酬の合計が最大になる行動を学ぶ。AlphaGoやゲームAI、ロボット制御。
| 種類 | タスク | やること | 代表的な手法 |
|---|---|---|---|
| 教師あり | 分類 Classification |
カテゴリを当てる 生存/死亡、迷惑メールか否か、ジャンル判定 |
ロジスティック回帰・決定木・ランダムフォレスト・SVM・k-NN |
| 回帰 Regression |
連続した数値を当てる 住宅価格、来客数、株価 |
線形回帰・リッジ/ラッソ回帰・勾配ブースティング | |
| 教師なし | クラスタリング |
似たもの同士をグループに分ける 顧客セグメント分け |
k-means法・階層的クラスタリング |
| 次元削減 |
情報をなるべく保ったまま列を減らす 可視化、前処理 |
主成分分析(PCA)・t-SNE | |
| 強化学習 | 方策の学習 |
行動 → 報酬 → 行動…を繰り返して最適な戦略を得る ゲーム、ロボット、推薦 |
Q学習・DQN・方策勾配法 |
前処理の道具箱 : 欠損・カテゴリ・スケール・外れ値
集めたままのデータは、たいていそのままではモデルに入りません。「モデルが食べられる形に整える」のが前処理です。分析作業の体感8割がここ、と言われます。
1. 欠損値をどうするか
空欄(NaN)があると多くのモデルは学習できません。対処は大きく「消す」か「埋める」の2択です。
| 方針 | やり方 | 向いている場面 / 注意 |
|---|---|---|
| 消す |
欠損のある行を落とす(リストワイズ削除) 欠損だらけの列ごと落とす |
欠損がごく少ないとき。行を消すとデータ量が減り、偏りが生まれる危険も。Titanicの
Cabin(7割欠損)は列ごと落とす判断が定番。
|
| 埋める 補完/代入 |
平均値・中央値・最頻値で埋める 前後の値で埋める(時系列) 他の列から予測して埋める |
最も一般的。外れ値の影響を受けにくい中央値が無難。埋めた値は「作り話」なので、欠損だったこと自体を1/0の列で残すと精度が上がることも。 |
| そのまま | 欠損に対応したモデルを使う | LightGBM/XGBoostなどは欠損をそのまま扱えます。「欠けている」こと自体が情報になる場合に有効。 |
欠損を何らかの値で埋めること。df["Age"].fillna(df["Age"].median())
が典型例。欠損がどう発生したか(ランダムなのか、特定の人だけ答えなかったのか)で適切なやり方が変わります。
統計では欠損の発生の仕方を MCAR(完全にランダム) / MAR(他の観測値で説明できる) / MNAR(欠損した値そのものに依存)の3つに分類します。MNARを単純な平均補完で埋めると結論が歪みます。
2. カテゴリ変数を数値にする(エンコーディング)
male/female のような文字列は、そのままでは計算できません。数値に変換します。
| 手法 | 変換のしかた | 使いどころ |
|---|---|---|
| ラベルエンコーディング | 赤=0, 青=1, 緑=2 のように連番を振る | 列が増えず手軽。ただし「緑>青>赤」という大小関係が無いのに生まれるため、線形モデルとは相性が悪い。決定木系なら概ねOK。 |
| ワンホットエンコーディング | 「赤か?」「青か?」「緑か?」の0/1の列に分解する |
大小関係が生まれず安全で最も一般的。ただし種類が多いと列が爆発する(次元の呪い)。pd.get_dummies()
|
| ターゲットエンコーディング | カテゴリごとの目的変数の平均値に置き換える | Kaggleで強力。ただし答えを使うのでリーク(カンニング)が起きやすく、交差検証と組み合わせた慎重な実装が必要。 |
3. 数値の大きさを揃える(スケーリング)
年齢(0〜80)と年収(0〜1000万)を並べると、単位が大きい列だけが強く効いてしまう手法があります。そこで尺度を揃えます。
最小値0・最大値1の範囲に押し込める変換。値の範囲がはっきり決まっているときや画像の画素値(0〜255→0〜1)でよく使います。外れ値に弱いのが弱点。
平均0・分散1になるように変換する方法。「平均から標準偏差いくつ分離れているか」に揃えます。外れ値に比較的強く、迷ったらこちら。
必要な手法:
線形回帰・ロジスティック回帰・SVM・k-NN・k-means・ニューラルネットワーク(距離や重みを使うもの)。
ほぼ不要: 決定木・ランダムフォレスト・勾配ブースティング(分岐の順序しか見ないため)。
4. 外れ値・不均衡・次元
他から極端に離れた値。入力ミスなら除去、本物なら残すか対数変換で潰す。箱ひげ図や四分位範囲(IQR)で見つけるのが定番です。「消せばよい」とは限らないのが難しいところ。
「正常99% : 異常1%」のようにクラスの数が極端に偏ったデータ。全部「正常」と答えるだけで正解率99%になるため、正解率で評価してはいけません。対策は少数側を増やすオーバーサンプリング(SMOTEなど)、多数側を減らすアンダーサンプリング、重み付けなど。
列(次元)が増えるほどデータが空間内でスカスカになり、必要なサンプル数が爆発的に増える現象。だから闇雲に特徴量を増やすのではなく、効く列を選ぶ(特徴量選択)、圧縮する(次元削減 / 主成分分析 PCA)といった手当てをします。
過学習との戦いが、モデル作りの本体
機械学習の目的は「学習データで高得点を取ること」ではなく まだ見ぬデータで当てること(汎化性能)。この一点を守るための作法が固まっています。
過学習=学習データを丸暗記して未知のデータに弱い状態(モデルが複雑すぎ)。未学習=そもそも学習データすら当てられない状態(モデルが単純すぎ)。ちょうど良い複雑さを探す作業がモデリングです。
誤差は バイアス(単純すぎて的を外す)+バリアンス(データのブレに振り回される)+ノイズに分解できます。片方を下げるともう片方が上がるため、両者の和が最小になる点を狙います。未学習=高バイアス、過学習=高バリアンス。
手元のデータを訓練用と検証用に分けて採点するのがホールドアウト法。分け方の運に左右されるので、k個に分けて1個を検証用にする作業をk回繰り返し平均を取るのがk分割交差検証(k-fold CV)です。k=5 や 10 が定番。
クラス比率を保って分ける層化(Stratified)、時系列では未来を使わない時系列分割が必要になります。
「係数が大きくなりすぎたら罰金」というペナルティを損失関数に足して、モデルが複雑になりすぎるのを抑える技術。L1正則化(ラッソ)は不要な係数をピタリと0にするので特徴量選択の効果があり、L2正則化(リッジ)は係数全体を小さく抑えます。両方使うのが Elastic Net。
パラメータは学習の結果としてモデルが自動で決める値(重み・係数)。ハイパーパラメータは人間が事前に決める設定値(木の本数、深さ、学習率など)。後者を探す作業がグリッドサーチ / ランダムサーチ / ベイズ最適化です。
本来使えないはずの情報(答え・未来の情報・テストデータの統計量)が学習に混ざってしまうこと。検証スコアだけ異常に高く、本番でガタ落ちするのが典型症状。Kaggleで「CVは0.99なのにLBは0.6」となったらまずこれを疑います。
「正解率」だけでは足りない理由
1000人に1人の病気を「全員陰性」と判定するモデルは、正解率99.9%です。でも役に立ちません。何を測るかは課題によって選び分ける必要があります。
すべての出発点 : 混同行列
| 予測 : 陽性(1) | 予測 : 陰性(0) | |
|---|---|---|
| 実際 : 陽性(1) |
TP真陽性 当たり |
FN偽陰性 見逃し(あるのに無いと判定) |
| 実際 : 陰性(0) |
FP偽陽性 誤検知(無いのにあると判定) |
TN真陰性 当たり |
| 指標 | 意味 | 計算 | 重視する場面 |
|---|---|---|---|
| 正解率 Accuracy |
全体のうち当たった割合 | (TP+TN) / 全体 | クラスの数が偏っていないとき。不均衡データでは使えない |
| 適合率 Precision |
陽性と予測したうち、本当に陽性だった割合 | TP / (TP+FP) | 誤検知を減らしたいとき。迷惑メール判定(大事なメールを弾きたくない) |
| 再現率 Recall |
本当の陽性のうち、拾えた割合 | TP / (TP+FN) | 見逃しを減らしたいとき。病気の検査、不正検知 |
| F値 F1-score |
適合率と再現率の調和平均 | 2PR / (P+R) | 両者のバランスを1つの数字で見たいとき |
| ROC-AUC | しきい値を動かしたときの性能を面積で表したもの(0.5=でたらめ、1.0=完璧) | ROC曲線の下側面積 | しきい値に依らず順位付けの良さを見たいとき。不均衡データでも比較的頑健 |
回帰(数値を当てる)の指標
- MSE(平均二乗誤差) … 誤差を2乗して平均。大きな外れを強く罰する。
- RMSE … MSEの平方根。元のデータと単位が揃うので解釈しやすい。Kaggleの回帰コンペで最頻出。
- MAE(平均絶対誤差) … 誤差の絶対値の平均。外れ値の影響を受けにくい。
- 決定係数 R² … 「平均で予測する場合と比べてどれだけマシか」。1に近いほど良く、0なら平均と同じ、マイナスもあり得る。
名前だけは知っておきたい主要アルゴリズム
全部覚える必要はありません。「どういうときに使うのか」だけ掴んでおくと、公開Notebookが一気に読めるようになります。
| 手法 | ざっくり何をしている? | 特徴 |
|---|---|---|
| 線形回帰 | 点の真ん中を通る直線(平面)を引く | 最もシンプル。係数を読めば解釈しやすい |
| ロジスティック回帰 | 0〜1の確率を出してしきい値で分類する | 分類の基本形。軽くて解釈しやすい |
| 決定木 | Yes/Noの質問を枝分かれさせて答えに至る | 人間が読める。単体では過学習しやすい |
| ランダムフォレスト | 少しずつ違う決定木を大量に作って多数決 | バギングの代表。安定して強く、調整が少なくて済む |
|
勾配ブースティング XGBoost / LightGBM / CatBoost |
前の木の間違いを次の木が補う形で順番に足していく | ブースティングの代表。表形式データでは現在の主力 |
| SVM(サポートベクターマシン) | 境界線とデータの余白(マージン)が最大になる線を引く | カーネル法で曲がった境界も扱える。データが多いと重い |
| k-NN(k近傍法) | 近くのk個の仲間の多数決で決める | 学習がほぼ不要。スケーリング必須 |
| ナイーブベイズ | 各特徴が独立と仮定して確率を掛け合わせる | テキスト分類(迷惑メール判定)で古典的に強い |
| k-means法 | データをk個の塊に分ける(教師なし) | クラスタリングの定番。kは人間が決める |
| 主成分分析(PCA) | 情報の損失が少なくなるように列を圧縮する(教師なし) | 次元削減・可視化の定番 |
弱いモデルを組み合わせて強くする考え方。並列に作って多数決するバギング(=ランダムフォレスト)、順番に弱点を補うブースティング(=XGBoost等)、複数モデルの予測をさらに別のモデルで統合するスタッキングがあります。Kaggle上位は必ずと言っていいほど使います。
あらゆる問題で万能に最強なアルゴリズムは存在しないという定理。だから「とりあえずこれを使えば勝てる」は無く、データを見て試すしかない——という実務感覚の理論的な裏づけです。G検定の頻出用語。
ニューラルネットワークの基礎用語
G検定の主戦場です。ここは「言葉と役割の対応」を押さえるだけで、かなり読めるようになります。
| 用語 | 役割 |
|---|---|
| ニューラルネットワーク | 入力層 → 隠れ層 → 出力層と信号を伝える構造。層を深く重ねたものがディープラーニング。各つながりが持つ重みとバイアスを学習で調整します。 |
| 活性化関数 | 信号を次の層へ渡すときの変換。シグモイド(0〜1)、tanh、ReLU(0以下は0、正はそのまま/現在の標準)、出力を確率分布にするソフトマックス。これが無いと何層重ねてもただの直線になります。 |
| 損失関数 | 予測と正解のズレを測る関数。回帰は二乗誤差、分類は交差エントロピーが定番。これを小さくするのが学習。 |
| 勾配降下法 | 損失が小さくなる方向へ重みを少しずつ動かす方法。一歩の大きさが学習率。少量ずつ処理するミニバッチ学習(SGD)が一般的。発展形に Momentum・AdaGrad・RMSProp・Adam。 |
| 誤差逆伝播法 | 出力側の誤差を入力側へ逆向きに伝えて各層の重みの直し方を求める仕組み。ディープラーニングを実用化した中核技術。 |
| 勾配消失問題 | 層を深くすると誤差が入力側に届く頃にはほぼ0になり学習が進まない問題。ReLU・バッチ正規化・残差接続(ResNet)などで克服されました。 |
| CNN(畳み込みニューラルネットワーク) | 畳み込み層で局所的な特徴を抽出し、プーリング層で位置ズレに強くする。画像認識の主役。AlexNet・VGG・ResNet。 |
| RNN / LSTM / GRU | 前の時刻の出力を次に渡し、時系列や文章を扱う。長期の記憶が苦手なRNNを改良したのがLSTM・GRU。 |
| Transformer / 注意機構 | 2017年の論文「Attention Is All You Need」で登場。Attention(どこに注目するか)だけで系列を処理し、並列計算できるため大規模化に成功。BERT・GPTなど現在の大規模言語モデルの土台。 |
| 事前学習とファインチューニング | 巨大データで汎用的に学習させた基盤モデルを、手元の少ないデータで微調整して使う流れ。ゼロから学習するより圧倒的に効率的で、これを転移学習と呼びます。 |
| 生成AI | 文章・画像・音声などを作り出すモデル。GAN(生成器と識別器を競わせる)、VAE、拡散モデル(ノイズから画像を復元)、大規模言語モデル(LLM)。もっともらしい嘘を言うハルシネーションが課題。 |
AIの3度のブームと、そこで生まれた問い
G検定では歴史と、それぞれの時代で「何ができて何ができなかったか」がよく問われます。
押さえておきたい古典的な問い
| 用語 | 内容 |
|---|---|
| チューリングテスト | 1950年、アラン・チューリングが提案。人間の判定者が会話相手を機械だと見抜けなければ知能があると見なすという判定法。 |
| 強いAI / 弱いAI | 哲学者ジョン・サールの区分。強いAI=人間と同じように心を持ち意味を理解するAI、弱いAI=特定の仕事をこなす道具としてのAI。現在実現しているのはすべて弱いAI。 |
| 中国語の部屋 | サールによる思考実験。マニュアル通りに記号を操作して正しく応答できても、意味を理解しているとは限らないという反論。 |
| フレーム問題 | 現実の課題で「今何を考慮すべきか」の範囲を切り出せないという難問。関係する事柄が無限にあるため、AIは計算が終わらなくなる。 |
| シンボルグラウンディング問題 | 記号(言葉)と、それが指す実世界の意味を結びつけられないという問題。「シマウマ」の記号を知っていても実物と結びつかない。 |
| シンギュラリティ | 技術的特異点。AIが自ら自分より賢いAIを作り始め、人間の予測を超える転換点。レイ・カーツワイルは2045年と予測。 |
データを扱う人が知っておくべきルール
G検定の後半はここが厚めに出ます。技術ではなく「使い方」の話で、Kaggleでデータを公開したり業務でモデルを作るときにも直結します。
| テーマ | 要点 |
|---|---|
| 個人情報保護法 | 個人を特定できる情報の取り扱いルール。特定できないよう加工した匿名加工情報、他の情報と照合しなければ特定できない仮名加工情報という枠組みがあり、条件を満たせば分析利用の幅が広がります。取得時には利用目的の特定・通知が必要。 |
| GDPR(EU一般データ保護規則) | EUの厳しい個人データ保護規則。域外の企業にも適用され得ます。データポータビリティや忘れられる権利、自動処理のみによる決定に異議を唱える権利などを定めています。 |
| 著作権法 第30条の4 | 日本では情報解析(機械学習の学習)目的であれば、著作物を原則利用できると定められています。ただし「著作権者の利益を不当に害する場合」は除外され、生成物が既存作品に類似する場合は別途侵害の問題が生じます。 |
| AI事業者ガイドライン | 総務省・経済産業省がまとめた国内の指針。人間中心・安全性・公平性・透明性・アカウンタビリティといった原則を、開発者/提供者/利用者の立場別に整理しています。 |
| EU AI Act | 世界初の包括的なAI規制法。用途をリスクの高さで4段階に分類し、許容できないリスク(社会的スコアリング等)は禁止、高リスク用途には厳しい義務を課すリスクベースアプローチを採ります。 |
| 公平性・バイアス | 学習データに社会の偏りが含まれていれば、モデルはそれをそのまま学習し増幅します(採用選考で特定の性別が不利になる等)。データの偏りを点検するのは開発者の責任。 |
| 説明可能AI(XAI) | 「なぜその予測になったか」を人間に説明できるようにする研究分野。ブラックボックス問題への対処で、医療・金融・採用など説明責任が求められる領域で必須。代表的な手法に LIME・SHAP。 |
| 生成AIのリスク | ハルシネーション(もっともらしい嘘)、ディープフェイク、機密情報の入力による漏洩、プロンプトインジェクション、著作権侵害。「出力をそのまま信じない」運用設計が前提になります。 |
G検定ってなに? Kaggleとどう組み合わせる?
日本ディープラーニング協会(JDLA)が実施する、ディープラーニングを「事業に活かす人」向けの知識検定。実装はせず、用語・仕組み・歴史・法律や倫理まで幅広く問われます。オンラインで受験でき、多肢選択式で問題数が多いのが特徴。
実装者向けの上位資格が E資格(こちらは認定プログラムの受講が受験条件で、コーディングを含む)。試験時間・問題数・シラバスは改定されるので、受験前に必ず公式サイトで最新の実施要項を確認してください。
出題範囲と、このページの対応
| G検定のテーマ | このページで読むところ |
|---|---|
| 人工知能とは / AIをめぐる動向・問題 | セクション8「歴史と論点」 |
| 機械学習の具体的手法 | セクション2「問題の型」・6「アルゴリズム」 |
| ディープラーニングの概要・手法 | セクション7「ディープラーニング」 |
| モデルの評価・チューニング | セクション4「学習と検証」・5「評価指標」 |
| データの取り扱い・前処理 | セクション3「前処理」 |
| AIの社会実装・法律・倫理 | セクション1「全体像」・9「法律・倫理」 |
次に読むと良いもの
- JDLA公式サイト … シラバス・実施日程・推薦図書。まずここで最新情報を確認。
- 公式テキスト / 問題集 … 範囲が広いので、通読より問題を解いて知らない用語を潰す方が効率的。
- Kaggleの公開Notebook … このページの用語が実際にどう使われるかを見る。「Titanic EDA」で検索。
3問クイズ
Q1.1000人に1人しか陽性がいない検査データで、モデルの良し悪しを見るのに不適切な指標は?
Q2.学習データの正解率は99%なのに、検証データでは65%しか出ません。何が起きている?
Q3.数値の尺度を揃える「標準化」がほぼ不要な手法はどれ?
全コース制覇!
Kaggleの全体像 → データ探索 → コンペ初提出、そして野球の分析、音楽データでの発見、対戦AIエージェントの提出まで、ぜんぶ自分の手で走り切りました。あなたはもう「Kaggleが分からない人」ではありません。次はぜひ、気になったコンペで Copy & Edit の写Notebookループを回してみてください。