コンビニ商品の売上予測

気象シミュレーションデータから、各商品が何個売れるか当ててみよう!

賞金: 100,000 参加ユーザー数: 486 約2年前に終了

GradientBoostingRegressor Base line−(LB:2.052 ) by Oregin

GradientBoostingRegressor Base line−(LB:2.052 ) by Oregin

コンビニ商品の売上予測

コンビニ商品の売上予測のサンプルコードです。ご参考までご活用ください。

※Google Colabで実行可能です。

LB= 2.052 でした。

ディレクトリ構成

  • ./notebook : このファイルを入れておくディレクトリ
  • ./result : 出力結果を入れておくディレクトリ
  • ./data : test_data.csv,train_data.csv,submission.csvを入れておくディレクトリ

初期設定

# カレントディレクトリを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')

添付データ

  • baseline.ipynb?X-Amz-Expires=10800&X-Amz-Date=20241118T114433Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIP7GCBGMWPMZ42PQ
  • Favicon
    new user
    コメントするには 新規登録 もしくは ログイン が必要です。