Kaggle比赛——预测未来销售(二)

本文详细介绍了如何通过数据预处理和特征工程来预测未来销售。首先,从CSV文件读取销售数据,统计月销量,修正商品类别属性,并进行测试数据处理。接着,通过特征工程提取均值特征,利用前几个月的销量特征,对数据进行标准化处理,最后建立训练集和测试集。

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 提取前月份的各销量特征

  提取当前月的前第一个月、前第二个月、前第三个月、前第四个月、前年该月的销量各特征作为特征。

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:最新优化没有同步到博客当中,需要交流的可以邮箱交流:博主邮箱:greatpanc@163.com

### 如何通过参数优化提升Kaggle房价预测模型的性能 在Kaggle房价预测比赛中,参数优化是一个至关重要的环节。以下是几种常见的方法及其具体实现方式: #### 1. K折交叉验证用于超参数调优 为了找到最佳的超参数组合,可以通过K折交叉验证评估不同参数设置下的模型表现。准备多个可能的超参数组合,并逐一测试其在交叉验证中的平均得分。最终选择得分最高的那组超参数作为最优解[^1]。 #### 2. 常见回归算法的超参数调整 针对不同的回归算法,可以采用特定的方法进行超参数调整。例如: - **Ridge Regression**: 主要调节正则化强度`alpha`。 - **Lasso Regression**: 同样主要关注`alpha`值的选择。 - **Gradient Boosting Regressor**: 关键在于树的数量(`n_estimators`)、学习率(`learning_rate`)以及最大深度(`max_depth`)等参数。 - **XGBoost 和 LightGBM**: 这些高级集成方法涉及更多复杂参数,比如子样本比例(`subsample`)、列采样比例(`colsample_bytree`)等[^2]。 #### 3. 自动化工具的应用 利用自动化调参库如GridSearchCV或RandomizedSearchCV简化手动过程。这些工具能够自动遍历指定范围内的所有候选参数并返回最佳配置。对于计算资源有限的情况,推荐优先尝试随机搜索(Random Search),因为它通常能更快定位到接近全局最优的结果[^3]。 #### 4. 特征工程与非线性关系处理 除了直接修改模型内部结构外,改善输入特征的质量同样有助于增强预测能力。观察目标变量与其他属性之间的关联模式可以帮助我们设计更有效的转换函数或者创建新的派生字段。如果某些连续型自变量呈现出明显的非线性趋势,则考虑引入多项式项或其他形式变换;而对于类别型因子来说,编码策略(One-Hot Encoding vs Label Encoding)也可能显著影响下游任务的表现[^4]。 ```python from sklearn.model_selection import GridSearchCV param_grid = { 'alpha': [0.1, 1, 10], } ridge_regressor = Ridge() grid_search_ridge = GridSearchCV(estimator=ridge_regressor, param_grid=param_grid, cv=5) grid_search_ridge.fit(X_train, y_train) best_alpha = grid_search_ridge.best_params_['alpha'] print(f'Best alpha value found via GridSearchCV is {best_alpha}') ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值