Oregin
コンビニ商品の売上予測のサンプルコードです。ご参考までご活用ください。
※Google Colabで実行可能です。
LB= 2.052 でした。
ディレクトリ構成
# カレントディレクトリをnotebook,result,dataディレクトリが格納されているディレクトリに移動
%cd /XXX/XXX
import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings('ignore')
import statsmodels
from sklearn.ensemble import GradientBoostingRegressor
import statsmodels.api as sm
from statsmodels.regression.quantile_regression import QuantReg
!python3 --version
print("Pandas", pd.__version__)
print("Numpy", np.__version__)
print("statsmodels", statsmodels.__version__)
import matplotlib
print("Matplotlib", matplotlib.__version__)
Python 3.7.13 Pandas 1.3.5 Numpy 1.21.6 statsmodels 0.12.2 Matplotlib 3.2.2
#データの読込
#データの読み込み
import pandas as pd
train_data = pd.read_csv("./data/train_data.csv", index_col='id')
test_data = pd.read_csv("./data/test_data.csv", index_col='id')
print(train_data.shape)
print(test_data.shape)
(350, 43) (21, 4)
# 訓練データのカラムを格納
columns = train_data.columns
# 訓練データの確認
train_data.head()
date | highest | lowest | rain | ice1 | ice2 | ice3 | oden1 | oden2 | oden3 | ... | bento3 | bento4 | tild1 | tild2 | men1 | men2 | men3 | men4 | men5 | men6 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
id | |||||||||||||||||||||
1 | 4/11 | 21.9 | 12.4 | 0.0 | 25 | 72 | 26 | 10 | 23 | 52 | ... | 70 | 27 | 12 | 12 | 57 | 30 | 41 | 38 | 37 | 35 |
2 | 4/12 | 25.9 | 13.9 | 0.0 | 30 | 85 | 33 | 9 | 18 | 42 | ... | 23 | 9 | 5 | 8 | 19 | 9 | 13 | 26 | 4 | 16 |
3 | 4/13 | 20.9 | 11.9 | 0.0 | 21 | 68 | 28 | 12 | 22 | 57 | ... | 19 | 6 | 4 | 9 | 23 | 9 | 11 | 33 | 4 | 13 |
4 | 4/14 | 18.8 | 11.4 | 0.0 | 19 | 62 | 35 | 13 | 29 | 62 | ... | 74 | 28 | 15 | 17 | 55 | 35 | 46 | 46 | 51 | 46 |
5 | 4/15 | 22.1 | 13.5 | 19.0 | 21 | 72 | 32 | 10 | 24 | 44 | ... | 69 | 26 | 4 | 9 | 54 | 33 | 39 | 40 | 41 | 40 |
5 rows × 43 columns
# 訓練データに使うカラムと、予測するカラムを設定
train_columns = ['highest', 'lowest', 'rain']
target_columns = columns[4:]
# 訓練データを、説明変数Xと目的変数Yに分割
x = train_data[train_columns]
X = sm.add_constant(x)
Y = train_data[target_columns]
# テストデータの説明変数test_Xを作成
tx = test_data[train_columns]
test_X = sm.add_constant(tx)
# 分位点を設定
qs = np.array([0.01, 0.1, 0.5, 0.9, 0.99])
# 予測結果を保存する辞書型データを作成
results = dict({})
# 商品毎の予測を作成する
for target in target_columns:
# 分位点毎に予測を作成する
for q in qs:
# モデルのインスタンスを作成
model = GradientBoostingRegressor(loss='quantile', alpha=q,
n_estimators=250, max_depth=3,
learning_rate=.1, min_samples_leaf=9,
min_samples_split=9,random_state=42)
#学習を実施
res = model.fit(X, Y[target])
#予測を実施
pred_y = model.predict(test_X)
#予測結果を格納
results[(target, q)] = pred_y
# 試しに商品「men6」の分位点「0.01」の予測値を確認
results[('men6', 0.01)]
array([13., 13., 13., 13., 13., 13., 13., 13., 13., 13., 13., 13., 13., 13., 5., 13., 13., 13., 13., 13., 13.])
# 商品_分位点 毎のリストに変換
submit_rows = [[f'{k[0]}_{k[1]}']+ v.tolist() for k, v in results.items()]
#テスト結果の出力
submit_df = pd.DataFrame(np.array(submit_rows)[:, 1:22], index=np.array(submit_rows)[:, 0])
submit_df.columns = list(range(1, 22))
submit_df = submit_df.transpose()
submit_df.index.name = 'id'
submit_df.to_csv('./result/submission.csv')