Kaggle試合-将来の販売を予測する(二)


将来の販売予測(二)データの前処理と特徴抽出

  • 1、初期化環境
  • 2、データ前処理
  • 2.1販売データ
  • 2.1.1販売データ読み出し
  • 2.1.2統計異なるID(shop_id、item_id)の月間販売量
  • 2.1.3 item_への送金categroy_id属性
  • 2.1.4修正後のitem_cat_id_fixプロパティ
  • 2.2テストデータ
  • 2.2.1テストデータ読み出し
  • 2.2.2テストデータをテストセットにまとめる
  • 2.2.3 item_への送金categroy_id属性
  • 2.2.4修正後のitem_cat_id_fixプロパティ
  • 3、特徴工事
  • 3.1トレーニングデータとテストデータを集約する
  • 3.2平均特徴
  • を抽出する
  • 3.3前月の各販売特徴
  • を抽出
  • 3.4すべてのデータを標準化処理
  • 3.5トレーニングセットとテストセット
  • を確立する

    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]