[SIGNATE練習問題]自動車の走行距離予測をやってみた

こんにちは、@Yoshimiです。

データ分析の練習としてSIGNATEの練習問題に取り組んでみたので備忘録として残しておきます。ランキングは温かい目で見てください。

今回チャレンジするのは「自動車の走行距離予測」です。

データ概要

課題:
自動車の属性データからガソリン1ガロンあたりの走行距離を予測するモデルを作成していただきます

ということで、回帰問題になります。

どのようなデータが存在するのかチェックしてみます。

カラム ヘッダ名称 データ型 説明
0 id int インデックスとして使用
1 mpg float ガソリン1ガロンあたりの走行距離(mile par gallon の略)
2 cylinders varchar シリンダー
3 displacement float 排気量
4 horsepower float 馬力
5 weight float 重量
6 acceleration float 加速度
7 model year varchar 年式
8 origin varchar 起源
9 car name varchar 車名

私は車にあまり興味がないのですが、ゲームのクオリティをみたときは少し感動したことを覚えています。車は消耗品の塊みたいなイメージがあるので、使えば使うほど劣化していくことを考えると何となく走行距離に関係する特徴量も想像がつきます。なぜ、走行距離なのか?ですが、走行距離が多ければ、タイヤも摩耗することが考えられるので、中古査定の時に金額に関わってくるのかなと。だから走行距離が気になるわけです。

モジュール・データの読み込み

今回、TSVファイルなのでdelimiter='\t'として読み込みます。

データの確認をする

データ数、カラム数をチェックします。


データ199あり、説明変数(特徴量)はmpgを除くと9あります。

データの一部をチェックしてします。


car nameがテキストになっております。object型でしょう。必要であれば数値化し、モデル構築に利用します。他は問題なさそうです。

欠損値も確認しておきましょう。欠損値があるようであれば、平均値、中央値、最頻値などで埋める処理が必要です。

欠損値はなさそうです。

データの方をチェックします。

ん??horsepowerobjectになっております。head()で確認した際は、float型でしたが、もしかしたらどこかにfloat型以外のデータがあり、object型として認識されているのかもしれません。この不明なでデータを処理する必要があります。

データクリーニング・前処理

さて、ここがデータサイエンティストの見せ場の前処理です。

  • 欠損値処理
  • ダミー変数化
  • 外れ値、不要なデータの削除
  • 特徴量生成

がメインとなります。

外れ値の処理は実際、plot図を確認し、該当するようなデータがあれば処理を行っていきます。特徴量生成は関係性を確認し、新たに特徴量を自ら作るというものです。

欠損値

isnull().sum()で確認したところ、欠損はなかったので処理は不要

ダミー変数化

horsepowerがobjectになっていたのでデータの確認をします。すると?があることが発覚。どのくらいのデータがあるのか確認します。

4つのでーががヒットしました。このデータを処理するのですが、np.nanで扱い、その後に平均値で埋めていきます。

これでobjectがint64になりました。

同じ工程をtestデータでも行います。

不要データの削除

計算には不要なデータを取り除いていきます。id、car nameを取り除きます。X_****に代入し、計算用データセットを作成します。
その処理の前に、目的変数を作成しておきます(yがdropされる前に抽出します)。今回の目的変数は、mpgなので、mpgyへ代入しておきます。

データクリーニング・前処理が一通り終わったと思います。もちろん、相関図、箱ひげ図などを十分に活用してより素晴らしいデータを作成することが課題ではありますが、まずはここで次に進みます。

モデルの準備

これを実行すると非常にびっくりする評価になります。マイナス評価が突然出てきます。うん、失敗・・・

予測

まずGradientBoostingRegressorでモデルを作成し、予測してみます。

predに予測した値が入っているので、提出用ファイルsample[1]に代入し、CSV出力します。

精度は高くなかったです。

予測:グリッドサーチ(1)

次はグリッドサーチを使ってみます。

scikit learnにはグリッドサーチなる機能がある。機械学習モデルのハイパーパラメータを自動的に最適化してくれるというありがたい機能。

estimator = modelでは、前述のモデルmodelを参照しています。param_grid = paramは、パラメータセッティングの代入値です。
グリッドサーチを行った結果、数値の最高打点の組み合わせは以下の通りです。

予測し直し、再度CSVを出力します。

予測:グリッドサーチ(2)

実は、いろいろ試した結果、RandomForestRegressorが一番よかったです。

なんか最後グダグダになってしまい申し訳ございません。

最終スコア(暫定評価)は2.85800でした。

投稿者のスコアを見る限りまだまだ改良の余地があるようです精進します。

ABOUTこの記事をかいた人

Yoshimi

大学卒業して、キラキラしていたのでIT業界にはいりましたが、中身はブラックでした!!だから、投資技術を磨いて早くリタイヤしたいです。株価、Python、機械学習をもうもう勉強中です。