天色グラフィティ

技術ちっくなことを書きます

【質疑応答付き】Kaggle Tokyo Meetup #6 に参加しました

f:id:ejinote:20190713175727p:plain

DeNAで開催された、Kaggle Tokyo Meetup #6の参加記です。YouTube配信の視聴を含めるとMeetup参加は3回目ですが、回を増すごとに情報量も発表内容の多様性も増しているように思います。

本当にすばらしい発表を皆様ありがとうございました。僕も発表やLTでコミュニティに貢献していきたいと思います。

この記事では、各発表について僕自身が面白い・知らなかったと思ったポイントを中心にまとめ、可能な限り出典などのリンクをつけています。 内容を網羅しているわけでは必ずしもありませんので、もとの資料を併せてご覧になることを強くおすすめします。素晴らしい資料なので。

それでは、15000文字を超える長い記事ですが、最後までお読みくださると幸いです。

Opening Talk (threecourseさん)

  • イキっている人もちゃんとバリデーションを切っている
  • Kaggle Masterもまぁ間違える。カバーしている知識も違う
  • いまはソリューションの発表が多いが、それはそちらのほうが準備が楽だから。Tipsなども歓迎。アウトプットしていきましょう

Petfinder 2nd Place Solution (Wodoriチーム)

  • 特徴量作成から学習、予測まで2hに収めるkernel onlyコンペ
  • 3種類の特徴量を作成し、4モデル(NN/LGBM×2/XGBoost)のridge stacking
    • LGBMしか使っていない人が多かった。モデルの多様性が差別化ポイント

takuoko part

  • テキストの処理
    • 前処理を施したあと、BOW/tf-idfをして、それを行列分解にかける
    • できるだけembeddingにおさめて、embeddingの平均を特徴量にした
  • 画像の処理
    • Kerasのdensenet121とInceptionResNetV2を採用
    • KerasとPyTorchで精度が全然違う
  • テーブルの処理
    • 基本的なアグリゲーション
    • 平均との比、平均との差などの特徴を作成
    • カテゴリの共起を取り、行列分解
    • 交差項の作成
    • 絵文字の情報やマレーシアの州の情報などをexternal dataとして利用
  • Kernelは間違っていることもあるので、自分で考えよう
    • (これはほんとそう!)
  • 特徴量は合計4000-5000ほど作成。importanceのTOP1000を利用
  • NNはAdam/CLRを利用

kaerururu part

  • CNNの出力、doc2vec、tfidfを利用した
    • これらはすべて高次元。低次元にいろいろ潰してみて、スコアが伸びたものだけを利用
  • 画像のサイズ、幅、高さを特徴量にする
  • 「cute」で検索して出てきた犬猫画像データセットで学習したモデルで予測したcute特徴を入れたが、効かなかった
    • クレンジングが足りなかったからでは?
    • (アイディア自体は面白いので、外部データを利用できるコンペではやってみるといいかも?)
    • (そこそこめんどくさそう)

gege part

  • はじめてのコンペだった(!?)
  • Kernelをベースに粛々と進めた
  • testっぽくないtrainデータを10%程度削ったが、精度向上はしなかった
  • 基本なにしてもダメだった

ynktk part

  • 4モデルをstackingした
    • LGBM < Average < Ridge だったのでRidgeを採用
  • Ridgeに入れる前の前処理でランク変換を行った
    • foldごとに予測値の分布が異なりがあったのでは?
    • ランク変換によって予測値分布の差を吸収
    • QWKは閾値に敏感。予測分布の差があると悪影響がある
  • 後処理
    • ImageHashを使って重複画像を探索→train/testで重複している画像はtargetで置き換える

u++ part

  • 泥臭いこと担当
  • クレンジング
    • 綴りの間違いを人力で修正

