python+keras+pandas进行analyticsvidhya项目大型购物中心的销售预测

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()看下数据描述,还好最后看了下没有明显问题,以后一定要记得,一旦有问题就要从头来了
在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值