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()
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')