【練習問題】都市サイクルの燃料消費量予測【データコンペ03】

コンペ概要

車の情報から都市サイクルの燃料消費量を予測するモデルを作成していただきます。
近年では、車の燃費は飛躍的に向上してきました。燃費の向上は、地球環境にもお財布にも優しいものです。
さて、ここでは、車の情報を元に、燃料消費量を予測します。

コンペ詳細

目標

mpg : int : 燃料消費量

データ

  • 学習用データ (train.tsv)
  • 評価用データ (test.tsv)
  • 応募用サンプルファイル (sample_submit.csv)

課題種別:回帰
データ種別:多変量
学習データサンプル数:199
説明変数の数:9
欠損値:あり

ヘッダ名称 データ型 説明
id int インデックスとして使用
mpg int 燃料消費量
cylinders int シリンダー
displacement int 変位
horsepower int 馬力(欠損箇所は文字列"?"で表記されています)
weight int 重量
acceleration float 加速
model year int モデル年
origin int 起源
car name varchar 車名

評価指標

評価関数「MAE」:Mean Absolute Error
評価値は0以上の値をとり、精度が高いほど小さな値となります。

情報公開ポリシー

モデル  : 公開可
分析結果 : 公開可

学習の目的

選択理由

3つめの練習問題コンペも表形式・テーブル数少のコンペを選択。 02は回帰問題で時系列があったので今回は時系列のデータがないものを選びました。

目標・目的

  • データの可視化
  • 特徴量生成
  • たのしむ

分析

データの確認

前回振り返りで気づいたデータの可視化なども含めてやっていきます。

目標値mpgヒストグラムですが山の左側に最頻値があり注意が必要なのでしょうか。どう注意したらいいんでしょうね。わかりません。今後の課題です。
データの内容を確認してみるとhorsepowerがobjectだったのでintに、その際に?で表されていた欠損値をnp.nanにします。
またUnnamed:0というカラムをidというカラム名に変更しました。わかりやすさ大事。

それぞれの相関係数を確認してみるとmpgとそれなりに相関係数が高いようです。

ベースライン作成

  • モデル:LightGBM
  • 説明変数:[’cylinders', 'displacement', 'horsepower','weight']
  • スコア:2.9785811

相関係数のグラフを参考に特に強かった'cylinders', 'displacement', 'horsepower','weight'の4つのカラムをベースラインとして使っていきます。
正直馬力と車重はわかりますが変位とシリンダーはわかりません。おそらくですが調べたりしたほうがいいやつ。練習問題なのでここは飛ばしていきます。

col mean std
cylinders 439.111514 134.952034
displacement 531.566479 351.840246
horsepower 248.637639 285.650145
weight 363.700361 203.506007

重要さはこのよくわからない変異とシリンダーが高かったです。やはり調べたほうがよさそうでしたね。

特徴量生成

今回は前回の振り返りを生かしていろいろ試行錯誤してみました。

  • モデル:LightGBM, LinerRegression
  • パラメータ:ベースライン、model year、2乗、car_companyなど
  • スコア:2.3043903、2.2908152

共通の前処理

  1. 馬力にある欠損値を['cylinders', 'displacement','weight',"acceleration",]の説明変数で機械学習して補完。
  2. ベースラインの説明変数のそれぞれを2乗した特徴量を作成。
  3. car nameの1つめの値が会社名ぽかったので取り出しcar_companyという特徴量を作成。

LighGBM

  • 初めに行ったのがすでにデータとしてあるものを加えていくとどうなるのかです。
    結果としてはベースラインに数個の説明変数を足す段階では予測値の差異は小さくなっていきましたが、それ以上足していくと過学習が起きてきたので与えられたデータからはmodel_yearだけを追加しました。

  • 以前理論的な話の動画を見ていた際、すでにある説明変数の2乗、3乗と追加していたのを思い出しました。ベースラインで使用していた説明変数に対し処理をしてみたところ、数の大小で比べる勾配ブースティング木では意味がなかったのか、重要度は0であるという結果でした。やってみての理解でした。

  • 使いづらそうなカラムであったcar nameからなにか特徴を引き出せないかとデータをみているとtoyotaの文字を見つけました。会社名だけ引っ張て来て特徴量として採用しました。
    結果としてはわずかながらの精度の向上でしたが、我ながら1歩進んだような特徴量に生成であったと思います。

LinerRegression

ほかのモデルだとどうなんだろ、と思い線形回帰を試してみました。

  • LightGBMで作っておいた2乗の特徴量を入れてみたところ、こちらではわずかに精度が向上しました。やはり回帰なので数字が違うと微々ながらも影響はあるようです。3乗~も次の機会に試し甲斐がありそうです。

  • LightGBMに比べると検証用データでは明らかな差があったにも関わらず、テストデータではそこまで大きな差はありませんでした。LightGBMは便利ではあるがほかのモデルも使い方や適切で十分な量のデータがあれば大きな差異はないのだなと感じました。

アンサンブル

  • スコア:2.3043903、2.2908152 → 2.1924690

せっかく2つモデル作ったしと期待せずにアンサンブルしました。アンサンブルは基本的には効果あると聞いていましたが、驚きました。個人的な目標値2.2を下回ったのでここらで振り返りに移っていきます。

振り返り

ほかの方の考え方を参考に振り返っていきます。

ベースラインの特徴選択

trainデータを確認するとhorsepowerがobjectでした。最初の相関関係を調べた際に直してからやるべきでした。
また特徴に使った4つの説明変数同士の相関関係も考慮することで多重共線性を抑えることができるそうです。変数を減らしてベースラインを作ってもよかったかもしれません。

car_nameの扱い

とりあえず会社名だけをピックアップして使ってみたcar_companyという変数でしたが、これを国別にしてカテゴリデータをつくるもの面白そうですね。偏見かもしれませんが日本産と外国産というだけで燃費に違いがありそうです。
→調べみるとつかわなかった説明変数originが地域のラベルのようです。

データの可視化

seaborn.relplot()を使ってそれぞれの分布などを可視化していました。これはぜひとも使っていきたいですね。分布などを使って条件に当てはまったときにフラグを立てるなどして新たな特徴量を作ってみても面白そうです。
またそこから説明変数の背景などを予想していたのでこの考え方を真似していきたいと思いました。きっと実務でも役立ちそうな考え方です。

kmeans法

クラスタリング?でしたっけ。それをつかっている人もいました。トライ&エラーをするときにわかりやすくクラスタリングができたら新たな処理のタネになるかもしれません。
現状あまり使い方がわかっていないというのが正直なところです。使って覚えていきたいところです。

反省点

グラフでの可視化

振り返りでほかの方を見ているとほんとにグラフでの描写を多用していました。今回少しばかり可視化をしたので次回以降も続けていきたいです。グラフの意味などはその都度に少しずつ学んでいきたい所存。

特徴量の生成

今回は少し本を読みなおし特徴量の生成についての復習をしてから望みました。その結果、累乗をしてみたりオブジェクト変数から一部を持ってきてラベリングするなど新たなことを自分で考えながらすることができました。結果はいまいちな精度の向上でしたが、個人的には満足しています。

最後に

少しではありましたが成長を感じることができる練習問題でした。 Kaggle本を一回通しで読んで予備知識として入れておくと何か成長するときの手助けになるかなと感じました。少し読み進めていきたいと思います。