質問

  • 1位との大きな差はなに?(smlyさん)
    • まじでわからん
    • 外部データが効いたらしいが、再現してみたら全然効かなかった
  • ultimate model作ろうとしたらいまのtrainにoverfitするんじゃ?(smlyさん)
    • 今はロバスト/lightweightなモデルを作ろうとするムーブはあんまりない
    • あくまでボランティアとしてやっているので、他の参加者もそこまでモチベーション高くはない
  • interaction featureは何を意識して作ったの? 普通はビジネスセンスが必要(smlyさん)
    • 今回は総当たりで効きそうなのを試した。列が少ないからいける
    • 全然効いていない特徴量は総当たりの対象から外した
  • ods.aiに有用な情報はあった?(koukyoさん)
    • petfinderのときには、ods.aiにしかない情報はなかった
    • これが話題だから見よう、みたいな情報は取れた。取れてしまった
  • テキストの情報をクラスタリングしたら効く、みたいな話があったが、やった? (pocketさん)
    • やってないです
  • 閾値が大事という話だが、どう決めた? (pocketさん)
  • 実際閾値はprivateでも最適だったの?(onoderaさん)
    • 検証はできていない
    • QWKが0.4くらいになるので、それって全然あたってないよね。タスクとして難しかった
  • 各FoldでQWKの閾値はどれくらい変わるのか? データの分布が違うと閾値はかなり敏感にスコアを変えるのでは? (maxwellさん)
    • ログとしては取っているが、詳しくは調べていない
    • RescuerIDを利用したGroupKFoldを利用した
    • 最終サブミットはFoldの切り方を変えた2つを提出した

iMet 7th Place Solution & 画像コンペのアプローチ (phalanxさん)

壺コンペソリューション

  • 推論だけKernelで回すタイプのKernel Onlyコンペ
  • 2nd stageでテストデータが5倍になるので、それを考慮して提出しなければいけない
  • アノテーションがまぁまぁ雑。ラベルが欠けている画像が多くある
  • class imbalanceがある
  • モデルをひたすら積み続けた。ResNet34も最後まで生き残った
  • ラベルごとに最適なモデルが違ったので、アンサンブルが効くと思った
  • cultureとtagで根本から別々のモデルにした
    • Grad-CAMを見ても見ている画像の部分が違う
    • 全結合層だけ分けるのが普通だが、それだとあまり上がらなかった
    • すべてのモデルにこれをやると時間が足りないので、強いモデルだけやった
  • 蒸留を頑張っていたけど、効かなかった
    • 蒸留をがんばればモデルが小さくなるので推論時間を稼げるのでは?
    • attention transfer (activation-based method)を使った
    • studentのattention mapをteacherのattention mapに近づける手法
  • focal lossとlovasz lossを採用したが、ほんの少し良くなっただけ
  • 頻度が少ないクラスはdropしたが、意味がなかった
    • 過去にGibaがやっていた
  • 長い画像には特に何もせず、resizeして突っ込んだ
    • 上位の人を見ても対処している人はいなかった
  • CNNでstackingした
    • 過去コンペでKeepLearrningがやっていた
    • 1000クラスあるので、全部ridgeはやってられない
    • CNNでモデル間の相関を学習し、denseで特徴間の相関を学習する
  • チームメイトの予測をスタッキングに載せた
  • 1st place solutionの紹介
    • batchsizeを1000-1500と大きい値を設定(ノイズの軽減?)
    • 誤差が大きい画像を弾く
    • ImageNetのpredictionや画像の長辺の長さなどの特徴をLightGBMにかける
  • psuedo labelingとhard example miningをちゃんとやれば精度が上がった

画像コンペのアプローチ

  • yamlを書いたら全部走るpipelineがある
    • 壺コンペはyamlを書き換えつづけるだけ
  • 初日
    • ルールとかOverviewとかをちゃんと読む
    • mean, std, min, maxをRGB, HSVのチャンネルごとに確認する
      • めちゃくちゃ明るい/暗い画像のチェック
    • 画像サイズのmean, std, min, maxなどを確認
    • targetの分布を確認
    • 画像を目で見る
    • resnet18, 34などの小さいモデルを作った後、resnet101, 152に進む
    • optimizerはAdamを使う。 3e-3 〜 1e-4 の範囲をコンペによって変える
    • image_sizeは (mean/2, mean/2) , (mean, mean), (mean*2, mean*2)を試す
  • ベースラインの予測を作ったら、予測を確認する
    • CVとLBの違いや、attentionを可視化
  • サーベイ
    • ドメインの論文が効くことがある
    • 読むだけじゃなくて実装もする
  • パイプラインは作ろう
  • 時間を効率的に使う。学習回している間に論文を読んだりコーディングをしよう
  • 終盤
    • ドメイン特化の論文を読む(10%)
    • アンサンブルに備えていく

