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

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

  • 4
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
以下是一个完整的kaggle房价预测比赛的代码示例。注意,这只是一个示例,并不是唯一的解决方案。 首先,我们需要导入必要的库: ```python import numpy as np import pandas as pd from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.ensemble import RandomForestRegressor from xgboost import XGBRegressor from sklearn.metrics import mean_squared_error ``` 接下来,我们可以读取训练和测试数据: ```python train_data = pd.read_csv("train.csv") test_data = pd.read_csv("test.csv") ``` 然后,我们可以进行一些基本的数据探索和清理: ```python # 检查缺失值 print(train_data.isnull().sum()) # 删除缺失值过多的列和无关列 train_data.drop(["Alley", "PoolQC", "MiscFeature", "Id"], axis=1, inplace=True) test_data.drop(["Alley", "PoolQC", "MiscFeature", "Id"], axis=1, inplace=True) # 用中位数替换缺失值 train_data["LotFrontage"].fillna(train_data["LotFrontage"].median(), inplace=True) test_data["LotFrontage"].fillna(test_data["LotFrontage"].median(), inplace=True) train_data["MasVnrArea"].fillna(train_data["MasVnrArea"].median(), inplace=True) test_data["MasVnrArea"].fillna(test_data["MasVnrArea"].median(), inplace=True) train_data["GarageYrBlt"].fillna(train_data["GarageYrBlt"].median(), inplace=True) test_data["GarageYrBlt"].fillna(test_data["GarageYrBlt"].median(), inplace=True) # 对于其他缺失值,用众数替换 for column in train_data.columns: if train_data[column].dtype == "object": train_data[column].fillna(train_data[column].mode()[0], inplace=True) test_data[column].fillna(test_data[column].mode()[0], inplace=True) else: train_data[column].fillna(train_data[column].median(), inplace=True) test_data[column].fillna(test_data[column].median(), inplace=True) # 对于分类变量,进行独热编码 train_data = pd.get_dummies(train_data) test_data = pd.get_dummies(test_data) # 确保训练和测试数据的列数相同 train_labels = train_data["SalePrice"] train_data, test_data = train_data.align(test_data, join="inner", axis=1) ``` 接下来,我们可以对数据进行标准化: ```python scaler = StandardScaler() train_data = scaler.fit_transform(train_data) test_data = scaler.transform(test_data) ``` 然后,我们可以将数据拆分为训练和验证集: ```python X_train, X_val, y_train, y_val = train_test_split(train_data, train_labels, test_size=0.2, random_state=42) ``` 接下来,我们可以训练和评估几个不同的模型: ```python # 线性回归模型 lr = LinearRegression() lr.fit(X_train, y_train) lr_preds = lr.predict(X_val) print("Linear Regression RMSE:", np.sqrt(mean_squared_error(y_val, lr_preds))) # 随机森林模型 rf = RandomForestRegressor(n_estimators=100, random_state=42) rf.fit(X_train, y_train) rf_preds = rf.predict(X_val) print("Random Forest RMSE:", np.sqrt(mean_squared_error(y_val, rf_preds))) # XGBoost模型 xgb = XGBRegressor(n_estimators=100, learning_rate=0.1, random_state=42) xgb.fit(X_train, y_train) xgb_preds = xgb.predict(X_val) print("XGBoost RMSE:", np.sqrt(mean_squared_error(y_val, xgb_preds))) ``` 最后,我们可以用最佳模型生成提交文件: ```python # 训练最佳模型 best_model = XGBRegressor(n_estimators=1000, learning_rate=0.05, random_state=42) best_model.fit(train_data, train_labels) # 生成提交文件 test_preds = best_model.predict(test_data) submission = pd.DataFrame({"Id": test["Id"], "SalePrice": test_preds}) submission.to_csv("submission.csv", index=False) ``` 这就是完整的代码示例。请注意,这只是一个可能的解决方案,你可以根据自己的需求和数据进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值