analyticsvidhya项目大型购物中心的销售预测
BigMart的数据科学家收集了2013年不同城市10家商店中1559种产品的销售数据。此外,已经定义了每个产品和商店的某些属性。目的是建立一个预测模型并预测每个产品在特定商店的销售。
BigMart将使用此模型尝试了解在增加销售中起关键作用的产品和销售点的属性。
请注意,数据可能缺少值,因为某些商店可能由于技术故障而无法报告所有数据。因此,将需要对它们进行相应的处理。
数据集:https://datahack.analyticsvidhya.com/contest/practice-problem-big-mart-sales-iii/?spm=a2c4e.11153940.blogcont603256.9.333b1d6fYOsiOK
获取并分析原始数据
数据集:https://datahack.analyticsvidhya.com/contest/practice-problem-big-mart-sales-iii/?spm=a2c4e.11153940.blogcont603256.9.333b1d6fYOsiOK
注册并下载训练集,验证集,结果格式文件
观察原始数据,先全局查重确认没有重复的行,再修正一些明显错误,如标记不统一需统一标记
注意到展示区域面积为0时仍有销量,具体是什么商品呢,嘿嘿嘿,反正这里应该是正常的
这里只要店铺id就ok了,因为店铺id确定,店铺相关信息就确定了,且给的测试集里有店铺id,若没有当然就不能删了
因为像店铺id和产品类别等定类变量需转换为one-hot类型,所以把预测集和训练集先合并统一转one-hot,预测集的销量暂时填0
预处理数据
# 载入数据,切成变量X和应变量Y和预测变量pre_X
import pandas as pd
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
def data(path):
df = pd.read_csv(path)
#去除店铺相关列
df = df.drop(['Outlet_Establishment_Year',
'Outlet_Size',
'Outlet_Location_Type',
'Outlet_Type',
], axis=1)
#Item_Fat_Content列的值统一并转换为01
df['Item_Fat_Content'] = df['Item_Fat_Content'].map({'Low Fat':0,'LF':0, 'Regular':1, 'reg':1})
#定类定序列进行OneHot-Coding
x_OneHot_df = pd.get_dummies(data=df,columns=['Item_Identifier', 'Item_Type', 'Outlet_Identifier'])
#将DataFrame转换成np的array
ndarray = x_OneHot_df.values
#将数据分为变量和应变量
X = np.delete(ndarray, 4, axis=1)
Y = ndarray[:8523,4]
#标准化
mean = X.mean(axis=0)
X -= mean # 减去均值
std = X.std(axis=0) # 特征标准差
X /= std
X =np.delete(X, 0, axis=1)
X =np.delete(X, 0, axis=1)
Y /= 20000 # 保证销量转换为01之间的值 便于训练
pre_X = X[8523:] #8524行后面的为待预测数据
X = X[:8523]
return X, Y, pre_X
X, Y, pre_X = data(r'C:\Users\Administrator\Desktop\train_v9rqX0R.csv')
print(X.shape, Y.shape, pre_X.shape) # (8523, 1587) (8523,) (5680, 1587)
创建模型
model = Sequential([
Dense(64, activation='relu', input_dim=1587),
Dense(64, activation='relu'),
Dense(1)])
model.compile(
loss='mse',
optimizer=tf.keras.optimizers.RMSprop(0.001),
metrics=['mae'])
回归模型使用loss=‘mse’,步长调节为0.001,回归指标用metrics=[‘mae’]
训练模型
history = model.fit(x=X, y=Y, validation_split=0.1, epochs=30, batch_size=64)
查看训练过程
mae = history.history['mae']
val_mae = history.history['val_mae']
loss=history.history['loss']
val_loss=history.history['val_loss']
epochs_range = range(30)
plt.figure(figsize=(8, 8))
plt.subplot(1, 2, 1)
plt.plot(epochs_range, mae, label='Training mae')
plt.plot(epochs_range, val_acc, label='Validation mae')
plt.legend(loc='lower right')
plt.title('Training and Validation mae')
plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss, label='Training Loss')
plt.plot(epochs_range, val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()
拟合情况无异常
预测并保存
pre_Y = model.predict(pre_X)*20000 #预测销量 并转换回真实水平
df1 = pd.read_csv(r'C:\Users\Administrator\Desktop\train_v9rqX0R.csv')
df1.iloc[8523:,11] = list(pre_Y)
df1.to_excel('yuce.xlsx')
ps:一开始忘了df[:8523].describe()看下数据描述,还好最后看了下没有明显问题,以后一定要记得,一旦有问题就要从头来了