Kaggle始めました。

この記事はWMMC Advent Calendar 2021 の14日目の記事です。

https://adventar.org/calendars/6490

adventar.org

 

目次

  1. はじめに
  2. Kaggleとは
  3. データ解析
  4. ロジスティック回帰
  5. LightGBM
  6. アンサンブル学習
  7. スコアを上げる方法
  8. 終わりに

 

 

はじめに

こんにちは。お初にお目にかかる人が多いと思います、今年WMMCに入会した情報通信学科2年のYamauchiです。昨日の記事はaosa4054さんの

「一人暮らしの酒 - 袋とじ開けたら猫がドジョウでiPad踊ってた」でした。

高レイヤーの方には不思議と親しみを覚えます。お酒は飲みたいと思ってもなかなか機会がないんですよね。いつかバーに行ってみたいと常々思ってます。

今日はKaggleの紹介?記事です。

 

Kaggleとは

詳しく説明するとキリがないので今回は概要だけ。

Kaggleとはデータ解析コンペサイトの一種で競技プログラミングのプログラミングがデータ解析に置き換わったようなものです。各参加者はクライアントからデータを渡されてデータの傾向や特徴をうまく説明するモデルを作成するよう指示されます。渡されるデータはテーブルデータが多いですが、画像データや音声データが渡されることもあります。コンペ中は一日に5回まで予測結果を採点することができ、最終的にスコアの良かった参加者が賞金とメダルを獲得できます。

世界最大規模の機械学習コンペティション「Kaggle」に熱中する「Kaggler」と呼ばれる人々とは【デブサミ2018 夏】  (1/2):CodeZine(コードジン)

