ysk_son’s diary

勉強の記録

Pythonを使ったデータ分析の学習 - その8(予測モデルの作成)

巷で評判の良いPythonオンライン教材、『【ゼロから始めるデータ分析】 ビジネスケースで学ぶPythonデータサイエンス入門 | Udemy』を購入し、学習してみた。

前回エントリ(『予測する』とは?)はこちらから。

セクション5: CASE1:お弁当大作戦~お弁当の売り上げを予測してみよう~

ここではお弁当の売上データを使い、モデルを作成する。
また、作成したモデルを使って予測したデータをDeep Analyticsへ投稿する。

モデリングの手順

1・説明変数を決め、データを準備
 どのデータを使ってモデルを作るか?を決める
 今回で言うとお弁当データを学習データ(Train)と評価データ(Test)の2つにわけてモデルを作成する

2・モデルの準備
 どの手法を使ってモデルを作るか?を決める
 今回は単回帰モデルを作る

3・モデルの作成
 学習データから取り出した説明変数と目的変数のデータを使い、モデルを作成する

4・モデルを使い予測
 評価データから取り出した説明変数のデータを使い、3で作ったモデルを当てはめることで予測値を出す

5・モデルの評価
 評価データに対するモデルの予測結果と実際の値を比較することで、作成したモデルの評価をする

単回帰モデルとは

単回帰モデルとは、1つの目的変数を1つの説明変数のみでモデル化する方法であり、
y = ax + b の式で表せられる。

ここでいう a は傾きであり、直線の場合は右肩上がりなら正の傾き、右肩下がりなら負の傾きである。また、 b は切片であり、直線とX=0がぶつかるところである。

f:id:ysk_son:20180219170801p:plain

例えばこのグラフの場合、傾きは-0.5であり、切片は105となる。

モデルを作成する

早速描いていく。

# まずは必要なもののインポート
# sklearn.linear : サーキットラン,回帰モデルを作るのに便利なライブラリ
# LinearRegression : 線形回帰という意味

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.head()

ここまで入力して以下のように先頭行が表示されればOK。
f:id:ysk_son:20180219171639p:plain

引き続きモデルを作成していく。

# trainから説明変数と目的変数となるデータを取り出す
# 説明変数はtrainからtemperatureを選択し、変数名をtrainXとして代入する
# 目的変数はtrainからyを選択し、変数名をyとして代入する

trainX = train["temperature"]
y = train["y"]

# testから説明変数となるデータを取り出す
# 説明変数はtrainと同じtemperatureを選択し、変数名をtestXとして代入する

testX = test["temperature"]

# 単回帰の場合のみ、説明変数に対しておまじないが必要となる
# 単回帰の場合はややこしいが、train,testの説明変数ともに、データの形を整える必要がある
# 具体的にはvalues.reshape(-1,1)というおまじないをする
# 整えた後、再び変数Xに代入する

trainX = trainX.values.reshape(-1, 1)
testX = testX.values.reshape(-1, 1)

# 回帰のモデルの箱を用意する
# モデルを作る為にはまず、モデルを表す箱が必ず必要となる
# 変数名をmodel1として、LR()を代入する

model1 = LR()

# 単回帰モデルを作る
# fit関数を使う
# カッコの中に、説明変数、目的変数の順番に書く

model1.fit(trainX,y)

ここでこのようなリアクションがあればOK。
単回帰モデルが作れた。
f:id:ysk_son:20180219172357p:plain


次に作ったモデルの傾きや切片を確かめる。

# 傾きはcoef_を使う
model1.coef_

# 切片はintercept_を使う
model1.intercept_

このように表示された。
f:id:ysk_son:20180219172552p:plain

なぜ傾きが array([-2.5023821]) と配列で表示されるのかはわからないが、調べてもわからなかったので「こういうもんだ」と自分に言い聞かせて先に進む。
(エラーではないと思われる)

次はテストデータに対する予測を行う。
予測にはpredict関数を使う。
予測結果は変数predに代入する。

pred = model1.predict(testX)

# predで中身を見てみる
pred

このように表示され、テストデータに対する予測値が求められたことが確認できる。
f:id:ysk_son:20180219173424p:plain

ここも先程同様、なぜ数値が array([……………]) と配列で表示されるのかはわからないが、調べてもわからなかったので「こういうもんだ」と自分に言い聞かせて先に進む。
(エラーではないと思われる)


ここからDeep Analyticsへ投稿する準備を行う。
まずはsampleの中身を確認する

sample.head()

このように表示される。
日付の右の列(列1)に予測値が並んでいる。
f:id:ysk_son:20180219174121p:plain

今回求めた予測結果は列1に該当するので、ここに先ほど求めたpredを代入する。

# 代入
sample[1] = pred

sampleに正しく代入がされたか確認をするために、もう一度sampleの中身を確認する。

sample.head()

このように表示される。
f:id:ysk_son:20180219174633p:plain

当初と違う値が列1に代入されていることがわかる。


最後に投稿するために、代入をしたsampleをファイルで書き出す。
csv出力にはto_csv関数を使う。
今回必要なオプションは、"submit1.csv", index=None, header=None の3つである。

sample.to_csv("submit1.csv",index=None,header=None)

正しく処理されている場合はマイドキュメント内のcase1にsubmit1.csv というタイトルのファイルが書き出される。
↓無事できた。
f:id:ysk_son:20180219175204p:plain


本日はここまで。
次回は作成したファイルをDeep Analyticsへ投稿していく。