Ousiaのエンジニアリングブログです。社内での技術的な取り組みを中心に紹介していきます。NotebookでLチカまで)こんにちは。エンジニアの戸塚です。FPGA入門」的なことをしてみたいと思います。【DISCLAIMER】スタート時点でFPGA素人です。Courseraでちょうど年末からFPGAコースを開講していたので併行して勉強中です。間違ったことを書いていたら必要に応じて訂正を入れていきます。有識者の皆様のご指摘を歓迎します。Challenge参加記録こんにちは、インターンの玉木です。Ousiaのインターンプログラムに参加していました。大学院の修士課程はすでに修了しましたが、現在もインターンを続けています。Challengeに参加していました。結果は1081チーム中47位でした。本記事ではこのコンペティションと参加した感想を紹介したいと思います。Challenge今回のコンペティションではKKBOXという音楽配信サービスのデータを使い、各ユーザーが一度聴いた曲を再度聴くかどうかの2値分類の精度を競いました。評価指標はAUCです。与えられたデータの説明は記事の最後にあります。実際の流れモデル作成は以下のようなプロセスで行います。特徴量抽出モデル作成モデル評価Kaggleではkernelという他の参加者の分析結果や上記1~3を行った結果などが共有されている場があります。自分はupvoteが多いkernelを参考にして始めることが多いです。今回はこのkernelに特徴量を追加していく形で作業を進めていました。Kaggleではほとんど1の特徴量抽出で差がでます。3のプロセスはほとんどやることが変わらないためです。今回のコンペティションのデータは時系列データで、訓練データとテストデータは期間で分割されています。時系列データの予測モデルを評価する場合、同様に期間で分割して作られた検証データを作る必要があります*1。今回使用するデータには明示的にtimestampが与えられておらず、訓練データから期間で分割された検証データを作ることができませんでした。timestampが与えられていれば良い検証データを作成できるだけでなくそれを用いて新たな特徴量も作れるのですが、リークに繋がる可能性を考慮して削除されたようです*2。多くの参加者が良い検証データを作るのに苦戦している中、訓練データとテストデータがシャッフルされておらず、時系列順に並んでいることを発見した参加者がいました*3。曲が録音された年度の代わりにユーザーがサービスに登録した日付(registration_init_time)をplotすると、時系列順に並んでいることだけでなく、細かい日付まで知ることができます。横軸にデータのインデックス、縦軸にユーザーがサービスに登録した日付をplotした図が以下の図です。青色の部分が訓練データ、緑色の部分がテストデータです。Kaggle主催者がわざわざリークを考慮して含まなかった特徴量をこんな簡単に見つけられてしまっていいのかというツッコミもありますが、これで訓練データから良い検証データを作成できるようになり、より良いモデルの評価ができるようになりました。これがなかったらLeaderboard上のpublicデータでしか評価ができず、かなり厳しかったように思えます(publicデータにオーバーフィットしてしまう可能性もあります)。自分がやったこと最初に各カテゴリカル変数の頻度を計算しました。カテゴリカル変数とはグループで分類されるような変数のことを指します。曲のID等ほとんどがカテゴリカル変数です。曲の長さ等はカテゴリカル変数に含まれません。実はこれらの特徴量を用いるだけで一気に上位に入ることができます。ユーザーの頻度情報が効きました。次に各カテゴリカル変数における目的変数の平均値(期待値)を計算しました。曲に対する目的変数の平均を取ることで、その曲がどのくらい再度聴かれているかを表現することができます。encodingなどと呼ばれることがあるのですが、目的変数の情報を用いるためそのまま使うとリークしてしまいます。自分自身の情報を含まないようにデータを4分割して、その訓練データのアイテムが含まれない他の3つを使って特徴量抽出をしたのですがAUCはむしろ下がってしまいました。そのときは極端に頻度が少ないユーザーや曲が存在するためなのかなーと考えていましたが、実は違う方法で特徴量を計算すれば非常に有効な特徴量になりました。次にtimestampを用いて特徴量の作成を試みました。これも同様の後述する理由で失敗してしまいます。シングルモデルの予測結果をsubmitしました。Machinesも試したのですがGBDTに劣り、それらの結果をアンサンブルしても、むしろAUCが下がってしまいました。答え合わせKaggleではコンペティションが終わったあとにdiscussionという場でsolutionが公開されることがあります。3位の方のsolutionが分かりやすかったので、ここで比較をしてみたいと思います。この手法では、以下の特徴量を抽出したそうです。user.特徴量の構成は私がやったことと似ているような気がします。その差分は特徴量の作り方にあります。3位の方は学習には訓練データの直近のデータ35%を学習に使い、残りの65%のデータから特徴量を作成しています。テストデータの特徴量の抽出にはすべての訓練データから抽出しています。自分は各カテゴリカル変数の目的変数の平均値の計算をデータを4分割して行いましたが、それがよくなかったようです。上記4~6のような時系列の特徴量を作る際、私はデータを分割せずにそのまま特徴量抽出をおこなっていました。結果として直近の似たデータとの差分等をとることになってしまい、意味のある特徴量を抽出できなかったようです。1位の方もsolutionを公開しています*5。1位の方はGBDTとニューラルネットワークのアンサンブルを用いています。GBDTだけではLeaderboardで3位のスコアだったそうですが、ニューラルネットワークと組み合わせることにより、より高いスコアを獲得しています。GBDTとニューラルネットワークでは違った特徴の捉え方をするためだと考えられます。1位の方が作成したモデルの概略図がこちらです。1位の方は次のようにも述べています。itself).以前Kaggleであったinstacartのコンペの3位の方がニューラルネットワークのみを用いてモデルを作成し話題になりました。個人的な感想ですが、今回のようなタスクにおいてニューラルネットワークのモデルを作成するのはかなり難しそうです。感想いい勉強になりました。コンペ期間中にうまくいかなかった原因を突き止められなかったのは正直悔しいですが次に活かしたいと思います。本気で上位を目指そうと思ったら熱意が足りませんでした。1位の方はsubmit数もダントツに多いです。データ分析の知見を得るのにKaggleはとても良いと思います。今現在もおもしろそうなコンペがいくつもあるので興味のあるコンペに参加してみてはいかがでしょうか。そのイベントが起こったときのタブ名。ユーザーが最初にその曲を聴いたときのエントリーポイント。2017こんにちは、CTOの山田です。2017に参加するために、カリフォルニアのロングビーチに来ています。Competition」の中で行われました。このコンペティションでは、参加者はクイズボウルと呼ばれる、クイズ対戦ゲームを解くAIを開発することを求められます。提出したAIは、他の提出されたAIとの対戦をして性能を評価され、このAI同士の対戦で勝利したAIが最終的に人間のチームと対戦するということになっています。Farris氏などの有力なクイズプレーヤーを含む六名で構成されています。AI等に所属する該当分野で著名な研究者がオーガナイズしています。弊社は、このコンペティションの第一回目にも出場し、AI間の対戦では優勝したのですが、人間チームとの対局では155対190で負けてしまったため、今年のコンペティションに再度挑戦することになりました。クイズボウルは日本では馴染みが少ないですが、英語圏を中心に幅広く人気があります。Jenningsは、クイズボウルでも活動していたことが知られています。年間を通じてクイズボウルのトーナメントが開催されています。最近では、質問の意味を解析する自然言語処理の手法を評価する方法として、研究でも良く使われています*1。クイズボウルの特徴の一つは、早押しで回答する必要がある点です。質問文は、早い段階で答えるのは難しく、読み上げられていく毎に簡単に回答できるように書かれていて、質問の早い段階で正解した場合は15ポイント、そうでない場合は10ポイントがもらえるルールになっています。このため、質問文のなるべく早い段階で回答することが重要になってきます。一度間違えると同じプレーヤーは再度回答することが出来ないため、回答の精度を維持することも重要です*2。下記の質問文の回答は「豊臣秀吉」ですが、回答について知っていたとしても、質問文の早い段階で回答するのは、難易度が高いことがお分かりいただけると思います。用いて組み合わせる*3ことで、高精度化を実現しました。中核となっているディープラーニングのモデルとしては、質問文に対して回答を予測する分類モデルを用いました。Networksという比較的シンプルなディープラーニングのモデルに対して、質問文中に出現した単語とWikipediaエンティティ(固有名詞や専門用語など)を入力することで、質問の意味のモデルを構成し、回答を予測しています。単語とエンティティのベクトルを、弊社が昨年に提案した新しい分散表現モデル*4を使って初期化していることがあげられます。ENGINEの製品の開発の過程で得られたノウハウを元に開発されました。開発には、Python、Cython(高速化)、PyTorch(ニューラルネット)、LightGBM(GBRT)、Hyperopt(ハイパーパラメータ探索)などのライブラリを用いました。来年には、このNIPSコンペティションでの成果をまとめて書籍が出版されることになっており、そちらでさらに詳細なアプローチを解説する予定です。*2:今回の場合、人間チームは6人いるので最大で6回の回答ができるのに対し、AIは一回間違えたら再回答できません。*3:ディープラーニングの出力をアンサンブル学習に特徴として組み込む際にはstackingを用いています。月別アーカイブWantedlyスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。