kaggle实战3RossmanStore商店销售额预测XgBoost解决回归问题案例1

news2024/10/5 14:13:00

kaggle实战2信用卡反欺诈逻辑回归模型案例1

数据集下载地址
https://download.csdn.net/download/AnalogElectronic/89844637
https://tianchi.aliyun.com/dataset/89785

加载数据

#预测销售额 回归问题
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import xgboost as xgb
import time

train = pd.read_csv('./train.csv',dtype={'StateHoliday' : np.string_}) #加载数据时为特定字段指定了数据类型
test = pd.read_csv('./test.csv',dtype={'StateHoliday' : np.string_}) #加载数据时为特定字段指定了数据类型
store = pd.read_csv('./store.csv')
display(train.head(),test.head(),store.head())
print(train.shape,test.shape,store.shape)

在这里插入图片描述

缺失值处理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#销售额和时间关系
cond = train['Sales']>0
sales_data = train[cond] #获取有销售额的数据
sales_data.loc[train['Store'] == 1].plot(x = 'Date',y = 'Sales',title = 'Store_1', figsize = (16, 4),color = 'red')

在这里插入图片描述
在这里插入图片描述

#6,7月份的销售趋势与8,9月份类似,而我们要预测的第6周在2015年8,9月份,
#因此我们可以把2015年6,7月份最近6周的1115家店的数据留出作为测试数据,用于模型的优化和验证

display(train.shape,test.shape)
#合并数据
cond = train['Sales'] > 0 
train = train[cond] #过滤了销售额小于0的数据
train = pd.merge(train,store,on='Store', how = 'left')
test = pd.merge(test,store,on='Store', how = 'left')
display(train.shape,test.shape) #测试数据没有销售额所以比训练数据少一列

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

特征工程

%%time
# 特征工程
for data in [train, test]:
    #修改时间
    data['year'] = data['Date'].apply(lambda x : x.split('-')[0]).astype(int)
    data['month'] = data['Date'].apply(lambda x : x.split('-')[1]).astype(int)
    data['day'] = data['Date'].apply(lambda x : x.split('-')[2]).astype(int)
    #PromoInterval,string类型无法进行建模, 转化为对应月份是否促销
    month2str = {1:'Jan', 2:'Feb', 3:'Mar', 4:'Apr', 5:'May', 6:'Jun', 7:'Jul', 8:'Aug', 9:'Sep',
                 10:'Oct', 11:'Nov', 12:'Dec'}
    data['monthstr'] = data['month'].map(month2str)
    #convert是转换函数
    convert = lambda x : 0 if x['PromoInterval']==0 else 1 if x['monthstr'] in x['PromoInterval'] else 0
    data['isPromoMonth'] = data.apply(convert,axis=1)
    #将字符串类型转换为数值类型
    mappings = {'0':0, 'a':1, 'b':2, 'c':3, 'd':4}
    data['StoreType'].replace(mappings, inplace = True)
    data['Assortment'].replace(mappings, inplace = True)
    data['StateHoliday'].replace(mappings, inplace = True)

在这里插入图片描述
在这里插入图片描述

构建训练数据和测试数据

#构建训练数据和测试数据
df_train = train.drop(['Date','PromoInterval','Customers','monthstr','Open'], axis = 1)
df_test = test.drop(['Date','PromoInterval','Id','Open','monthstr'], axis = 1)
display(df_train.shape, df_test.shape)

(844338, 18)
(41088, 17)

# df_train 训练数据, 历史数据,用历史数据建模对df_test进行预测
# df_train 这个数据要进行拆分,一部分用于训练, 一部分用于验证(评估), 不然两眼一抹黑不知道模型的好坏

X_train = df_train[6*7*1115:] #建模的训练数据
X_test = df_train[:6*7*1115] #验证数据(评估) 2015年6-7月份的销售数据

数据属性间的相关性

### 数据属性间的相关性系数, 由于数据量有限珍惜每个特征,就不做数据清洗了(把与销售额<标签列>相关性比较低的特征删除)
plt.figure(figsize=(24,20))
plt.rcParams['font.size'] = 12
sns.heatmap(df_train.corr(), cmap='RdYlGn_r', annot=True, vmin=-1, vmax=1)

在这里插入图片描述

提取模型训练的数据

# 提取模型训练的数据
_ = plt.hist(X_train['Sales'], bins=100) #不太标准的正态分布

在这里插入图片描述

y_train = np.log1p(X_train['Sales']) #对数化 正态化更加规整
y_test = np.log1p(X_test['Sales'])

X_train = X_train.drop('Sales',axis = 1) #X_train,y_train 变量与目标值关系 建模
X_test = X_test.drop('Sales',axis = 1) #X_test,y_test 变量与目标值关系
_ = plt.hist(y_train, bins=100) #比较标准的正态分布

在这里插入图片描述

构建模型

%%time
#模型训练
params = {'objective':'reg:linear',
          'booster':'gbtree',
          'eta':0.03,
          'max_depth':10,
          'subsample':0.9,
          'colsample_bytree': 0.7,
          'silent':1,
          'seed':10}
