見出し画像

【データの世界】KaggleのML/AIコンペに参加しました‐自動エッセイ採点システム 2.0

自動エッセイ採点システム 2.0

先月、ML/AIコンペにチームリーダーとして参加しました。これは、米テネシー州のバンダービルド私立大学がアリゾナ州に拠点を置く独立した非営利団体であるThe Learning Agency Labと提携して主催しているコンペで、主に学生のエッセイ(作文)採点の自動化・効率化を図るためのアルゴリズムの開発を目的としています。
コンペの詳細は前回のNote記事をご覧ください。

簡単な学習プロセスの流れ

コンペが始まった当初にデータのセットアップそしてLGBMを用いたベースラインモデルのトレーニングの流れを簡単に紹介したノートブックをKaggle上で公開しました。

ここから色々なフィーチャーを足したりして効率化と評価指数アップを図ろうとチューニングしましたが締切日が来てしまい時間切れとなりました。目標評価指数は0.8以上だったのですが、結局0.77から上がらず。。。まだまだ勉強が必要です。
以下のリンクが最新版です。

このバージョンでは、まずテキストプレプロセシング(データの準備的処理)、そしてフィーチャーエンジニアリング(特徴量エンジニアリング)をして機械学習のためのモデルトレーニングをしやすくし、そして作文という文章データから数値データを抽出しさらに訓練データの変数を増やしました。そして10以上作った変数の中から一番重要な5つの変数をセレクトし学習モデルに組み込みました。

次に文章のベクトル化を図りテキストデータを数値データに変換しました。

# Vectorize text data
tfid_vectorizer = TfidfVectorizer(max_features=5000)
X_train_tfidf = tfid_vectorizer.fit_transform(train_df['full_text'])
X_test_tfidf = tfid_vectorizer.transform(test_df['full_text'])  # Use transform here, don't fit

# Convert scaled features into sparse format
features_train = csr_matrix(train_df[features_scale])
features_test = csr_matrix(test_df[features_scale])

# Combine TF-IDF features with additional features
X_train_combined = hstack([X_train_tfidf, features_train])
X_test_combined = hstack([X_test_tfidf, features_test])

文章のベクトル化について詳しく説明しているサイトを見つけたのでこちらも参照にしてみてください。
文章のベクトル化の方法と応用|単語埋め込みから特徴ベクトルまで徹底解説 | Hakky Handbook (st-hakky.com)

実際の学習ループではOptunaというハイパーパラメターの最適化を自動化するためのフレームワークを使用しハイパーパラメター値を検出しました。

def run_study(objective, n_trials, name):
    study = optuna.create_study(direction='maximize')
    study.optimize(objective, n_trials=n_trials)
    print(f"Best trial for {name}:")
    print(f"  Value: {study.best_trial.value}")
    print(f"  Params: {study.best_trial.params}")
    return study

そして3種類の学習モデル(LGBM, XGB, CatBoost)をアンサンブル形式で学習させました。全体のランタイムを9時間以内に収めなければならないコンペルールがあるので、3つの学習モデルを平行して学習しランタイムを9時間以内に収まるようにしました。

# Run studies in parallel using Joblib
studies = Parallel(n_jobs=-1)(delayed(run_study)(objective, 5, name) for objective, name in 
                             [
                                 (objective_lgbm, 'LGBM'),
                              #(objective_catboost, 'CatBoost'),
                              #(objective_xgb, 'XGB')
                             ])

今回予測するエッセイスコアの学習サンプルの分布をみてみるとわかりますが、スコア1,5,特に6のサンプルサイズが少ないことがわかります。この現象を不均衡データと呼び、データの比率に偏りがある状況のことを言います。

このようにサンプルサイズが極端に異なると学習にかなり影響し、不均衡データを通常通りに学習させてしまうと評価指数にも必然的に影響が出てきます。なのでSMOTEというオーバーサンプリング手法を使って少数派のサンプルを増やす工程を入れました。

それでもうまくいかず。。。

それでも何回か学習回数のパラメターを入れ替えてみたり、異なる手法を試してみたりしましたが、ランタイムが9時間以上になったり、「過学習」といって学習中にサンプルデータを暗記するようになってしまい、モデルとして学習できなくなる状況が多々起こりました。コンペの期限は過ぎましたが、どの部分を改良すべきだったのか学びたいので、もし興味のある方は上に張った最新バージョンのKaggleノートブックを見てもらって、フィードバックも頂けると嬉しいです。


👩‍💻ディスコード上でデータコミュニティーを運営しています。現時点では英語ですが、日本語チャンネルも作ってデータ、プログラミング、AIなどの技術に興味ある人たちを迎え入れられるようにしていきたいと思っています。興味ある方はコメント欄でお知らせください。招待コードを送ります。

🖊️何か気づいたことやご意見などがあればコメント欄からお願いします。チャンネルフォローもよろしくお願いします。

🚀 疑問に思った事はデータ化して自分なりの答えを探していこうと思います。そしてその答えがどこかにいる誰かの為になる事を願っています。


この記事が気に入ったらサポートをしてみませんか?