(引用: https://cz-cdn.shoeisha.jp/static/images/article/11066/11066_002.png)

 

終了したコンペに対しても練習として、賞金とメダルはもらえませんが参加することができます。今回は初心者向けの過去コンペに参加したのでそれを記事にしました。

 

データ解析の様子

なんか理論とか説明しだすと (。´・ω・)ん? になるので実践に移ります。

よくわからんぞ!って人は流れで感じてください。

今回取り扱うコンペはOtto Group Product Classification Challenge(引用URL: https://www.kaggle.com/c/otto-group-product-classification-challeng

)です。Kaggle初心者ガイドの初心者お勧め過去コンペから引っ張ってきました。

 

引用URL:

  1. https://kaggler

    kaggler-ja-wiki.herokuapp.com

    -ja-wiki.herokuapp.com/kaggle%E5%88%9D%E5%BF%83%E8%80%85%E3%82%AC%E3%82%A4%E3%83%89#%E5%88%9D%E5%BF%83%E8%80%85%E3%81%8A%E5%8B%A7%E3%82%81%E9%81%8E%E5%8E%BB%E3%82%B3%E3%83%B3%E3%83%9A

 

 

オットーグループはドイツのハイゼンベルクに本社を置く通信販売、電子商取引の企業で今回は20万個以上の製品に対して各製品がどのグループに属するのか予測するモデルを作ってほしいとのこと。早速Notebookで訓練データの中身を見ていきます。csvファイルをデータフレーム形式で確認します。

 

f:id:pizzagatakasugi:20211123175200p:plain

 

沢山数字が出てきました。

どうやらこのデータには各商品のidと93個の特徴量(おそらくは大きさや値段、生産国など)が含まれているらしく、それらから傾向をつかんでどのクラスに分類するか予測するようです。実際データの右端にはどのクラスに分類されるかの変数targetがあります。

f:id:pizzagatakasugi:20211123175824p:plain

ちなみに各特徴が何であるかや、各クラスがどういった商品なのかの説明は一切ありません。たまげたなぁ。

早速これをもとにモデルを作成していきます。

 

 

ロジスティック回帰

ロジスティック回帰は重回帰分析で得られた値をシグモイド関数に代入して所属確率を求める方法です。

 

 

やってることは単純でただロジスティック回帰をしてくれるライブラリをインポートしてそこにデータを与えて予測しただけです。設定上変数の型が数値でなくてはならないのでデータを少しいじっています。早速得られた予測値を提出してみようと思います!

 

↓結果はこんな感じです

f:id:pizzagatakasugi:20211204213343p:plain

スコアは出ているのですが順位表に名前がありません。

これは別に

(順位表に)おめぇーの席ねぇから!

というわけではなく過去のコンペだとリアルタイムで参加した人しか順位が出ない仕様になっているらしいです。スコアから逆算すると大体2500/3500位程度。デフォルトなのでこんなものです。

 

LightGBM

LightGBMは、決定木を使った手法の一つです。決定木は閾値条件によるデータの分岐を繰り返すことで、回帰や分類をします。

 

f:id:pizzagatakasugi:20211204210702p:plain

 

上の図のように条件式を満たすかどうかでクラス分けします。また、LightGBMは勾配ブースティングという手法を使っています。これは前の学習の結果を次の学習の結果に生かすという方法です。

 

f:id:pizzagatakasugi:20211204210736j:plain

LightGBMの主なメリットは下記の通りです。

・実行スピードが他の手法(同じく勾配ブースティング決定木の一種であるXGboostや、決定木以外のニューラルネット系の手法)と比較して速い。

・欠損値やカテゴリ変数を含んだままでも、モデルを学習させることができる。

それでは実際に学習させてみます。

 

これも提出してみます。

f:id:pizzagatakasugi:20211205021226p:plain

ロジスティック回帰よりもスコアは向上しました。LightGBMは最近開発されたアルゴリズムなので精度がいいということですね。

 

アンサンブル学習

様々な予測モデルを組み合わせて一つのモデルとする手法をアンサンブルといいます。

複数のモデルを用意して予測結果の多数決をすることで、単体のモデルよりも精度が良くなります。

やり方は非常に簡単で単純に予測結果の値を足してモデルの数で割るだけです。

今回はLightGBMとロジスティック回帰の平均を求めますが、本来は精度の良いモデルに重みをつけることが多いです。

 

結果はこんな感じになりました。

f:id:pizzagatakasugi:20211212074209p:plain

なんだよ・・・結構当たんじゃねぇか・・・

アンサンブル学習は割とスコアが向上しやすい気がします。もちろんより多くの学習モデルでアンサンブルすればよりスコアは向上するので、選択肢を増やすという意味でもモデルは沢山知っているほうがいいでしょう。

 

スコアを上げる方法

一通り予測を行ったのでよりスコアを上げる方法を考えてみます。技術的なこと何も書いてないと思ったので初心者がいろいろ考えてみました。正直内容には自信がないので軽い気持ちで見てください。

・・・スコアを上げる方法は(少なくとも)3つあります。

・学習モデルのハイパーパラメータを調整する

・複数のモデルでアンサンブル学習をする

・データの前処理を行う

 

ハイパーパラメータを調整するというのはモデルの変数を変えることです。LightGBMであれば探索の回数や条件分岐の層の数にあたるのですが、これはあんまり効果が出にくい印象です。Oputunaというハイパーパラメータを最適化してくれるライブラリもあるのですが、時間がかかるわりにはスコアは向上しにくいです。ただ、ニューラルネットのような層の数で性能の良さが大きく変わるモデルであればハイパーパラメータを考えることは重要です。

 

複数のモデルでアンサンブル学習するというのはより多くのモデルで値を予測して、多数決して値を決めようということです。後述しますが、このデータは前処理が難しいので、一番効果があるように思います。注意点があるとすれば同じアルゴリズムで動くモデルでアンサンブル学習してもあまり効果がないことでしょうか。決定木の一種であるLightGBMとXGboostでアンサンブルしてもほとんど意味がありません。今回扱っているデータは説明変数が量的で目的変数が質的である他クラス分類問題なので、ニューラルネット、基底関数、カーネル法等を試してみると良さそうです。

 

データの前処理というのはモデルに与えるデータを整形することです。不定値(Null値)を平均値で埋めたり外れ値を除去したりといったことが挙げられるのですが、

これが非常に南海ホークス。というのもデータによって値が全然が違うので単純にコードをコピペするだけじゃうまくいかないんですよね。そのうえこのデータは不定値も質的変数もないためデータを改竄することが難しい。外れ値は今回予測するものが所属確率なので、外れ値にもちゃんと意味はある。そう考えたら何をすればいいのか全然わからなくなりました。

 

まぁそんなわけで個人的な見解としてはアンサンブル学習を試すのが一番良さそうという結論になりました。本当にそうなのかは分かりません。一緒にやる人がいないので

私はこの問題についてに驚くべき解法を発見したが、ここに記すには余白が狭すぎる。(一度言ってみたかった)

終わりに

完走した感想ですがコードの知識が全然足りないなーと。本当はデータの前処理であれやこれやして最後にね、簡単でしょとか言いたかったんですがpandasの知識がなさすぎて断念しました。アルゴリズムの勉強とかも重要なんですがコードが書けなきゃ意味がないというのを痛感しました。

 

肝心のマウスの件なんですが2月の大会?までには完成させたいと思ってます。マウスを作れば、「え、彼女作ってないやつおりゅ?」とマウントをとってくる相手に対して逆に「え、マウス作ってないやるおりゅ?」とカウンターをキメることができるのでそれをモチベに頑張ります。

 

明日はATさんの「まじ卍」です。(え?)

実際に見ないと内容が分かりませんね。

というわけで明日の記事は単位を質に入れてでも見ましょう。

最後まで読んでいただきありがとうございました。