総仕上げ:最初から最後まで、1つのコードで
レッスン1〜6の手順を、1つのコードにまとめます。演習では、この流れのうち大事なところを埋めて、テストデータでの結果を確かめます。
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.compose import make_column_transformer
from sklearn.pipeline import make_pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import f1_score, recall_score, precision_score
# 2. データを確かめて、直す
df = pd.read_csv("/data/course-completion.csv")
df.loc[df["最初の週の学習時間"] > 7 * 24 * 60, "最初の週の学習時間"] = np.nan
# 3. 使う列を選び、前処理をまとめる
X = df.drop(columns=["受講者ID", "修了証までの日数", "途中でやめた"])
y = df["途中でやめた"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0, stratify=y)
num = ["最初の週の学習時間", "最初の週のレッスン数", "最初の週の正解数", "ヒントを見た割合", "連続学習日数"]
cat = ["端末", "申し込みの経路", "年代"]
pre = make_column_transformer(
(make_pipeline(SimpleImputer(strategy="median"), StandardScaler()), num),
(OneHotEncoder(handle_unknown="ignore"), cat),
)
model = make_pipeline(pre, LogisticRegression(max_iter=1000))
# 4. 交差検証で確かめてから、訓練データ全体で学習する
cv_f1 = cross_val_score(model, X_train, y_train, cv=5, scoring="f1").mean()
model.fit(X_train, y_train)
# 5. しきい値を決めて、テストデータで一度だけ確かめる
pred = (model.predict_proba(X_test)[:, 1] >= 0.5).astype(int)
print(cv_f1, f1_score(y_test, pred), recall_score(y_test, pred), precision_score(y_test, pred))
# → 約 0.779 0.792 0.868 0.728
結果は、レッスン4・5で見たとおり、交差検証のF値0.779、テストのF値0.792、再現率0.868、適合率0.728です。この後、レッスン6のようにグループごとの点検をして、モデルカードにまとめれば、使い始める準備が整います。
これまでの章とのつながり
このコードの1行1行は、これまでの章で学んだことです。
read_csv・欠損・分布の確認: 第3章(pandas)、第13章レッスン2
train_test_split と、テストは最後に一度だけ: 第5章・第8章
- 中央値で埋める・標準化・one-hot・Pipeline: 第3章・第8章・第9章・第12章
- ロジスティック回帰: 第5章、交差エントロピーの正体は第10章
- 交差検証・F値・しきい値: 第8章・第9章
1つ1つは小さな道具ですが、正しい順番で組み合わせると、「目的に合わせて、データから予測を作り、確かめて使う」という、AI開発の全体になります。
自分のデータで試す
最後に、同じ手順を、自分で用意したデータ で試します。この場は採点しません。うまくいかなくても、それ自体が大切な発見です(「このデータでは予測できない」と分かることも、AI開発の立派な結果です)。
データの用意
- 表計算ソフトで作った表を、CSV形式 で保存します(10MBまで)
- 1行に1件(1日分、1回分など)、1列に1つの項目を入れ、1行目に列の名前を書きます
- 予測したい列(正解)を1つ決めておきます。例えば「次の日の調子(よい: 1、よくない: 0)」
- 例: 毎日の睡眠時間・運動の時間・スマホを使った時間と、次の日の調子。部活の練習の内容と、その週の記録
進め方(レッスン1〜6と同じ)
- 企画シートを書く: 目的・使い方・予測するもの・使える情報・評価指標・ベースライン
- データを確かめる: 下のひな形を実行して、行と列の数、欠損、分布を見る
- 前処理とモデル: 下の「モデルのひな形」を貼り付けて、列の名前を書き換える
- ベースラインと比べ、交差検証で確かめる
- 間違いを調べ、しきい値を考える
- 点検と、モデルカード(自分用のメモでよい)
ファイルを選ぶ前に
- 選んだファイルは、この端末のブラウザの中だけで処理します。サーバーには送らず、記録もしません。
- ほかの人の個人情報(名前・連絡先など)や、病歴などの特に慎重に扱うべき情報が入ったデータは使わないでください。
- 自分で集めたデータや、使ってよいと決められている公開データを使ってください。
- 18歳未満の人は、家族などの身近な大人と一緒に、どんなデータを使うか決めてください。
ファイルを選ばなくても、コードは実行できます。
初めてのときは、Pythonの準備に約21MBの通信があります
記録するのは、取り組んだ日時だけです(ファイルやコードは記録しません)。修了の条件には含みません。
モデルのひな形(データを確かめた後、上のコードの下に貼り付けて、列の名前を書き換えます)
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.compose import make_column_transformer
from sklearn.pipeline import make_pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.linear_model import LogisticRegression
from sklearn.dummy import DummyClassifier
num = ["数の列1", "数の列2"] # 数の列の名前(書き換える)
cat = ["文字の列1"] # 文字の列の名前(なければ [] にする)
X = df[num + cat]
y = df[TARGET]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0, stratify=y)
pre = make_column_transformer(
(make_pipeline(SimpleImputer(strategy="median"), StandardScaler()), num),
(OneHotEncoder(handle_unknown="ignore"), cat),
)
for name, m in [("ベースライン", DummyClassifier(strategy="most_frequent")), ("ロジスティック回帰", LogisticRegression(max_iter=1000))]:
score = cross_val_score(make_pipeline(pre, m), X_train, y_train, cv=5, scoring="f1").mean()
print(name, round(score, 3))
データが少ない(数十行)ときは、交差検証の結果が大きくぶれます(第8章)。「5分割のそれぞれで、どれくらい値が違うか」も見てみましょう。正解が「1と0」でない場合(例えば「よい・ふつう・悪い」)は、scoring="f1_macro" にします。
取り組んだら、上の「自分のデータで試す」の一番下にあるボタンで記録できます(ログインが必要です)。記録するのは日時だけで、ファイルやコードは記録しません。修了の条件には含みません。
この章の振り返りと、これから
この章の振り返り
- 課題を決める: 企画シート(目的・使い方・予測するもの・使える情報・評価指標・ベースライン・成功の基準)。AIを使うべきか
- データを確かめる: 出典・同意・個人情報、欠損・分布・ありえない値、欠損と正解の結び付き(リークの手がかり)
- 前処理: 列を選ぶ、ありえない値を欠損に、中央値で埋める・one-hot・標準化を Pipeline に。リークは前処理しだいで隠れる
- モデルを比べる: ベースライン、交差検証で選び、テストは一度だけ。単純なモデルが勝つこともある
- 評価と改善: 混同行列、しきい値は使い方で決める、誤りを調べる。効かない改善は採用しない
- 点検と報告: グループごとの評価、説明性・再現性、モデルカード
- 総仕上げ: 最初から最後まで通し、自分のデータでも試す
この講座で学んだこと
中学校の数学から始めて、ベクトル・関数・勾配降下法(第4章)、分類と評価(第5章)、ニューラルネットワーク(第6章)、CNN(第7章)、学習の工夫(第8章)、AIを正しく使うこと(第9章)、確率・統計・情報理論(第10章)、いろいろな機械学習(第11章)、系列データと Transformer(第12章)まで進み、最後に自分でAIを企画・実装・評価する流れを通しました。
これから
- もっと大きなモデル: PyTorch を自分のパソコンや Google Colab などで動かし、第7章・第12章のモデルを本物のデータで学習させる(ブラウザの外で動かすため、それぞれのサービスの利用規約を確かめて使う)
- 応用の分野: 物体検出・画像の生成・音声・強化学習など。この講座の基礎(損失・勾配・評価・点検)は、どの分野でも同じように使える
- 資格: E資格の出題範囲の多くは、この講座で学んだ内容と重なっています。暗記ではなく、「なぜそうなるか」を説明できることを目標にしてください
AIは、正しく作り、正しく使えば、人の役に立つ道具です。この講座で身に付けた「数字を確かめ、限界を知り、人への影響を考える」習慣を、これからも大切にしてください。