質問

  • ラベルが信用出来ないとき、ルールで許されていたらハンドラベリングしたりするか?(kaerururuさん)
    • 1103クラスに対してはハンドラベリングはだるすぎるのでやってない
    • 今回はpseudo-labelingをやれば十分だった
  • optimierをAdam固定にはどんな意図があるか?(koukyoさん)
    • そこは本質的な価値じゃないので、Kagglerとしては本質的なところで戦うべき
  • 蒸留がうまくいかなかったのはなぜ?
    • 予測に対してL2ノルムで最適化した。しかし、出力が小さいところまで合わせる必要はなかった
    • 今回はpseudo-labelingで十分
  • 早い段階からたくさんモデルを作るという戦略か?
    • 最近のコンペはだいたい、多くのモデルを混ぜればうまくいく
    • 今回は特にラベルごとに最適なモデルが違った。ちゃんとそれを確認している
  • CNNでアンサンブルするとき、モデルの並べ順によって差が出るのでは?(Jackさん)
    • 学習時に順番をぐちゃぐちゃにしても学習可能なのでよくわかりません
  • パイプラインについて。1080TiとKaggle Kernelで両方実行可能にするのはどうする?(flowlightさん)
    • Kernelで実行する時は、モジュールをべた張りしている
  • pseudo-labelingについて工夫を教えてほしい(u++さん)
    • LBが最も高くなるような閾値で切ってpseudo-labelとして使う
    • もともとのラベルをhard-label、pseudo-labelをsoft-labelとする。soft-labelの方はlossの寄与を小さくする
  • phalanx-pipelineはどうやって完成した?(koukyoさん)
    • segmentation/detection/recognitionでそれぞれパイプラインがある
    • detectionはmmdetectionというライブラリがあるので、それに似た形にしている
    • コンペごとに進化していっている
    • 作り始めたのはタンパク質コンペのとき。新しいタスクに挑戦する時は、最初はパイプラインが崩壊することもあるけど、そうしたら組み直す

Quora Insincere Questions 10th Place Solution & 昔話 (tksさん)

Quoraコンペの解法

  • 外部データ利用不可のKernel-Only
  • Embeddingが4種類与えられている
    • これをどう使うかがひとつのポイント
  • BERT発表後初めてのNLPコンペ
  • モデル構造はかなりシンプル
    • 層を複雑なモデルを作ったことはない
    • 小さいモデルをアンサンブルさせてスコアを取っている
    • Embeddingの組み合わせで4C2=6個のモデルをアンサンブルしている
  • CVをきちんとすることが勝利の秘訣だった
  • 最初からaveragingすることは決めていたので、averageでのスコアで評価
  • モデル構成が定まるまではtrain/dev/valの3分割を5-foldで行う
    • trainで学習、devで閾値選択、valで評価
    • ここで閾値を何種類かに絞っておく
  • スペル修正はしなかった(面倒だったので)
  • ラベルノイズも多かった
  • モデルの安定化のため、Exponential Moving Averageを利用する
  • Embeddingの扱い
    • concatすると次元が大きくなってしまうので、重み付き平均を使う
    • Projection Meta Embedding
      • concat後低次元に射影して、ReLUする
  • 実行時間制限が大切
    • EMAの更新回数を減らした
    • 長さが近いものを同じバッチに入れると早くなるが、トライしなかった
    • そんなに気分が乗らなかったからだと思う
  • 反省点
    • 長さが近いものをバッチに入れる、は最初に実装すべき
    • statistical feature (質問の長さ、大文字だけの単語数、など)を入れておけばよかった
    • 早期に選択肢を狭めている
  • Local CVを信じれば、たまに良い順位に入れる

昔話

  • Kaggle歴5年以上の人どれくらいいる?→ほんの少し
  • Submission Limitも変わっている。個人的な意見としてはFinal Submissionは1個にしてほしい
  • なにか問題があったら、オープンなフォーラムで話し合う文化は昔からあった
  • 要望・提案があればどんどん出していきましょう

