データ分析⑥
# PART1 簡単な予測モデルを作ってみよう
# おまじない
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
from sklearn.linear_model import LinearRegression as LR
# 線形回帰による予測を行うクラスとして、sklearn.linear_model.LinearRegression が用意
# 線形回帰モデル (Linear Regression)
# データの読み込み
# train.csvとtest.csvとsample.csvの3つのファイルを読み込みましょう
# それぞれを読み込んだものは変数はtrain, test, sampleに代入しましょう
# sampleを読み込む時は、header=Noneというオプションを忘れないようにしましょう
train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")
sample = pd.read_csv("sample.csv",header=None)
# trainの先頭行を見てみましょう
train.head()
datetime y week soldout name kcal remarks event payday weather precipitation temperature
0 2013-11-18 90 月 0 厚切りイカフライ NaN NaN NaN NaN 快晴 -- 19.8
1 2013-11-19 101 火 1 手作りヒレカツ NaN NaN NaN NaN 快晴 -- 17.0
2 2013-11-20 118 水 0 白身魚唐揚げ野菜あん NaN NaN NaN NaN 快晴 -- 15.5
3 2013-11-21 120 木 1 若鶏ピリ辛焼 NaN NaN NaN NaN 快晴 -- 15.2
4 2013-11-22 130 金 1 ビッグメンチカツ NaN NaN NaN NaN 快晴 -- 16.1
# 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)
LinearRegression()
# 作ったモデルの傾きや切片を確かめてみましょう
# 傾きはcoef_を使います
# 切片はintercept_を使います
model1.coef_
array([-2.5023821])
model1.intercept_
134.79948383749922
# 予測をしましょう
# predict関数を使います
# 予測結果は変数predに代入しましょう
pred = model1.predict(testX)
pred
array([ 84.25136537, 74.99255159, 62.9811175 , 80.99826864,
79.49683938, 76.49398085, 78.49588653, 69.48731097,
67.73564349, 95.76232304, 88.25517673, 77.24469548,
74.99255159, 84.25136537, 96.01256125, 98.01446693,
88.00493852, 77.99541011, 87.00398568, 85.75279463,
85.75279463, 87.75470031, 87.5044621 , 94.7613702 ,
86.75374747, 84.50160358, 81.74898327, 98.01446693,
98.76518156, 86.00303284, 95.26184662, 99.01541977,
94.51113199, 97.51399051, 108.52447176, 97.51399051,
106.27232787, 111.7775685 , 97.01351409, 96.51303767])
# sampleの中身を確認してみましょう
# sample.head()
0 1
0 2014-10-1 24
1 2014-10-2 71
2 2014-10-3 25
3 2014-10-6 32
4 2014-10-7 60
# sample[1]に予測結果を代入しましょう
# sample[1] = pred
# sample.head()
0 1
0 2014-10-1 84.251365
1 2014-10-2 74.992552
2 2014-10-3 62.981117
3 2014-10-6 80.998269
4 2014-10-7 79.496839
# sampleをファイルで書きだしましょう
# to_csv関数を使います
# オプションは3つあり、"submit1.csv", index=None, header=Noneを書きます
sample.to_csv("submit1.csv",index=None,header=None)
# 実習
# 1.説明変数をkcalとして、単回帰モデルを作ろう。まず、 trainとtestのkcalに欠損値があるかないか確認しよう
# 本当に欠損があるかどうか、head関数を使って確認しよう
train.isnull().sum()
datetime 0
y 0
week 0
soldout 0
name 0
kcal 41
remarks 186
event 193
payday 197
weather 0
precipitation 0
temperature 0
dtype: int64
test.isnull().sum()
datetime 0
week 0
soldout 0
name 0
kcal 4
remarks 33
event 37
payday 38
weather 0
precipitation 0
temperature 0
dtype: int64
# 2.trainのkcalの平均値を求め、変数avgに代入しよう
avg = train["kcal"].mean()
avg
404.4096385542169
# 3.変数avgを使って、trainとtestのkcalの欠損値を補間し、それぞれを変数名trainXとtestXに代入してみよう
trainX = train["kcal"].fillna(avg)
testX = test["kcal"].fillna(avg)
trainX
0 404.409639
1 404.409639
2 404.409639
3 404.409639
4 404.409639
...
202 408.000000
203 394.000000
204 404.409639
205 404.000000
206 398.000000
Name: kcal, Length: 207, dtype: float64
# 4.trainXとtestXをvalues.reshape(-1,1)を使って形を整え、再びtrainX, testXへ代入しよう 1. 3番ではtrainXにはavgで補間されたtrain["kcal"]が代入される 2. 4番では補間されたtrainXにおまじないをかけたものがtrainXに代入されることになる
trainX = trainX.values.reshape(-1,1)
testX = testX.values.reshape(-1,1)
# 5.trainからyを取り出し、変数yに代入しよう
y = train["y"]
# 6.回帰モデルの箱を変数名model2として用意しよう
model2 = LR()
# 7.trainXとyを使って単回帰のモデルを作ろう
model2.fit(trainX,y)
LinearRegression()
# 8.作ったモデルの傾きと切片を確認しよう
model2.coef_
array([0.13195178])
model2.intercept_
33.26061577029441
# 9.testXを使って予測をし、予測値を変数pred2に代入しよう
pred2 = model2.predict(testX)
pred2
array([88.68036439, 88.02060548, 86.70108765, 86.04132874, 89.99988221,
88.68036439, 90.65964112, 86.62318841, 87.096943 , 92.63891786,
86.04132874, 88.02060548, 89.47207508, 87.36084656, 88.02060548,
89.73597865, 86.62318841, 86.96499122, 89.3401233 , 89.99988221,
89.47207508, 90.79159291, 91.31940004, 89.3401233 , 87.36084656,
86.62318841, 87.62475013, 89.47207508, 88.41646082, 85.51352161,
89.60402686, 90.39573756, 87.22889478, 89.99988221, 88.81231617,
86.62318841, 93.95843568, 88.02060548, 88.68036439, 88.15255726])
# 10.sample[1]にpred2を代入しよう
sample[1] = pred2
sample.head()
0 1
0 2014-10-1 88.680364
1 2014-10-2 88.020605
2 2014-10-3 86.701088
3 2014-10-6 86.041329
4 2014-10-7 89.999882
# 11.to_csv関数のindex=Noneがある時とない時の違い、header=Noneがある時とない時の違いは何かを考えてみよう
# 12.sampleをファイル出力し、submit2.csvという投稿用ファイルを作ろう
sample.to_csv("submit2.csv",index=None,header=None)
#13.submit2.csvをDeepAnalyticsに投稿して、submit1.csvのスコアを比較してみよう
この記事が気に入ったらサポートをしてみませんか?