Pythonを使ったデータ分析の学習 - その9(単回帰モデルをDeep Analyticsへ投稿する、重回帰分析とは、重回帰モデルの作成)
巷で評判の良いPythonオンライン教材、『【ゼロから始めるデータ分析】 ビジネスケースで学ぶPythonデータサイエンス入門 | Udemy』を購入し、学習してみた。
前回エントリ(予測モデル(単回帰モデル)の作成)はこちらから。
セクション5: CASE1:お弁当大作戦~お弁当の売り上げを予測してみよう~ (続き)
DeepAnalyticsに結果を投稿しよう①
前回エントリで作成したsubmit1とsubmit2をDeep Analyticsへ投稿する。
まずDeep Analyticsへアクセスする。
コンテスト一覧から『お弁当大作戦After【練習問題】』を探し、アクセスする。
ページ内の『解析結果を送信』をクリックする。
投稿画面に切り替わるので、submit1を投稿ファイルとして参照させ、使用した解析手法はLinear Regression を、使用したソフトウェアはPythonを選択する。
コメントに「説明変数をTemperatureにしました」と記載して、『データを投稿』ボタンを押す。
2分ほど待つとスコアがメールで届く。
F5で画面更新すると以下のように投稿スコアが反映される。
submit1のスコアは41.98742とある。
同様の手順でsubmit2についても投稿をする。
コメントは「説明変数をKcalにしました」と記載する。
投稿後の結果は以下となる。
submit2のスコアは39.59674とある。
今回のスコアは低い方が良い評価であるので、submit2の方がより良いということがわかる。
以下の画像にあるランキングページから今回の自分の投稿が何位だったのかわかる。
とても低い。。
今回はモデルの評価についての詳細なロジックについては触れないが、今回の評価指標はRMSEと呼ばれ、誤差を数値化する指標であるため、値(誤差)が小さいほうが望ましいモデルであるということだけは覚えておく必要がある。
その他の評価関数の種類や数式についてはどこか別の詳しい方の説明を参照してほしい。
重回帰モデルとダミー変数化とは
ここまでは単回帰モデルについて学習してきたが、ここからは重回帰モデルについて学習する。
重回帰モデルの説明は以下。
・2つ以上の説明変数を使った回帰モデル
・予測するための手がかりを複数使うイメージ
・数式は y = ax1*bx2*cx3... と表される
今回で言うと
a = 気温
b = 来店数
c = 天気
といった具合に、複数の説明変数を使って目的変数を求めることができるのである。
しかし上記の例でいくと c = 天気 は数値化しなければいけない。
そこでダミー変数を使う。
以降の作業で実際にダミー変数を活用しながら、実際に重回帰モデルを作っていく。
重回帰モデルを作ってみよう
早速描いていく。
# いつもの import pandas as pd import numpy as np from matplotlib import pyplot as plt %matplotlib inline from sklearn.linear_model import LinearRegression as LR # 次は必要なファイルの読み込み # sampleを読み込む時はheader=Noneオプションを忘れないように注意 train = pd.read_csv("train.csv") test = pd.read_csv("test.csv") sample = pd.read_csv("sample.csv",header=None) # trainのweekの各値がそれぞれいくつあるか数えてみる(今回の注目ポイント) train["week"].value_counts()
ここで以下のようなリアクションがあればOK。
このままではweekの値をモデリングに使えないので、trainのweekを試しにダミー変数化する。
・ダミー関数への変換にはpd.get_dummies関数を使う
・カッコの中にダミー変数化したい変数を書く
pd.get_dummies(train["week"])
このように表示される。
やり方がわかったので、今回使用するデータweekとtemperatureを抜きだし、ダミー変数化したものを変数trainXに代入する。
※ ダミー変数化できるかできないかはPythonの方で識別してくれるので、weekもtemperatureの両方を指定してOK。
trainX = pd.get_dummies(train[["week","temperature"]])
trainX.head() で中身を確認すると、以下のように表示される。
作業を続ける。
# trainからyを取り出し、変数yに代入する y = train["y"] # 回帰モデルの箱を用意する(modelという名前で作成する) model = LR() # 重回帰モデルを作る model.fit(trainX,y)
ここでこのように表示されればOK。
傾きを確かめる。
model.coef_
このように表示される。
この内容から、月曜は売り上げが上がる傾向にあり、木曜には売り上げが落ちやすいということが推測できる。
続いて傾きを確かめる。
model.intercept_
このように表示される。
この内容からは切片が136であるということがわかる。
ここから実習。
# 1.testからweekとtemperatureを抜きだし、ダミー変数化したものを変数testXに代入する testX = pd.get_dummies(test[["week","temperature"]]) # 2.testXの中身を確認する testX.head() # 3.modelとtestXを使って予測をして、予測結果を変数名predに代入しよう pred = model.predict(testX) # 4.sample[1]にpredを代入して、"submit3.csv"というファイル名でファイル出力しよう sample[1] = pred sample.to_csv("submit3.csv",index=None,header=None)
これで重回帰モデルの作成は完了した。
最後にモデルをDeep Analyticsへ投稿してスコアを確認する。
DeepAnalyticsに結果を投稿しよう②
上の実習にて作成したsubmit3.csvをDeep Analyticsへ投稿する。
投稿の方法については本エントリの序盤に触れたのでここでの説明は割愛する。
前回同様に解析手法はLinear Regression を、使用したソフトウェアはPythonを選択する。
コメントは「説明変数はweekとtemperatureにしました」としておく。
結果は以下のスコア。
submit3のスコアは40.73978とある。
単回帰モデルであるsubmit2と比べて性能が悪くなってしまった。
重回帰モデルを使えば予測をするための手がかりが多くあるので、精度が高くなるような気がするが、なかなか現状では上手くいっていない。
なぜうまくいかないのか。
次回のエントリにて学習する。
本エントリはここまで。