num_boost_round = 6000
dtrain = xgb.DMatrix(X_train,y_train)
dtest = xgb.DMatrix(X_test,y_test) #保留的验证数据
print('模型训练开始...')
evals = [(dtrain,'train'),(dtest,'validation')]
gbm = xgb.train(params, #模型参数
          dtrain, #训练数据
          num_boost_round,#轮次 决策树的个数
          evals=evals, #验证评估的数据
          early_stopping_rounds=100, #准确度不再提高了,提前结束
          feval=rmspe_xg, #自定义模型评估函数
          verbose_eval=True #打印输出
         )

在这里插入图片描述
在这里插入图片描述

保存模型

# 保存模型
gbm.save_model('./train_model.json')

模型评估

# 模型评估
print('验证数据表现: ')
X_test.sort_index(inplace=True)
y_test.sort_index(inplace=True)

#使用模型进行预测
yhat = gbm.predict(xgb.DMatrix(X_test))

error = rmspe(np.expm1(y_test),np.expm1(yhat))

print('RMSPE:', error)

验证数据表现:
RMSPE: 0.021367080981625878

画图查看模型评估结果

#画图查看模型评估结果
res = pd.DataFrame(data = y_test) #真实数据
res['Prediction'] = yhat #预测数据
res = pd.merge(X_test,res,left_index=True,right_index=True)
res['Ratio'] = res['Prediction']/res['Sales'] #预测和真实销量比率
res['Error'] = abs(1-res['Ratio']) #误差率
res['wight'] = res['Sales']/res['Prediction'] #真实销量占预测值百分比
display(res.head())

在这里插入图片描述

数据可视化

#数据可视化
from matplotlib import font_manager
fm = font_manager.FontManager()
for font in fm.ttflist:
    print(font.n)

在这里插入图片描述

plt.rcParams['font.family'] = 'FangSong'
col_1 = ['Sales','Prediction']
col_2 = ['Ratio']
#随机选择三个店铺进行可视化
shops = np.random.randint(1,1116,size=3)
print('全部商店预测值和真实值的比率是%0.3f' %(res['Ratio'].mean()))

for shop in shops:
    cond = res['Store'] == shop
    df1 = pd.DataFrame(data = res[cond], columns = col_1)
    df2 = pd.DataFrame(data = res[cond], columns = col_2)
    df1.plot(title = '商店编码:%d 预测数据和真实销量对比' %(shop), figsize = (12,4))
    df2.plot(title = '商店编码:%d 预测数据和真实销量比率' %(shop), figsize = (12,4))

全部商店预测值和真实值的比率是1.002
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2189991.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无神论文解读之ControlNet:Adding Conditional Control to Text-to-Image Diffusion Models

一、什么是ControlNet ControlNet是一种能够控制模型生成内容的方法&#xff0c;能够对文生图等模型添加限制信息&#xff08;边缘、深度图、法向量图、姿势点图等&#xff09;&#xff0c;在当今生成比较火的时代很流行。 这种方法使得能够直接提供空间信息控制图片以更细粒…

招联2025校招内推倒计时

【投递方式】 直接扫下方二维码&#xff0c;或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus&#xff0c;使用内推码 igcefb 投递&#xff09; 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…

【课程学习】随机过程之泊松过程

随机过程之泊松过程 泊松分布泊松过程 泊松分布 二项分布是离散性的分布&#xff0c;泊松分布是把二项分布取n趋于无穷得到的连续分布。也就是在一段时间内不停的观察某件事情发生的次数。 如&#xff1a;一个小时内观察一段路上经过行人的数目&#xff0c;如果每个半个小时观…

nginx和gateway的关系和区别

在技术选型时&#xff0c;选择 Nginx 和 Spring Cloud Gateway&#xff08;或简称为 Gateway&#xff09;主要取决于具体应用场景和技术需求。下面是两者的一些关键差异和适用场景。 一、Nginx 概念 Nginx 是一个高性能的 Web 服务器和反向代理服务器&#xff0c;常被用作静…

智能手表(Smart Watch)项目

文章目录 前言一、智能手表&#xff08;Smart Watch&#xff09;简介二、系统组成三、软件框架四、IAP_F411 App4.1 MDK工程结构4.2 设计思路 五、Smart Watch App5.1 MDK工程结构5.2 片上外设5.3 板载驱动BSP5.4 硬件访问机制-HWDataAccess5.4.1 LVGL仿真和MDK工程的互相移植5…

CSRF | CSRF 漏洞介绍

关注这个漏洞的其他相关笔记&#xff1a;CSRF 漏洞 - 学习手册-CSDN博客 0x01&#xff1a;CSRF 漏洞简介 CSRF&#xff08;Cross-Site request forgery&#xff0c;跨站请求伪造&#xff09;也被称为 One Click Attack 或者 Session Riding&#xff0c;通常缩写为 CSRF 或者 X…

【Java】IntelliJ IDEA开发环境安装

一、下载 官方地址&#xff1a;https://www.jetbrains.com/idea/ 点击Download直接下载 二、安装 双击安装包&#xff0c;点击Next 选择安装路径&#xff0c;点击Next 勾选安装内容 安装完成。 三、创建项目 打开IDEA&#xff0c;填写项目名称&#xff0c;选择项目安装路径…

