前回データの概要をみたところで、結合する必要があるかなと考えていましたがどう手をつけていいやら全くわからず。。。
今回作ったコードは前回分も合わせて、Noteにまとめようかと思います。
一回立ち戻って、何を予測するべきかをもう一度見返すことにしました。最初からしっかりやらないからこうなるのです。反省です。ということで改めてDataの項目を確認したところ、下記のような表記。
File descriptions
- sales_train.csv – the training set. Daily historical data from January 2013 to October 2015.
- test.csv – the test set. You need to forecast the sales for these shops and products for November 2015.
2013.1 – 2015.10のデータを元に2015.11の売り上げを予測するというものでした。そう考えるとitemやcategoryやshopの名前ってそれほど重要ではないのではないか?と都合よく考え出しました。
それよりは年や日付など時系列的なものの方が効きそうです。
ということで、下記のコード。
train_3["year"] = train_3["date"].str[-4:]
train_3["month"] = train_3["date"].str[-7:-5]
train_3[["month", "item_cnt_day"]].groupby(["month"], as_index=False).sum().sort_values(by="item_cnt_day", ascending=True)
train_3[["year", "item_cnt_day"]].groupby(["year"], as_index=False).sum().sort_values(by="item_cnt_day", ascending=True)
dateは文字列なので、そこから年と月を分割したのです。さらにそれぞれのピボットを作り、その傾向を確認しました。結果的に年はかなり相関がありそうでした。ついでに日にちも月も傾向みましたが、年ほど明確ではなかったです。
現時点のtrainのテーブルは下記のようになっています。
ID | shop_id | item_id | item_category_id | year | month |
---|
引き換えtestのテーブルはyearとmonthが抜けていました。このままではtrainとtestで特徴量の数が異なり、計算できないよとのことでしたので、testにもyearとmonthを追加しようと。内容は今回予測する2016年、11月なので、単純にそれらを次のコードで追記。
test_3["year"] = 2016
test_3["month"] = 11
これで特徴量の数も一致したので、早速モデル作りと予測を行いました。今回は決定木を採用。ランダムフォレストも試してみたのですがCPU overで計算完了せず。どうしたら動くのやら次の課題です。
下のコードで、trainテーブルの特徴量をX_train, 目的変数をY_trainへ、testテーブルの特徴量をX_testに代入しました。この時IDは予測と関係ないので除去。ついでにshapeでカラムの数が一致していることを確認。
# 機械学習
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier
# 1. X_trainには、目的変数以外を入力
X_train = train_3.drop("item_cnt_day", axis=1)
# 2. Y_trainには、目的変数が入ったtrain_dfを代入
Y_train = train_3["item_cnt_day"]
# 3. X_testには、IDを除いたtest_dfを代入
X_test = test_3.drop("ID", axis=1).copy()
# 4. X_train、Y_train、X_testの行数、列数を出力してください。
print(X_train.shape, Y_train.shape, X_test.shape)
#trainを分割
X_train_lr, X_test_lr, Y_train_lr, Y_test_lr = train_test_split(X_train, Y_train, test_size=0.2)
決定木によるmodel作りと予測を実行。
decision_tree = DecisionTreeClassifier()
decision_tree.fit(X_train, Y_train)
Y_pred = decision_tree.predict(X_test)
acc_decision_tree = round(decision_tree.score(X_train, Y_train) * 100, 2)
print(acc_decision_tree)
最後に予測値をsubmissionのsampleと合わせてcsv出力。kaggleのoutputフォルダに保存しています。
# 1. PredictをCSVファイルに保存。
submission = pd.DataFrame({
"ID": test_3["ID"],
"item_cnt_month": Y_pred
})
submission.to_csv('/kaggle/working/my_submission.csv', index=False)
そして提出した結果、Scoreは1.53867。。。RMSTなので小さい方が良いと思うのですが、順位はというと順位は9,767人の参加者中7,935位。正直まだ下にいるのかというのが本音です。。。
さらに点数を上げる要素としては、特徴量の見直し、学習法の見直し、ハイパーパラメータの見直し、あと今回の全コードをnoteに公開しようと思っています。
まあ1回目で提出まで出来たのでとりあえずよしとします。