目的
SIGNATEさんの練習問題として公開されている「レンタル自転車の利用者予測」 に挑戦します。レンタル自転車の利用者数を予測します。
目的変数と説明変数を選択する
「データを理解する - データを解析する前にすること」でデータの特徴や傾向を表やグラフを作りながら確認しました。
利用者数を予測するコンペですので、説明変数は自動的に利用者数('cnt')になります。
説明変数は、利用者数('cnt')と相関や関係がありそうな変数を選びます。時間('hr'),温度('temp'),体感温度('atemp')が利用者数('cnt')と相関や傾向がありそうでした。それに加えて、天気('weathersit')も追加します。天気('weathersit')はカテゴリーデータなので相関関係を確認していませんが、関係あると思って投入します。
目的変数・・・利用者('cnt')
説明変数・・・時間('hr')、温度('temp')、体感温度('atemp')、天気('weathersit')
で回帰分析を実施します。
カテゴリーデータの天気('weathersit')をダミー変数に変換する
天気('weathersit')は
1=晴,やや曇り
2=薄い霧+曇り,霧+千切れ曇,霧+やや曇り,薄い霧
3=小雪,小雨+雷雨+千切れ曇,小雨+千切れ曇
4=大雨+凍雨+雷雨+霧,雪+濃い霧
というデータ構成になっています。データ形式は整数(int)ですが、そのまま投入しても意味がありません。1から4をそれぞれゼロイチ(0,1)の2値にしてダミー変数にします。
One-Hot Encodingというのを使います。
df_one_hot_encoded = pd.get_dummies(df,columns=['weathersit'])
こんなイメージです。weathersit_1からweathersit_4まで作られました。
もし0,1に分かれているか確認したければ、value_counts()をやってみましょう。
df_one_hot_encoded[['weathersit_2']].value_counts()
weathersit_2は0が6427件、1が2218件あります。合計が8645ですので、train dataの件数と合致します。
回帰分析
いよいよ回帰分析です。
回帰分析で使うモジュールをインストールします。
from sklearn.linear_model import LinearRegression as LR
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
説明変数(X)と目的変数(y)を用意します。使うデータはダミーデータを作ったdf_one_hot_encodedを使います。
X = df_one_hot_encoded[['hr','temp','atemp','weathersit_1','weathersit_2','weathersit_3','weathersit_4']]
y = df_one_hot_encoded['cnt']
角括弧に使用する変数名を入れます。Xには複数の変数を投入しているので、重回帰分析を行うことになります。
# train dataをtrain dataとtest dataに分けます。
train_X, test_X, train_y, test_y = train_test_split(X, y, random_state=42, shuffle=False)
# 線形回帰モデルを作成する(実はこれは機械学習です)
model = LR()
# trainの説明変数('train_X')と目的変数('train_y')をモデルに投入します。
model.fit(train_X, train_y)
# モデルの精度を確認します。
model.score(test_X, test_y)
0.3493 ん...あまり高くないですね。
test dataもtrain dataと同じフォーマットにします。つまり天気の'weathersit'をダミー変数に変換します。
df_one_hot_encoded_t = pd.get_dummies(df_test,columns=['weathersit'])
test dataにモデルを適用します。
X_test = df_one_hot_encoded_t[['hr','temp','atemp','weathersit_1','weathersit_2','weathersit_3','weathersit_4']]
X_test_pred = model.predict(X_test)
予測結果をcsvに保存する
予測された利用者数はX_test_predに反映されています。これを提出用のフォーマットに保存して投稿します。
sample = pd.read_csv('パスをコピペします/sample_submit.csv', header=None)
sample[1] = X_test_pred
sample.to_csv('保存したい場所のパスをコピペします/ファイル名.csv',index=None, header=None)
結果と考察
暫定評価は198でした。精度が良い結果を得られませんでした。うまく学習できていないようですので、Deep learningを試したいと思います。