S7-200 SMART的数据类型说明

S7-200 SMART的数据主要分为&#xff1a; 与实际输入/输出信号相关的输入/输出映象区&#xff1a; I&#xff1a;数字量输入&#xff08;DI&#xff09;Q&#xff1a;数字量输出&#xff08;DO&#xff09;AI&#xff1a;模拟量输入AQ&#xff1a;模拟量输出 内部数据存储区…

STM32 Hal库SDIO在FATFS使用下的函数调用关系

STM32 Hal库SDIO在FATFS使用下的函数调用关系 本文并不将FATFS的相关接口操作&#xff0c;而是将HAL在使用FATFS通过SDIO外设管理SD卡时&#xff0c;内部函数的调用逻辑&#xff0c;有助于当我们使用CUBEMX生成FATFS读取SD卡的代码时无法运行时Debug。本文也会说明一些可能出现…

如何编写一个优雅的commit message

在Git中&#xff0c;git commit 命令扮演着至关重要的角色。它的主要作用是将暂存区&#xff08;staging area&#xff09;里的改动内容提交到本地仓库&#xff08;repository&#xff09;中&#xff0c;形成一个新的版本或提交&#xff08;commit&#xff09;。这个过程是 Git…

渗透测试入门学习——使用python脚本自动识别图片验证码,OCR技术初体验

写在前面 由于验证码在服务端生成后存储在服务器的session中&#xff0c;而标用于标识用户身份的sessionid存在于用户cookie中 所以本次识别验证码时需要用requests.session()创建会话对象&#xff0c;模拟真实的浏览器行为&#xff0c;保持与服务器的会话才能获取登录时服务…

wsl2 ubuntu 桥接以太网卡

注意&#xff1a;此方法需要至少 Windows 11 22H2。桥接模式就是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信。 在桥接的作用下&#xff0c;类似于把宿主机虚拟为一个交换机&#xff0c;所有桥接设置的虚拟机连接到这个交换机的一个接口上&#xff0c;宿主机也同样插在这…

通信工程学习:什么是RARP反向地址解析协议

RARP&#xff1a;反向地址解析协议 RARP&#xff08;Reverse Address Resolution Protocol&#xff0c;反向地址解析协议&#xff09;是一种网络协议&#xff0c;其主要作用是在设备只知道物理地址&#xff08;如MAC地址&#xff09;时&#xff0c;允许其从网关服务器的地址解析…

致亲爱的Android studio

你的未来发展趋势&#xff1a; 可不可以把兼容性&#xff0c;什么的搞得更好。起因是我想写期末大作业&#xff0c;然后简单的把功能写的差不多了之后&#xff0c;我就想到处看看有没有一套比较好的类似于组件库的东西&#xff0c;但是没找到&#xff0c;然后就把目标锁定到了G…

Vue入门-Node.js安装

进入Node.js中文网 ​​​​​​​点击进入Node.js中文网 或者手动输入网址&#xff1a; https://www.nodejs.com.cn/download.html 点击下载64位安装包&#xff1a; 下载好之后双击进行安装 可选择个性化安装或默认安装 直接点【Next】按钮&#xff0c;此处可根据个人需求…

深度解析 HTTP

我的主页&#xff1a;2的n次方_ 1. HTTP 的简单介绍 HTTP &#xff1a;超文本传输协议&#xff0c;不仅能传输文本&#xff0c;还能传输图片&#xff0c;音频文件&#xff0c;视频 目前基本上都用的是 1.1 版本 https 可以认为是 http 的升级版&#xff0c;区别就是引入了…

【pytorch】张量求导4

再再接上文&#xff0c;看到作者有一个关于向量乘矩阵的描述。 经过搜索发现&#xff0c;现在的pytorch已经修复了这一问题&#xff0c;提供了mv()和matmul()两种方式实现矩阵和一维向量的乘积&#xff0c;可以参看这篇文章。 经过查阅pytorch的文件&#xff0c;找到了cuda侧…

如何利用 Kubernetes 取得成功

Kubernetes是一个开源编排平台&#xff0c;用于自动部署和管理容器化工作负载和服务&#xff0c;目前越来越受欢迎。 该平台由全球贡献者社区维护&#xff0c;其潜在优势包括提高资源效率、提高可扩展性和高可用性。 在过去几年中&#xff0c;Kubernetes 和相关的云原生技术已…

[Qt] 基于 Qt 的文件选择与图片显示功能实现

文章目录 基础版本&#xff1a;open1()功能解析&#xff1a;特点与限制&#xff1a; 增加路径记忆功能&#xff1a;open2()功能解析&#xff1a;特点与改进&#xff1a; 使用智能指针优化内存管理&#xff1a;open3()功能解析&#xff1a;特点与改进&#xff1a; 图片自适应窗口…

线程互斥函数的例子

代码 #include<stdio.h> #include<pthread.h> #include<sched.h> void *producter_f(void *arg); void *consumer_f(void *arg); int buffer_has_item0; pthread_mutex_t mutex; int running1; int main(void) {pthread_t consumer_t;pthread_t producter_t…