質問

  • QuoraのEMAについてもう一度説明してほしい
  • EMAは学習率を単純に下げるのとは違いがあるのか?(upuraさん)
    • 自分はoptimizerは据え置きでやるようにしている
    • BERTではEMAは全然効かなかったので、チューニングは必要
  • 同じ長さの文を同じバッチに入れるとなぜ早くなるのか?
    • 長さをまとめなかったら最大長でpaddingする必要がある
    • 同じ長さでまとめたら、バッチ単位でpaddingすることができるので早くなる
    • 精度はほとんど変わらないはず
  • Freesoundでやったとき、paddingが長すぎると精度が下がりました(osciiartさん補足)
  • 出るコンペはどういう基準で選んでいる?(koukyoさん)
    • 基本、簡単そうなやつ
  • 今と昔だと上位に行く難易度に違いはあるのか?(pocketさん)
    • 昔の方が断然簡単だった
    • 昔はいけたけど、今は悩んでいる人はたくさんいると思う
    • 昔はツールを作ってるリサーチャーが多かったからそれに勝つにはツールを作るしかなかった(smlyさん補足)

(おまけ)僕の参加記

amalog.hateblo.jp

PLAsTiCC 3rd Place Solution (nyanpさん)

公開してくださっているGitHub

解法

  • 特徴量エンジニアリングが好き
  • 突発天体・変動天体のように、明るさが変わるような天体を見つけたい
  • いままでは漏らしていたけど、LSSTの運用で発見できるようになるはず
  • これまで人類が発見した天体は1万くらいしかないのに、LSSTは10年間で1000万程度発見してしまう
  • 突発天体を早期検出して、後続の観測機器で精度良く観測する
  • LSST自身でも自動分類したい
  • Light Curveから天体を特定する多クラス分類
  • かなりimbalanceなデータセットで、少数クラスは30件程度
  • minority classほど1データの重みが大きいので、sample_weightなどで補正しないと良いスコアが出ない
  • 超新星の爆発のときには観測ができていなくて、残り滓しか見えないようなケースもあるので難しい
  • trainは既存の観測データ、testはLSSTが観測するもの、という問題設定だった
  • ノイズの大きい観測データをどうするかが争点
    • Gaussian Process
    • NN
    • Template Fit
  • Class 99をどうするかもスコアを大きく左右したが、Kernelに準じても金メダルは取れた
  • LSST Science Bookという文献を読むことで、ドメインのエキスパートがどこに注目して分類しているかがわかった
  • マージした時点でnyanpさんは200特徴量だったが、mamasくんは80000個作っていた(!?)。yuvalは1個も作っていなかった(!?!?!?)
  • CNN、LightGBM、CatBoostのアンサンブル
  • CNN
    • 欠損を線形補間/detected=1だけ抜き出して線形補間/最近傍の有効データとの時間差 をCNNに突っ込む
    • 1DConvを数回行い、GlobalMaxPoolingにした後、メタデータの特徴量とくっつけてDenseに通す
    • 時間方向のshiftについてクラスは変わらないはずなので、CNNが効きそうだし、augmentationとしても使える
    • 特徴量なしでも金が取れた(!?)
  • Template Fitting
    • 遅い。テストデータに対しての計算は30日くらいかかった
    • 並列化が効かなかったので、インスタンスを30個立てて30倍速にした
    • コマンドは心をこめて手打ちした
    • sncosmoというライブラリで試せるものだけで数十個ある
    • 全部やった。CVであたりをつけてから、よいものを試した
  • preemptible instanceの牧場管理をがんばった。最終的には60個まで増えた
  • Gaussian Processも試した。時間がかかるのでやっぱり30インスタンス立てた
  • tsfreshやfeetsといった時系列の特徴抽出ができるライブラリを使った
    • ベースラインとしては使える
  • pseudo-labeling
    • class 90, class 42に絞ってラベルを付けた
    • class 99はtestにしかなく、class 99に間違ったpseudo-labelをつけると大きくスコアを落としてしまう。class 99と遠いクラスのみラベルを付けた
  • Adversarial Pseudo Labeling
    • training dataに似ているサンプルを使ってtraining
  • クラスごとに異なる重みでアンサンブルした
    • OOFのpredictionの精度で決めた。サブミット数が残り少なかったため
  • LB Probingでclass 99を決めた
    • one-class SVMなどを利用した通常の異常検知はうまく行かない
    • class 99はどんな天体なのか考えた
      • class 99はすべてのクラスから均等に遠いことはないはず
      • クラスごとに異なる重みを付けてみた
  • モデルの方向性がみんな全然違ったのが良かった

