わいす工場 Kaggle ど素人のkaggle5 -3rd try-

ど素人のkaggle5 -3rd try-


早くも3回目の提出となりました。まずは前回までのコードを一括で記述します。train_df、test_dfにデータ格納するところは割愛してます。地味ですが、kaggleのNotebookでquick saveだけだとoutputが保存されないらしいので、全部コード書き終わったらfullでsaveとりましょう。

#各種テーブルを結合
 item_2 = pd.merge(item, categories, how="inner" ,on="item_category_id")
 train_2 = pd.merge(train_df, item_2, how="inner" ,on="item_id")
 test_2 = pd.merge(test_df, item_2, how="inner" ,on="item_id")
 train_3 = pd.merge(train_2, shops, how="inner" ,on="shop_id")
 test_3 = pd.merge(test_2, shops, how="inner" ,on="shop_id")
#dateを年、月、日で分解。
 train_3["year"] = train_3["date"].str[-4:]
 train_3["month"] = train_3["date"].str[-7:-5]
 train_3["day"] = train_3["date"].str[0:2]
#item, shop, categoryのrankを作成
 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)
#それぞれpivotでテーブルを作り、降順にソート。そこにindexを付与し、売り上げランキングを作成する
 item_rank = train_3[["item_name", "item_cnt_day"]].groupby(["item_name"], as_index=True).sum().sort_values(by="item_cnt_day", ascending=False)
#IDとして1から振り直し。sortは上のピボット生成時に実施ずみ
 item_rank['item_rank'] = pd.RangeIndex(start=1, stop=len(item_rank.index) + 1, step=1)
 shop_rank = train_3[["shop_name", "item_cnt_day"]].groupby(["shop_name"], as_index=True).sum().sort_values(by="item_cnt_day", ascending=False)
 category_rank = train_3[["item_category_name", "item_cnt_day"]].groupby(["item_category_name"], as_index=True).sum().sort_values(by="item_cnt_day", ascending=False)
 shop_rank['shop_rank'] = pd.RangeIndex(start=1, stop=len(shop_rank.index) + 1, step=1)
 category_rank['category_rank'] = pd.RangeIndex(start=1, stop=len(category_rank.index) + 1, step=1)

#train, testにitem, shop, category_rankを結合
#howをleftにしないとtestの行数が変化してあとで困る
 train_4 = pd.merge(train_3, item_rank["item_rank"], how="left" ,on="item_name")
 test_4 = pd.merge(test_3, item_rank["item_rank"], how="left" ,on="item_name")
 train_5 = pd.merge(train_4, shop_rank["shop_rank"], how="left" ,on="shop_name")
 test_5 = pd.merge(test_4, shop_rank["shop_rank"], how="left" ,on="shop_name")
 train_6 = pd.merge(train_5, category_rank["category_rank"], how="left" ,on="item_category_name")
 test_6 = pd.merge(test_5, category_rank["category_rank"], how="left" ,on="item_category_name")

#testに予測したい年月日を入力
 test_6["year"] = 2016
 test_6["month"] = 11
 test_6["day"] = 1

#item_rankに空白があるため、最下位で補填。順位はtest.info()で確認
 test_6["item_rank"] = test_6["item_rank"].fillna(21808)
今回の目玉として、item_rankを区分化しようということで、おおよその目安をtrain_6.describe()で確認。

date_block_numshop_iditem_iditem_priceitem_cnt_dayitem_category_iditem_rankshop_rank
count2.935849e+062.935849e+062.935849e+062.935849e+062.935849e+062.935849e+062.935849e+062.935849e+062.935849e+06
mean1.456991e+013.300173e+011.019723e+048.908532e+021.242641e+004.000138e+012.649291e+031.734426e+019.804866e+00
std9.422988e+001.622697e+016.324297e+031.729800e+032.618834e+001.710076e+013.292436e+031.409859e+011.204331e+01
min0.000000e+000.000000e+000.000000e+00-1.000000e+00-2.200000e+010.000000e+001.000000e+001.000000e+001.000000e+00
25%7.000000e+002.200000e+014.476000e+032.490000e+021.000000e+002.800000e+013.260000e+025.000000e+002.000000e+00
50%1.400000e+013.100000e+019.343000e+033.990000e+021.000000e+004.000000e+011.345000e+031.400000e+015.000000e+00
75%2.300000e+014.700000e+011.568400e+049.990000e+021.000000e+005.500000e+013.726000e+032.800000e+011.300000e+01
max3.300000e+015.900000e+012.216900e+043.079800e+052.169000e+038.300000e+012.180700e+046.000000e+018.400000e+01

今回は25%, 50%, 75%で区分してみました。

#describeからiterankを区分分け

combine = [train_6, test_6]

for dataset in combine:    
    dataset.loc[ dataset['item_rank'] <= 326, 'item_rank'] = 0
    dataset.loc[(dataset['item_rank'] > 326) & (dataset['item_rank'] <= 1345), 'item_rank'] = 1
    dataset.loc[(dataset['item_rank'] > 1345) & (dataset['item_rank'] <= 3726), 'item_rank'] = 2
    dataset.loc[ dataset['item_rank'] > 3726, 'item_rank'] = 3
    
# 先頭から5行を表示
train_6.head()

あとは前回同様に決定木で予想して、提出してみました。

気になる結果は、初回が1.53867、2回目は1.47967、そして今回は1.41241で、これまた微妙に改善。伴って順位は初回7,935位、前回7,782位と来て、今回は7,645位。まだまだやってみたいことがあるので、いろいろ試そう。

次回の改善ポイントは、item_rank同様にcatefory_rankとshop_rankの区分化、あとはitem_priceの特徴量反映、さらに決定木以外の手法の採用+ハイパーパラメータの使用などなど。

ということでまたもやすこーしだけ改善した3回目の提出でした。目標は今週中に何とか半分くらいの順位(4500位くらい)!!

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA


Related Post