本文へスキップ
ひもとくAI

総仕上げ:最初から最後まで通し、自分のデータでも試す

レッスン 7/7

総仕上げ:最初から最後まで、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と同じ)

  1. 企画シートを書く: 目的・使い方・予測するもの・使える情報・評価指標・ベースライン
  2. データを確かめる: 下のひな形を実行して、行と列の数、欠損、分布を見る
  3. 前処理とモデル: 下の「モデルのひな形」を貼り付けて、列の名前を書き換える
  4. ベースラインと比べ、交差検証で確かめる
  5. 間違いを調べ、しきい値を考える
  6. 点検と、モデルカード(自分用のメモでよい)

ファイルを選ぶ前に

  • 選んだファイルは、この端末のブラウザの中だけで処理します。サーバーには送らず、記録もしません。
  • ほかの人の個人情報(名前・連絡先など)や、病歴などの特に慎重に扱うべき情報が入ったデータは使わないでください。
  • 自分で集めたデータや、使ってよいと決められている公開データを使ってください。
  • 18歳未満の人は、家族などの身近な大人と一緒に、どんなデータを使うか決めてください。

文字化けしたら Shift_JIS を選んでください(Windows の表計算ソフトの書き出しに多い)

ファイルを選ばなくても、コードは実行できます。

my_analysis.pyPython
初めてのときは、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" にします。

取り組んだら、上の「自分のデータで試す」の一番下にあるボタンで記録できます(ログインが必要です)。記録するのは日時だけで、ファイルやコードは記録しません。修了の条件には含みません。

この章の振り返りと、これから

この章の振り返り

  1. 課題を決める: 企画シート(目的・使い方・予測するもの・使える情報・評価指標・ベースライン・成功の基準)。AIを使うべきか
  2. データを確かめる: 出典・同意・個人情報、欠損・分布・ありえない値、欠損と正解の結び付き(リークの手がかり)
  3. 前処理: 列を選ぶ、ありえない値を欠損に、中央値で埋める・one-hot・標準化を Pipeline に。リークは前処理しだいで隠れる
  4. モデルを比べる: ベースライン、交差検証で選び、テストは一度だけ。単純なモデルが勝つこともある
  5. 評価と改善: 混同行列、しきい値は使い方で決める、誤りを調べる。効かない改善は採用しない
  6. 点検と報告: グループごとの評価、説明性・再現性、モデルカード
  7. 総仕上げ: 最初から最後まで通し、自分のデータでも試す

この講座で学んだこと

中学校の数学から始めて、ベクトル・関数・勾配降下法(第4章)、分類と評価(第5章)、ニューラルネットワーク(第6章)、CNN(第7章)、学習の工夫(第8章)、AIを正しく使うこと(第9章)、確率・統計・情報理論(第10章)、いろいろな機械学習(第11章)、系列データと Transformer(第12章)まで進み、最後に自分でAIを企画・実装・評価する流れを通しました。

これから

  • もっと大きなモデル: PyTorch を自分のパソコンや Google Colab などで動かし、第7章・第12章のモデルを本物のデータで学習させる(ブラウザの外で動かすため、それぞれのサービスの利用規約を確かめて使う)
  • 応用の分野: 物体検出・画像の生成・音声・強化学習など。この講座の基礎(損失・勾配・評価・点検)は、どの分野でも同じように使える
  • 資格: E資格の出題範囲の多くは、この講座で学んだ内容と重なっています。暗記ではなく、「なぜそうなるか」を説明できることを目標にしてください

AIは、正しく作り、正しく使えば、人の役に立つ道具です。この講座で身に付けた「数字を確かめ、限界を知り、人への影響を考える」習慣を、これからも大切にしてください。

演習

演習を読み込んでいます…