こんにちは
前回は、コンテンツの類似度を基にした簡易的な推奨アルゴリズムの実装について検討しました。今回は、一歩進めて、推奨されたコンテンツに関連する確認テストの正解率を予測する方法を考えてみます。
次に学習すべき教材やその確認テストを選ぶ際、学習者の習熟度と教材の内容の類似度を計算することで、最も適切な教材を推奨するアルゴリズムを前回は実装しました。しかしながら、類似度が高いからといって、それが最も適切な教材であるとは限りません。あまりにも簡単すぎる、あるいは難しすぎる教材は、学習者にとって最適とは言えないでしょう。
例えば、推奨されたテストの正解率が極端に低い場合、それは学習者にとって難易度が高すぎる可能性があります。逆に、正解率が100%という結果になれば、それは易しすぎるということになります。
そこで、この正解率を計算し、適切な正解率(例: 60%)の範囲でコンテンツを推奨するようなアプローチを取ることが考えられます。
前回のコードで、user_2の受講者へvideo_id 102を推奨するという結果となりました。
この結果を受けて、その教材に関連するテストを受験してどの程度の正解率となるのかを計算するコードを考えてみました。
ダミーデータは以下のように、10章から構成される教材の3章までの確認テスト結果があるという前提です。
data = {
'user_id': [1]*30 + [2]*30 + [3]*30,
'video_id': [101]*10 + [102]*10 + [103]*10 + [101]*10 + [102]*10 + [103]*10 + [101]*10 + [102]*10 + [103]*10,
'question_id': list(range(1, 31)) * 3,
'chapter': [1]*10 + [2]*10 + [3]*10 + [1]*10 + [2]*10 + [3]*10 + [1]*10 + [2]*10 + [3]*10,
'correct': [1, 0, 1, 0, 1, 1, 1, 0, 1, 0, # 受験者1, 章1
1, 1, 1, 1, 1, 1,1, 1, 1, 1, # 受験者1, 章2
1, 0, 1, 0, 1, 1, 1, 0, 1, 0, # 受験者1, 章3
1, 0, 1, 1, 0, 0, 1, 1, 0, 1, # 受験者2, 章1
0, 0, 0, 1, 0, 0, 1, 1, 0, 0, # 受験者2, 章2
1, 0, 0, 0, 1, 0, 1, 1, 0, 1, # 受験者2, 章3
0, 1, 0, 0, 0, 1, 0, 1, 1, 0, # 受験者3, 章1
0, 0, 0, 0, 0, 1, 0, 0, 1, 1, # 受験者3, 章2
1, 0, 1, 1, 1, 0, 1, 0, 1, 0] # 受験者3, 章3
}
df = pd.DataFrame(data)
このデータを元に、以下の手順でモデルを訓練しました:
特徴量としてuser_id, video_id, question_id, chapterを使用します。
目的変数としてcorrectを使用します。
このデータを訓練データとテストデータに分割します。
XGBoostなどの分類モデルを使用してモデルを訓練します。
訓練したモデルを使用して、user_id 2がvideo_id 102の関連テストを受験した際の正解確率を予測します。
モデルは、XGBoostでハイパーパラメータはデフォルトです。
# 特徴量と目的変数を指定
X = df[['user_id', 'video_id', 'question_id', 'chapter']]
y = df['correct']
# データを訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# XGBoostのモデルの初期化
model = xgb.XGBClassifier(objective='binary:logistic', use_label_encoder=False, eval_metric='logloss')
# モデルの訓練
model.fit(X_train, y_train)
# 予測
y_pred = model.predict(X_test)
# 精度の計算
accuracy = accuracy_score(y_test, y_pred)
# user_id 2がvideo_id 102の関連テストを受験した際の正解確率を予測
user_2_video_102 = X[(X['user_id'] == 2) & (X['video_id'] == 102)]
predicted_probabilities = model.predict_proba(user_2_video_102)
# 正解する確率 (クラス 1) の予測値を取得
predicted_accuracy_for_user_2_video_102 = predicted_probabilities[:, 1].mean()
accuracy, predicted_accuracy_for_user_2_video_102
output:
(0.3333333333333333, 0.37165847)
結果として、テストデータに対するモデルの正解率は約33.3%、user_id 2がvideo_id 102の関連テストを受験した場合の予測される正解確率は約37.2%でした。この予測精度はダミーデータを使用しているため低いですが、実際の大量のログデータを使用すれば、モデルの性能は向上することが期待されます。
今回は、推奨されたテストに対する受講者の正解確率を予測するモデルの実装に関して考えてみました。この正解確率の閾値を調整して、類似度による推奨コンテンツと正解確率との組み合わせで最も最適な教材を推奨するという仕組みの実装も可能です。
次回は、このテーマを更に深掘りするか、日本や世界の学習のパーソナライズ化のトレンドや、AIを活用した学習における倫理的課題など、新しいトピックにも触れてみたいと思います。