質問

  • Template Fittingのハイパーパラメータはどう決めた?(akiyamaさん)
    • コードが見たい人はopenにしているkernelを見てほしい
    • 時間がなかったので、あまり調整はしていないが、一部のパラメータはちゃんとlsstと設定しないといけない
    • Fittingによって出てくるパラメータをそのまま特徴量として使う
  • 1位との違いは何ですか?(u++さん)
    • 1位はdata augmentationをやっていた。これが一番の差分
    • train dataをtest dataの分布に合わせるため、遠方にシフトさせるaugmentation
    • これをやっていれば1位いけたかも
    • 上位解法のばらつきが大きく、上位の答えをアンサンブルをするだけでスコアが上がる
  • サーバー代はいくらですか?
    • 8コアくらいのcheapなインスタンスをたくさん立てた。トータル5万くらい
    • Seed Averageのために立てたインスタンスを止め忘れ、7万くらい請求された。悲しい
  • CatBoostはなぜ強かった?
    • データにカテゴリ変数はぜんぜんなかった
    • かなりoverfitしやすいデータだった。CatBoostに含まれているsymmetric treeとordered boostingという機構がコンペにマッチしていた
    • ordered boosting
      • t番目のデータに対する残差を計算するとき、t-1番目までのデータで学習したモデルを使う
      • サンプルが少ないときに特に有効
      • 比較した結果としても、ordered boostingが良かった
    • 使う特徴量によってLightGBMとCatBoostでどちらが良いかは変わった
    • 最近はCatBoostも使いやすくなっているので、スモールデータコンペだったら試す価値がありそう
  • データ数が少ないとき、NNはoverfitしやすい。augmentationはどう選んでいる?
    • そのクラスは何に対して不変なのかを考えるべき。cyclic shiftは自然な発想
    • 観測ノイズが載っているので、ノイズを乗せても良さそう
    • そんなにアクロバティックじゃないとは思う
  • psuedo-labelingについて。コードは公開している? OOFでやるなど実装方法もいろいろあるが、どれを使った?(pocketさん)
    • GitHubを公開しているので、どこかに埋まっているはず
    • ラベルを付けた数がtrainの10倍になるくらいにした。基準は実験的に決めた
  • Gaussian Processはどうした?(onoderaさん)
    • fittingして、そのまま特徴量として突っ込んだ。そんなに寄与は大きくなかった
    • 1位はGaussian Processでデータを補完してその波形上で集約して特徴量を作っていた

スポンサーセッション (hoxoshさん)

  • DeNAの事業は多岐に渡っていて、Kagglerが各地で活躍している
  • 合宿(magic camp)に行きました。今度も行きます
  • @DeNAxAI_NEWSをフォローしてください

Neural Network のご機嫌取りがしたい(tawatawaraさん)

  • テーブルより画像のほうがメダル取りやすいのでは?
  • batchsizeが小さいと一部のサンプルに引っ張られがち。batchsizeを大きくしたらlrも大きくする
  • 基本的にbatchsizeは大きく取りましょう
  • lrはLR-RangeTestで決めよう
    • fastaiのライブラリでlr_findとして実装されている
  • 学習率のスケジューリングは正直好みでは? warmupは有効だとは思う
  • 学習率が不変 or AdamならEarlyStopping
  • initializerはscaleを小さめに
  • TuningのためのCourseraもある

質問・コメント

  • fastaiのfind_lrはモデルやデータで良いlrは変わる?(osciiartさん)
    • chainerで自分で実装しているからfastaiのは実はわからない
    • 実際モデルやデータで変わりそうではある
  • scaleを小さくすると学習は安定するが、結果はscaleが大きい方が結果は良くなりそう。回数を打てるならscale大きいほうがよさそう(owrubyさん)
  • batchsizeが大きすぎると汎化性能が下がるのでは? BERTだとそのためのoptimizerがある

kagglerのためのAllenNLPチュートリアル (tamakiさん)

資料

内容

  • 最近はテキストが有害かどうかのコンペが多い
  • かなり分割がうまくいっていて、書いていて気持ちいい
  • DatasetReaderがテキストファイルからInstanceのリストを返してくれる
  • Modelがtorch.nn.Moduleのサブクラスを返す
  • AllenNLPはjsonから実験ができる

