Kaggle試合-将来の販売を予測する(二)
8145 ワード
将来の販売予測(二)データの前処理と特徴抽出
1、初期化環境
import time # ,
start_time = time.time()
import numpy as np
import warnings
warnings.filterwarnings('ignore')
import pandas as pd
pd.set_option('display.max_rows', 99) # dataframe ,
pd.set_option('display.max_columns', 50) # dataframe ,
2、データの前処理
モデルの構築の主な過程は、読み出しデータをプログラムに転送し、後続の特徴抽出と変換を容易にするために、異常データを修正または洗浄することである.以下,csvデータファイルからトレーニングデータとテストデータをそれぞれプログラムに読み込みpandasモジュールのDataFrameタイプに保存する.
2.1販売データ
2.1.1販売データ読み出し
公式サイトから提供されたsales_train_v2.csvファイルでトレーニングデータを抽出しsale_に保存train変数の中にあります.sale_train = pd.read_csv('%s/sales_train_v2.csv' % data_path)
2.1.2異なるID(shop_id、item_id)の月間販売量を統計する
販売データに基づいてsale_train中の日本販売量、当月の月間販売量を統計して、そして月間販売量を訓練集trainに送金しますdataの中にあります.Item_Index=['shop_id', 'item_id', 'date_block_num']
data_temp1=sale_train[['shop_id','item_id', 'date_block_num','item_cnt_day']]
train_data=data_temp1.groupby(by=Item_Index)['item_cnt_day'].agg(['sum']).reset_index().rename(columns = {'sum': 'item_cnt_month'})
train_data['item_cnt_month'] = train_data['item_cnt_month'].astype(int).fillna(0)
2.1.3 item_への送金categroy_id属性
itemsからcsvファイルでitem_categroy_idプロパティはトレーニングセットtrainに集約されます.dataの中にあります.item = pd.read_csv('%s/items.csv' % data_path)
train_data = train_data.merge(item[['item_id', 'item_category_id']], on = ['item_id'], how = 'left')
2.1.4修正後のitem_cat_id_fixプロパティ
item_によるcategories.csvファイルのitem_category_nameフィールド、item_categroy_idプロパティを修正し、同じカテゴリの異なるモデルを同じカテゴリに分類し(商品タイプ名によって区分(2.3参照)、item_categroy_id_fixプロパティはトレーニングセットtrain_に集約されます.dataの中にあります.item_cat = pd.read_csv('%s/item_categories.csv' % data_path)
item_cat.item_category_name[0]=1
item_cat.item_category_name[1:8]=2
item_cat.item_category_name[8]=3
item_cat.item_category_name[9]=4
item_cat.item_category_name[10:18]=5
item_cat.item_category_name[18:25]=6
item_cat.item_category_name[25]=7
item_cat.item_category_name[26:28]=8
item_cat.item_category_name[28:32]=9
item_cat.item_category_name[32:37]=10
item_cat.item_category_name[37:43]=11
item_cat.item_category_name[43:55]=12
item_cat.item_category_name[55:61]=13
item_cat.item_category_name[61:73]=14
item_cat.item_category_name[73:79]=15
item_cat.item_category_name[79:81]=16
item_cat.item_category_name[81:83]=17
item_cat.item_category_name[83]=18
item_cat=item_cat.rename(columns = {'item_category_name': 'item_cat_id_fix'})
train_data = train_data.merge(item_cat[['item_cat_id_fix', 'item_category_id']], on = ['item_category_id'], how = 'left')
2.2テストデータ
2.2.1テストデータ読み出し
公式サイトから提供されたtest.csvファイルからテストデータを抽出してsale_に保存train変数の中にあります.sale_test = pd.read_csv('%s/test.csv' % data_path)
2.2.2テストデータをテストセットにまとめる
テストファイルのIDごとに対応するshop_idとitem_idテストセットtest_へのアセンブリdataで、テストセットのdate_をblock_numは34に割り当てられます(2015年11月の販売量を予測するため、対応するdate_block_num値は34です).test_data=sale_test[['shop_id', 'item_id']]
test_data['date_block_num']=34
2.2.3 item_への送金categroy_id属性
itemsからcsvファイルでitem_categroy_id属性はテストセットtest_に集約されるdataの中にあります.item = pd.read_csv('%s/items.csv' % data_path)
train_data = train_data.merge(item[['item_id', 'item_category_id']], on = ['item_id'], how = 'left')
2.2.4修正後のitem_cat_id_fixプロパティ
item_によるcategories.csvファイルのitem_category_nameフィールド、item_categroy_idプロパティを修正し、同じカテゴリの異なるモデルを同じカテゴリに分類し(商品タイプ名によって区分(2.3参照)、item_categroy_id_fixプロパティはテストセットtest_に集約されます.dataの中にあります.item_cat = pd.read_csv('%s/item_categories.csv' % data_path)
train_data = train_data.merge(item_cat[['item_cat_id_fix', 'item_category_id']], on = ['item_category_id'], how = 'left')
3、特徴工事
3.1訓練データとテストデータの集約
all_data=pd.concat([train_data,test_data],axis=0)
3.2平均フィーチャーの抽出
それぞれ異なるshop、item_を計算するid、item_category_id、item_cat_id_fixの毎月の商品販売量の平均値が特徴です.Target = 'item_cnt_month'
mean_encoded_col=[]
from tqdm import tqdm
for col in tqdm(['shop_id', 'item_id', 'item_category_id', 'item_cat_id_fix']):
col_tr = all_data[['date_block_num']+[col]+[Target]]
col_tr=col_tr.groupby(['date_block_num']+[col])[Target].agg('mean').reset_index().rename(columns ={Target:col+'_cnt_month_mean'})
all_data=all_data.merge(col_tr,on=['date_block_num']+[col],how = 'left')
mean_encoded_col.append(col+'_cnt_month_mean')
print(mean_encoded_col)
3.3前月の各販売特徴の抽出
は、現在の月の最初の月、前の2番目の月、前の3番目の月、前の4番目の月、一昨年のその月の販売台数の各特徴を特徴として抽出します.id_col=['shop_id', 'item_id']
index_cols = ['item_category_id', 'item_cat_id_fix', 'date_block_num']
cols_to_rename = mean_encoded_col+[Target]
print(cols_to_rename)
shift_range = [1, 2, 3, 4, 12] # 、 、 、
for month_shift in tqdm(shift_range):
train_shift = all_data[id_col + index_cols + cols_to_rename].copy()
train_shift['date_block_num'] = train_shift['date_block_num'] - month_shift
foo = lambda x: '{}_pre_{}'.format(x, month_shift) if x in cols_to_rename else x
train_shift = train_shift.rename(columns=foo)
all_data = pd.merge(all_data, train_shift, on=id_col+index_cols, how='left').fillna(0)
pre_cols = [col for col in all_data.columns if '_pre_' in col]
all_data = downcast_dtypes(all_data)
3.4すべてのデータに対して標準化処理を行う
すべてのデータを標準化し、後続の「モデル」のトレーニング速度を速める.from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
to_drop_cols = ['date_block_num']
feature_columns = list(set(pre_cols + index_cols + list(date_columns)).difference(to_drop_cols))
all_data[feature_columns] = sc.fit_transform(all_data[feature_columns])
3.5トレーニングセットとテストセットの作成
予測販売量のID番号(shop_id+item_id)を風別に13月から34月まで付与し、train_data予測対象のデータをデータセットallにまとめるsetの中にあります.all_set=test[['shop_id','item_id']].copy()
all_set['date_block_num']=np.int8(12)
for i in range(13,35):
data_tmp=sale_test[['shop_id','item_id']].copy()
data_tmp['date_block_num']=np.int8(i)
all_set=pd.concat([all_set,data_tmp],axis=0)
all_set=all_set.merge(all_data,on=['shop_id','item_id','date_block_num'],how='left').fillna(0)
all_set[id_col] = sc.fit_transform(all_set[id_col])
train_set=all_set[all_set['date_block_num']<34][id_col+['item_category_id','item_cat_id_fix']+pre_cols+date_columns]
train_value=all_set[all_set['date_block_num']<34]['item_cnt_month']
test_set=all_set[all_set['date_block_num']==34][id_col+['item_category_id','item_cat_id_fix']+pre_cols+date_columns]
*PS:**は13月から2013年のデータを使用していません.これは、特徴の中で数ヶ月前の販売データの特徴を使用していますが、2013年は12ヶ月前のデータがなく、2013年のデータを使用するとデータが不完全になるため、筆者は2014年以降のデータしか使用していません.
PS:最新の最適化はブログに同期していません.交流が必要なメールアドレスの交流:ブロガーメールアドレス:[email protected]
import time # ,
start_time = time.time()
import numpy as np
import warnings
warnings.filterwarnings('ignore')
import pandas as pd
pd.set_option('display.max_rows', 99) # dataframe ,
pd.set_option('display.max_columns', 50) # dataframe ,
モデルの構築の主な過程は、読み出しデータをプログラムに転送し、後続の特徴抽出と変換を容易にするために、異常データを修正または洗浄することである.以下,csvデータファイルからトレーニングデータとテストデータをそれぞれプログラムに読み込みpandasモジュールのDataFrameタイプに保存する.
2.1販売データ
2.1.1販売データ読み出し
公式サイトから提供されたsales_train_v2.csvファイルでトレーニングデータを抽出しsale_に保存train変数の中にあります.
sale_train = pd.read_csv('%s/sales_train_v2.csv' % data_path)
2.1.2異なるID(shop_id、item_id)の月間販売量を統計する
販売データに基づいてsale_train中の日本販売量、当月の月間販売量を統計して、そして月間販売量を訓練集trainに送金しますdataの中にあります.
Item_Index=['shop_id', 'item_id', 'date_block_num']
data_temp1=sale_train[['shop_id','item_id', 'date_block_num','item_cnt_day']]
train_data=data_temp1.groupby(by=Item_Index)['item_cnt_day'].agg(['sum']).reset_index().rename(columns = {'sum': 'item_cnt_month'})
train_data['item_cnt_month'] = train_data['item_cnt_month'].astype(int).fillna(0)
2.1.3 item_への送金categroy_id属性
itemsからcsvファイルでitem_categroy_idプロパティはトレーニングセットtrainに集約されます.dataの中にあります.
item = pd.read_csv('%s/items.csv' % data_path)
train_data = train_data.merge(item[['item_id', 'item_category_id']], on = ['item_id'], how = 'left')
2.1.4修正後のitem_cat_id_fixプロパティ
item_によるcategories.csvファイルのitem_category_nameフィールド、item_categroy_idプロパティを修正し、同じカテゴリの異なるモデルを同じカテゴリに分類し(商品タイプ名によって区分(2.3参照)、item_categroy_id_fixプロパティはトレーニングセットtrain_に集約されます.dataの中にあります.
item_cat = pd.read_csv('%s/item_categories.csv' % data_path)
item_cat.item_category_name[0]=1
item_cat.item_category_name[1:8]=2
item_cat.item_category_name[8]=3
item_cat.item_category_name[9]=4
item_cat.item_category_name[10:18]=5
item_cat.item_category_name[18:25]=6
item_cat.item_category_name[25]=7
item_cat.item_category_name[26:28]=8
item_cat.item_category_name[28:32]=9
item_cat.item_category_name[32:37]=10
item_cat.item_category_name[37:43]=11
item_cat.item_category_name[43:55]=12
item_cat.item_category_name[55:61]=13
item_cat.item_category_name[61:73]=14
item_cat.item_category_name[73:79]=15
item_cat.item_category_name[79:81]=16
item_cat.item_category_name[81:83]=17
item_cat.item_category_name[83]=18
item_cat=item_cat.rename(columns = {'item_category_name': 'item_cat_id_fix'})
train_data = train_data.merge(item_cat[['item_cat_id_fix', 'item_category_id']], on = ['item_category_id'], how = 'left')
2.2テストデータ
2.2.1テストデータ読み出し
公式サイトから提供されたtest.csvファイルからテストデータを抽出してsale_に保存train変数の中にあります.
sale_test = pd.read_csv('%s/test.csv' % data_path)
2.2.2テストデータをテストセットにまとめる
テストファイルのIDごとに対応するshop_idとitem_idテストセットtest_へのアセンブリdataで、テストセットのdate_をblock_numは34に割り当てられます(2015年11月の販売量を予測するため、対応するdate_block_num値は34です).
test_data=sale_test[['shop_id', 'item_id']]
test_data['date_block_num']=34
2.2.3 item_への送金categroy_id属性
itemsからcsvファイルでitem_categroy_id属性はテストセットtest_に集約されるdataの中にあります.
item = pd.read_csv('%s/items.csv' % data_path)
train_data = train_data.merge(item[['item_id', 'item_category_id']], on = ['item_id'], how = 'left')
2.2.4修正後のitem_cat_id_fixプロパティ
item_によるcategories.csvファイルのitem_category_nameフィールド、item_categroy_idプロパティを修正し、同じカテゴリの異なるモデルを同じカテゴリに分類し(商品タイプ名によって区分(2.3参照)、item_categroy_id_fixプロパティはテストセットtest_に集約されます.dataの中にあります.
item_cat = pd.read_csv('%s/item_categories.csv' % data_path)
train_data = train_data.merge(item_cat[['item_cat_id_fix', 'item_category_id']], on = ['item_category_id'], how = 'left')
3、特徴工事
3.1訓練データとテストデータの集約
all_data=pd.concat([train_data,test_data],axis=0)
3.2平均フィーチャーの抽出
それぞれ異なるshop、item_を計算するid、item_category_id、item_cat_id_fixの毎月の商品販売量の平均値が特徴です.Target = 'item_cnt_month'
mean_encoded_col=[]
from tqdm import tqdm
for col in tqdm(['shop_id', 'item_id', 'item_category_id', 'item_cat_id_fix']):
col_tr = all_data[['date_block_num']+[col]+[Target]]
col_tr=col_tr.groupby(['date_block_num']+[col])[Target].agg('mean').reset_index().rename(columns ={Target:col+'_cnt_month_mean'})
all_data=all_data.merge(col_tr,on=['date_block_num']+[col],how = 'left')
mean_encoded_col.append(col+'_cnt_month_mean')
print(mean_encoded_col)
3.3前月の各販売特徴の抽出
は、現在の月の最初の月、前の2番目の月、前の3番目の月、前の4番目の月、一昨年のその月の販売台数の各特徴を特徴として抽出します.id_col=['shop_id', 'item_id']
index_cols = ['item_category_id', 'item_cat_id_fix', 'date_block_num']
cols_to_rename = mean_encoded_col+[Target]
print(cols_to_rename)
shift_range = [1, 2, 3, 4, 12] # 、 、 、
for month_shift in tqdm(shift_range):
train_shift = all_data[id_col + index_cols + cols_to_rename].copy()
train_shift['date_block_num'] = train_shift['date_block_num'] - month_shift
foo = lambda x: '{}_pre_{}'.format(x, month_shift) if x in cols_to_rename else x
train_shift = train_shift.rename(columns=foo)
all_data = pd.merge(all_data, train_shift, on=id_col+index_cols, how='left').fillna(0)
pre_cols = [col for col in all_data.columns if '_pre_' in col]
all_data = downcast_dtypes(all_data)
3.4すべてのデータに対して標準化処理を行う
すべてのデータを標準化し、後続の「モデル」のトレーニング速度を速める.from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
to_drop_cols = ['date_block_num']
feature_columns = list(set(pre_cols + index_cols + list(date_columns)).difference(to_drop_cols))
all_data[feature_columns] = sc.fit_transform(all_data[feature_columns])
3.5トレーニングセットとテストセットの作成
予測販売量のID番号(shop_id+item_id)を風別に13月から34月まで付与し、train_data予測対象のデータをデータセットallにまとめるsetの中にあります.all_set=test[['shop_id','item_id']].copy()
all_set['date_block_num']=np.int8(12)
for i in range(13,35):
data_tmp=sale_test[['shop_id','item_id']].copy()
data_tmp['date_block_num']=np.int8(i)
all_set=pd.concat([all_set,data_tmp],axis=0)
all_set=all_set.merge(all_data,on=['shop_id','item_id','date_block_num'],how='left').fillna(0)
all_set[id_col] = sc.fit_transform(all_set[id_col])
train_set=all_set[all_set['date_block_num']<34][id_col+['item_category_id','item_cat_id_fix']+pre_cols+date_columns]
train_value=all_set[all_set['date_block_num']<34]['item_cnt_month']
test_set=all_set[all_set['date_block_num']==34][id_col+['item_category_id','item_cat_id_fix']+pre_cols+date_columns]
*PS:**は13月から2013年のデータを使用していません.これは、特徴の中で数ヶ月前の販売データの特徴を使用していますが、2013年は12ヶ月前のデータがなく、2013年のデータを使用するとデータが不完全になるため、筆者は2014年以降のデータしか使用していません.
PS:最新の最適化はブログに同期していません.交流が必要なメールアドレスの交流:ブロガーメールアドレス:[email protected]
all_data=pd.concat([train_data,test_data],axis=0)
Target = 'item_cnt_month'
mean_encoded_col=[]
from tqdm import tqdm
for col in tqdm(['shop_id', 'item_id', 'item_category_id', 'item_cat_id_fix']):
col_tr = all_data[['date_block_num']+[col]+[Target]]
col_tr=col_tr.groupby(['date_block_num']+[col])[Target].agg('mean').reset_index().rename(columns ={Target:col+'_cnt_month_mean'})
all_data=all_data.merge(col_tr,on=['date_block_num']+[col],how = 'left')
mean_encoded_col.append(col+'_cnt_month_mean')
print(mean_encoded_col)
id_col=['shop_id', 'item_id']
index_cols = ['item_category_id', 'item_cat_id_fix', 'date_block_num']
cols_to_rename = mean_encoded_col+[Target]
print(cols_to_rename)
shift_range = [1, 2, 3, 4, 12] # 、 、 、
for month_shift in tqdm(shift_range):
train_shift = all_data[id_col + index_cols + cols_to_rename].copy()
train_shift['date_block_num'] = train_shift['date_block_num'] - month_shift
foo = lambda x: '{}_pre_{}'.format(x, month_shift) if x in cols_to_rename else x
train_shift = train_shift.rename(columns=foo)
all_data = pd.merge(all_data, train_shift, on=id_col+index_cols, how='left').fillna(0)
pre_cols = [col for col in all_data.columns if '_pre_' in col]
all_data = downcast_dtypes(all_data)
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
to_drop_cols = ['date_block_num']
feature_columns = list(set(pre_cols + index_cols + list(date_columns)).difference(to_drop_cols))
all_data[feature_columns] = sc.fit_transform(all_data[feature_columns])
all_set=test[['shop_id','item_id']].copy()
all_set['date_block_num']=np.int8(12)
for i in range(13,35):
data_tmp=sale_test[['shop_id','item_id']].copy()
data_tmp['date_block_num']=np.int8(i)
all_set=pd.concat([all_set,data_tmp],axis=0)
all_set=all_set.merge(all_data,on=['shop_id','item_id','date_block_num'],how='left').fillna(0)
all_set[id_col] = sc.fit_transform(all_set[id_col])
train_set=all_set[all_set['date_block_num']<34][id_col+['item_category_id','item_cat_id_fix']+pre_cols+date_columns]
train_value=all_set[all_set['date_block_num']<34]['item_cnt_month']
test_set=all_set[all_set['date_block_num']==34][id_col+['item_category_id','item_cat_id_fix']+pre_cols+date_columns]