機械学習

練習コンペで3位になりました

こんにちは、チズチズです!

唐突ですが…

この前、SIGNATEで練習コンペを自力で最速(多分)で解く【MLC#17】という記事を書きました。

その続きで色々やってたところ

3位まで上げられました。

ここでの内容は、特別難しいことは扱っていません。(扱えない

コード数も短いです。 基礎のコードを少し変えてみたり使ってみたりという感じですw

勝因

  • Lasso回帰を使った
  • パラメータ調整を何回も行った
  • Logをとる

主にこの3つ、というかこの3つのおかげで良いスコアが出ました。

Lasso回帰は使ってる人少なかったですが、とても素晴らしいモデルになります。

使うデータと使わないデータ

car name

このデータには車種があります。

例えばプリウスなら燃費はいい、スポーツカーなら燃費は悪い。のような事は判断できますが、これは車種だけであって百数十種類あるため、役に立ちません。

説明変数は8つあります。(id, mpgを除いて)

前にcar nameは使いませんでしたが、理由として画像を貼り付けます。

この画像は、car nameをラベルエンコーディングした後の中身です。

バラバラすぎて当てになりません。

ということなので、車種は使わない方向性の方が精度は上がると思います。(測ってみたけど相関係数はとても低い

相関係数

前にこんなヒートマップを作りました。

あのときは0.5を取っていましたが、0.3台でも良いので(car nameは別)入れます。

酷いやつは0.08とかとても低いです。 実際に単純な重回帰分析でcar name以外の変数全部入れたらスコア上がりました。

欠損値

この前のは欠損値処理してませんが、このデータには欠損値があります。

数個しかありませんが、元々のデータ数が少ないためちゃんと処理しておかないと痛い目に遭いますw

例えばここです。 サラッと見た感じ5つ以上はありました。

データ破損等が怖いので、コピー取ってやってます。

Python標準ライブラリで?とNoneを置換します。

後はPandasのライブラリで欠損値を中央値(平均)で補完させれば完了です!

Lasso

スコアが上がった1番の理由としてLasso回帰を使ったことが挙げられます。

正則化項(LASSO)を理解する

Lasso回帰は出来るだけ次元圧縮(変数を減らす)して予測するというものです。

式を見て理解する人はそう多くはいないと思います。しかし、これが案外良い精度を出します。

前も1度使ったことがあり、精度が良かったので今回も使ってみました。

最高スコアのパラメータはこちらです。

普通は直線(LinearRegression)を使いますが、多項式にしてみました。

パラメータの悪戦苦闘の形跡はその後紹介します。

パラメータ

  • 多項式は4次元
  • Lasso
    alpha = 2
    max_iter = 200

このようなパラメータにしました。

パラメータの調整はここだけです。

これ以外のパラメータはよくわかりません。(切実

Log…

数学で一度は使ったことあるであろうLogですが、機械学習にも使えます。

実際にこれ使ったら精度が上がりました。

そもそもデータは正規分布に従っているデータが好ましいです(真ん中が高い

まず、元々のtarget

悪いとまでは言いません。試しにLogで正規分布に近づけてみます。

んー 何かきれいになったような気がする…

このグラフのコードはseabornを使います。

たったこれだけのコードで書けます。

ですが、これが結構重要でした。Logを使ったことでスコア0.04程上がりましたw

まだやってませんが、説明変数もグラフにして見てLogにしてみたりもやってみたいです。

悪戦苦闘

テスト出来ない!

まず1番大変だったことはこれです。

データ数は190ちょいととても少ないです。

つまり、テストデータとトレインデータに分けて学習させると1個辺りのロスが大きくて大変です。

ですが、テストしないと精度が上がったかどうかなんて提出してからじゃないとわかりません。

やっぱりテストさせたいと思って最終的にたどり着いたのはあまり良くないですが、「トレインデータで予測したモデルをトレインデータの予測に回す」

 

 

怠惰にループでパラメータを変えて、精度の良いパラメータで提出しましたが結構スコア低かったです。予想ですが、過学習と思われます。トレインデータをトレインデータで検証するのは適していないようです。

加えて、上の画像から分かると思うんですけどパラメータを変えて変わるスコアって極僅かなんです… だから、そう簡単にスコアは上げられませんでした。

パラメータ調整で行ったこと

まず、多項式なんですけど3次だと少なくて5次だと多いということが何となく上のテストでわかったので、4次にしました。

これは固定です。

後はLassoのalphaとmax_iterです。

元々alpha 20 max_iter 1200で結構スコア上がりました。

そこから上げるか下げるかで迷いましたが下げてみました。そしたら思い通りスコアが上がって3位になるような高精度のモデルが出来上がりました。

理由として考えられるのは、元々データ量が少ないため過学習しやすいことから、パラメータを下げて多少粗いモデルを作ったほうが過学習せずにフィットすることです。

データ数がこの100倍程あれば話は別ですがw

そして、最終的に行き着いたのが

4次の多項式

alpha = 4

max_iter = 400

このようなパラメータです。パラメータ小さくてもよく動くなぁと思いましたが、精度はちゃんとしています。

コード

モデルのプログラムを掲載します。

これを使えば同率の3位にはなれます。応用したらもっと順位上がるかも知れません。

こんなもんです。

コード長としては短い方かなーと思います。

np.exp()でlogしたデータを復元させます。

組んでいったコードの順序

  1. 単純に重回帰分析
  2. 多項式回帰
  3. Ridge回帰
  4. パラメータ設定なしでLasso
  5. car name以外のカラム全部入れてLasso
  6. Lassoのパラメータ戦い
  7. targetをLogで正規分布にする

こんなもんです。

途中でRidge回帰使ってみましたが、精度がイマイチだったので辞めました。

コードを組んでいるうちにこれをやってみたら精度上がるんじゃない?とか発想が生まれるので、それに任せてみたらLassoやLogに辿り着きました。

振り返り&感想

個人的にはあんな少ないデータでちゃんと予測できるのか?と疑ってましたが、案外行けました。

パラメータで勝負付いたな~と薄々感じています。パラメータも慣れが必要そうだしこれから色んな回帰問題やってみたいです。

周りにはXgboostやランダムフォレストを使っている人もいました。ですが、僕は全然精度良くなりませんでしたw 使い方が悪いと思いますが、線形回帰の方が楽ですw

今度使う機会あったらちゃんと学びたいです。

Kaggleで養った知識がここで活かされてとても嬉しいです。

  • Lasso
  • 相関係数について
  • Log

やった事が結果に残って本当に良かったです。これからも精進します。

これから

今調子乗っていますが、今度はKaggleの開催中のコンペに参加してみようかな~と思っています(もちろん開催中だからブログには出来ないけど

実戦経験をもうちょい積み上げてみたいっていうのもあります。

今のは練習問題で本気でやってる人は少ないでしょうし、Kaggleなんて話になったら参加者だって層だって違います。頑張って善戦します…

お読みいただいてありがとうございました!

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です