質問・コメント

  • NLPコンペで初心者が詰まりがちなところを教えてほしい(u++さん)
    • NNと同様で、学習率どうする?みたいなポイントはある
    • ベースラインを作るまでにはハマりポイントはあんまりない。それ以降何をするかが大事

Freesound Audio Tagging 2019 4th Place Solution (oumedチーム)

  • 医学部6年なので、実はKaggleしてる場合ではない
  • domain adaptationも必要
  • 人間の聴覚はlog-scaleなので、それを反映したlog-melspectrogramが主力
  • スペクトル画像に変換したらほぼ画像分類として扱える
  • 時間方向に圧縮すると意味が変わってしまう
  • 波形とlogmelの両方使った
  • 波形についてはEnvNet-v2を使った
  • MixUp/BC learning
    • 画像と違い、音声は2つの音声が混ざるのはかなり自然
  • cropするより、全長を使ったほうが良かった
    • 最初の方にクラスを決める要素が多かった
  • noisyの使い方がポイントだった
    • 多くの参加者はpretrainとして使ったが、OUMedではマルチタスク学習として使った
  • soft pseudo-labeling
    • マルチラベルに対応できないし、分布の差によって信頼性が高いラベルが得られない
    • 疑似ラベルを0, 1にしない
  • 長さの異なるモデルを複数用意してaveragingするのが有効だった
  • 外部ラベルデータダメなのにハンドラベリングOKだった→1位はそれ
  • 2位はlogmelの変換もlayerとして入れて、パラメータ探索した
  • 2位は時間軸方向はGlobalMaxPooling、周波数方向はGlobalAveragePooling
    • 意味合い的にも妥当
  • Kaggleだと半教師付き学習はpseudo-labelingが最強だよね
    • 論文で言ってるpseudo-labelingはKaggleのpseudo-labelingは全然違う
    • biasがかかっていた瞬間に論文のpseudo-labelingは死ぬ
    • Kaggleのpseudo-labelingは蒸留に近い

質問・コメント

  • BC learningについて。もとはマルチラベル対応ではなかったのでは?(koukyoさん)
    • このコンペはほぼシングルラベルみたいなものなので、えいやでやってしまう
    • powerだとそのままmixupしていいけど、dbでmixupするとおかしくなる
  • マルチタスク学習について。どういう学習方法を使っている?(koukyoさん)
    • noisy/cleanはそれぞれに対応したheadを使っている
    • 推定は別々でやって、backpropは同時にやっている
    • lossの足し合わせは1:1で行っている
  • 1次元側の工夫はあるか?
    • 基本は論文の実装をそのまま使った
    • 単体ではあまり精度は高くなかったので、あくまでアンサンブルの材料
    • 得意なクラスが違ったかも
  • 半教師付き学習について。本来は十分教師がない状況に使うためのものなのでは? 今年のlandmarkコンペでは半教師付き学習が使われている(smlyさん)
    • 適切な目的のところでは半教師付き学習は使える

Large-scale Landmark Retrieval / Recognition under a Noisy and Diverse Dataset (smlyさん)

  • 巨大なデータセットに対して学習
  • 半分以上のクラスが10枚以下というimbalanceなデータセットで、しかもノイズが多い
  • single modelでもbestfitting以上が出せるので、アンサンブルしないと勝てないのは甘え
  • 画像検索で大事なのは2つしかない
    • ArcFaceなどのcosine based softmax lossを使え
    • データセットをキレイにしろ
    • 識別モデルを検索のre-rankingに使え。決定境界から遠いものから順にrankingする
  • データセットをキレイにする
    • 去年のデータセットはキレイだったので、それをベースにクレンジング
      • (そもそも去年のコンペに参加していないと難しい)
    • 近傍を取ってきた後、spatial verificationでキーポイントが保存されていることを確認する
  • 1回recognitionのタスクを解き、ラベルが一致するものを上位に置く

質問・コメント

  • 計算リソースはどれくらいですか?(osciiartさん)
    • pairwiseの学習だとリソースがたくさん必要だが、ArcFaceなどならV100×1×1日くらいで済む

Santander Customer Transaction Prediction 2nd place solution (onoderaさん)

  • すべての特徴量が連続値で、正規分布していて、positiveとnegativeで分布が違う
  • fake rowsを抜いてcount encodingするだけで銀圏に行った
  • roundしてcount encodingしたらめっちゃ上がった
  • ゼルダの続編が開発されている