まだタイトルない

アウトプット用です

#15 atmaCup 振り返り

この記事は五等分の花嫁のネタバレを含みますので未見の方はご注意ください。

こんにちは

atmaCup15がありましたね。

結果は82位でした。

atmaCupは課題内容の評判がよく、今回もきっとしっかり課題を理解して有効なアプローチを取った人がスコアを伸ばしてるんじゃないでしょうか?上位を見るとkaggleGMもちゃんといます。

それだけにこの結果はシンプルに凹むものがあります。悔しいです・・・

自分の上の81個のソリューションが出てくるため、簡単に振り返ります。

簡単に振り返り

時系列でいきます。

  • 最初に基本的なラベルエンコーディングやワンホットエンコーディングをしました。CV1.3999 LV 1.4006
  • useridを使ったターゲットエンコーディング CV1.2564 LB: 1.2781
    • 実装はfold情報を見てfold0のデータの値はfold0以外で計算するような実装です
    • やはりターゲットエンコーディングは正義ですね。(ただあんまり好きな手法じゃないんですけど気持ちわかる人います?
  • ユーザー単位、ジャンル別アニメ視聴数特徴量追加 CV 1.22183 LB:1.2397
    • 結構伸びました
    • このあたりからseen userとunseen userのCVをチェックするようにしました(有効活用できたとは言ってない
  • アニメの特徴量内で演算
    • DataRobotおじさんによる分析にあった割り算の特徴量で伸びました
  • scikit-learnのTarget Encoding totalCV 1.1677 seen 1.1594 unseen 1.2030 LB 1.2300
    • scikit-learnで内部でfoldきってくれるターゲットエンコーディングが実装されてることを見つけたので使用
    • CVが改善したものの明らかにリークしてそうなので今後のテーブルコンペでどう付き合っていくか結構悩みます
    • CVとLBのギャップは大きくなったけど相関は割と取れてたのでどうなんでしょう?
  • implict w2v explict w2v
    • これで256次元増えます
    • 重要度ランキングには入ってきますがCVもLBもあまり変わりませんでした
  • optunaで調整
    • 寝てる間に調整
  • transformerに挑戦
    • hemunistさんが公開してくれたnotebookを使用。
    • CVが悪くなかったのでここにターゲットエンコーディングなど特徴を加えたらいいアンサンブルの種になるのじゃないかなと思ったのですが、subのスコアが0.5くらい悪化してしまいました。
      • testの並びが変わっちゃうのかな?と思ったのですが謎の解決はできませんでした。(皆さんは動かせましたか?
    • ということでtransformerモデルを手札に入れるのは諦めました・・・
  • userでgroupKFoldして学習したモデルで未知ユーザーをアンサンブルしようとしたけどCVが悪すぎてこれも諦める

.

  • 結局いい感じのLightGBMの複数Seedアンサンブルで終わり。もうちょっと色々頭使ったことしたかったです。
  • また、ユーザーごとに10点をつけた作品がn個、アニメごとに10点は何人からみたいな特徴も考えられますが、これまたリークに配慮が必要で結局作らなかったです(何が正解かわからない

また復習頑張ります!!!

Targetencodingについて

リーク対策でまずこんな実装を使っていました

# Target Encoding
# ===========================================================================================
cols = ['user_id','anime_id']
cols_name = ["TE_" + s for s in cols]
for c, name in zip(cols,cols_name):
    arr_mean = np.repeat(np.nan, len(df_train))
    for val in range(CFG.n_fold):
        val_idx = df_train['fold'] == val
        df_agg_mean = df_train[~val_idx].groupby(c)['score'].mean()
        arr_mean[val_idx] = df_train[val_idx][c].map(df_agg_mean)
    df_train[name] = arr_mean
    df_test[name] = df_test[c].map(df_train.groupby(c)['score'].mean())
    CFG.feature_cols += [name, name+'_max', name+'_min']
    # fillna ちょっとリークするかも
    df_test[name] = df_test[name].fillna(df_train[name].mean())
    df_train[name] = df_train[name].fillna(df_train[name].mean())

もう一個 scikit-learnだとこんな感じ ドキュメント 内部でfold切ってくれたり、smoothingしてくれます。

t_enc = preprocessing.TargetEncoder(smooth="auto",target_type='continuous', cv=5, shuffle=True, random_state=29)
# Encodingするカラム配列。複合カテゴリは自分で作る必要がある
feats = ["user_id","anime_id","type","source","genres","bin_members"]
col_names = ["sk_TE_"+ s for s in feats]
# fit_transformでcv切ってエンコーディング
df_train[col_names] = t_enc.fit_transform(df_train[feats], df_train["score"])
# train全データの平均を使える
df_test[col_names] = t_enc.transform(df_test[feats])
CFG.feature_cols += col_names

こっちだとCVがLBと比べてちょっと良くなってしまいます。コードは短いほうが好きなのでこれが使えるといいんですけどどうでしょう・・・?

五等分の花嫁が良かった

atmaCupが始まるちょっと前から五等分の花嫁のアニメを見始めました。昔コミックスを1冊読んだときはそれ以降続き読んでなかったんですけど、気づいたらみるペースが上がっていき、atmaCup期間内でアニメ1期、2期、映画全部見てしまいました。(原作も半分くらい買って読んだ

推しについて

推しは三玖です!!!!!!!!!!!!!!!!!!!!

見た目や声や性格も好みで1話から推してたのですが、自分も卑屈よりな性格なので、卑屈な殻を破って挑戦していく姿に勇気づけられましたし、「テストで一番になったら。おいしいパンが焼けたら。そうやって先延ばしにしてたのは私。」というセリフには刺されました。。。

てか「返事は後で聞くね」ってズルすぎないですか?今まで見たそのシーンで一番です

1期1話を見たとき 三玖一択では?って思ってたのですが、いまはほぼ箱推しになっちゃいました。心理描写がいいですね。一花の焦ってるシーンとか好きでした。ざーさんすごい。お姉さんしつつ乙女になるギャップとかも良かった。二乃はまさにツンデレですけど、ストレートなシーンもいいし、髪切ったあとの髪型が良かった。四葉は髪型が一番好き。アニメ本編ではあまり恋愛要素なかった気がしますが、恋愛パートと言うより映画の過去パートとかで号泣しました。あーいうのに私は弱い。五月は丁寧語とか、ドジっぽいところに可愛さがでてましたね。ふくれっ面がいい。

作画について

さて、大事な要素として作画は欠かせないものなんですけど、1期は作画がちょっと残念なところあって、演技やストーリーをたのしむ必要がありました。2期から製作が変わって良くなりました。映画は更に良くなって特にキャラクターの表情に愛を感じるクオリティだったと思います。尺も136分でアニメ映画にしては長く、上記の通り号泣する要素もあって、とても良い出会いでした。

映画五等分の花嫁マジでいいからみんな1期と2期みてくれ!

舞台について

全然意識してなかったのですが、作中に登場するヤマソトってスーパー完全に東海地方のローカルスーパー ヤマナカだったので調べたら舞台は愛知でした。主に太田川駅あたりみたいですが、行ったことあるためちょっとドヤ顔になっちゃいました。

独り言

今回Hulu使ってテレビとか、タブレットとか、パソコンとかで見てたんですけど、好きなシーンがあちこちにあるせいで巻き戻したり、繰り返しみたいしまくりました。いやー現代のサブスクサービスはいいものですね。好きなシーン何回でも見れるんだもん「あんたみたいな 男でも好きになる女子が 地球上に一人くらいいるって 言ったわよね それが私よ」とか、「返事は後で聞くね」とかめっっっっっちゃみた

推しが選ばれないとかは特に大きなダメージは受けないタイプですけど、4が選ばれて、4つの失恋があるのはちょっと複雑な感情になりますね。

原作が完結してるのでアナザーストーリーとか欲しくはありますが、原作読んでみるとほぼアニメのセリフが原作通りなので、原作なしにいいもの作るのは難しいんじゃないかと思います。

さて、atmaCup開催いただきありがとう、五等分の花嫁という素敵な作品に今更出会いました。ということで今回の記事はおしまいにします!

2023/7/24 五等分の花嫁∽見てきたので追記

  • 原作にあってアニメ化されてないものの映像化ということで、修学旅行と文化祭の間
  • OP-EDの5人の声が立体音響?てきになっててよかった
  • 二乃のツンデレ大画面で見れたの眼福
  • 四葉の過去エピでまた感動した。報われるタイプの感動に本当に弱い
  • 今回は五月がコメディ要素をになってて好きだなーってなった
  • 一花と三玖は控えめだったけどやっぱいいですね
# anime.csvに含まれていない '映画 五等分の花嫁'と'五等分の花嫁∽'を追加
anime_data = {
    'anime_id': ["48548", "54915"],
    'japanese_name': ['映画 五等分の花嫁', '五等分の花嫁∽',]
}
df_anime = pd.concat([df_anime,pd.DataFrame(anime_data)],axis=0).reset_index(drop=True)
user_data = {
    'user_id': ["teyo", "teyo", "teyo","teyo"],
    "anime_id": ["d3892531a5e6986bb0b1","3c4699e295cdc22d676c","48548", "54915"],
    "score": [9,10,10,10]
}
# 新しいuserのscore付きデータを追加
df_train = pd.concat([df_train, pd.DataFrame(user_data)],axis=0).reset_index(drop=True)

※anime_id分からなかった