当前位置: 首页 > news >正文

【机器学习】Kaggle实战Rossmann商店销售预测(项目背景、数据介绍/加载/合并、特征工程、构建模型、模型预测)

文章目录

  • 1、项目背景
  • 2、数据介绍
  • 3、数据加载
    • 3.1 查看数据
    • 3.2 空数据处理
      • 3.2.1 训练数据
      • 3.2.2 测试数据
      • 3.3.3 商店数据处理
      • 3.3.4 销售时间关系
  • 4、合并数据
  • 5、特征工程
  • 6、构建训练数据和测试数据
  • 7、数据属性间相关性系数
  • 8、提取模型训练的数据集
  • 9、构建模型
    • 9.1 定义评价函数
    • 9.2 模型训练
      • 9.2.1 params参数说明
      • 9.2.2 xgb.train()参数说明
    • 9.3 模型评估
    • 9.4 模型优化
      • 9.4.1 整体模型优化
      • 9.4.2 更加细致的优化(考虑不同店铺)
    • 9.5 模型预测

Kaggle

1、项目背景

使用商店、促销和竞争对手数据预测销售Rossmann在欧洲国家经营着3000多家日化用品超市。目前,Rossmann商店经理的任务是提前6周预测他们的日销售额。商店的销售受到许多因素的影响,包括促销、竞争、学校和国家假日、季节性和地域性。由于数以千计的管理者根据自己的特殊情况预测销售,结果的准确性可能会有很大的差异。

因此使用机器学习算法对销量进行预测,Rossmann要求预测德国1115家商店的6周日销售额。可靠的销售预测使商店经理能够制定有效的员工时间表,提高生产力和积极性。

在这里插入图片描述
这就是算法和零售、物流领域的一次深度融合,从而提前备货,减少库存、提升资金流转率,促进公司更加健康发展,为员工更合理的工作、休息提供合理安排,为工作效率提高保驾护航。

2、数据介绍

  • train.csv - 包含销售情况的历史数据文件
  • test.csv - 不包含销售情况的历史数据文件
  • sample_submission.csv - 数据提交样本文件
  • store.csv - 商店更多信息文件

在这里插入图片描述

StateHoliday:通常所有商店都在国家假日关门:a = 公共假日, b = 复活节假日,c = 圣诞节,0
= 无

3、数据加载

3.1 查看数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import xgboost as xgb
import timetrain = pd.read_csv('./data/train.csv',dtype={'StateHoliday':np.string_}) # 加载数据时,为特定字段指定了数据类型
test = pd.read_csv('./data/test.csv',dtype={'StateHoliday':np.string_})
store = pd.read_csv('./data/store.csv') # 每个店铺的详情
display(train.head(),test.head(),store.head())
  • StateHoliday中数据为:a = 公共假日, b = 复活节假日,c = 圣诞节,0 = 无。既有字符串也有数
    字,需要指定类型
  • 数据中存在空数据,一次需要处理空数据

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

在这里插入图片描述

3.2 空数据处理

3.2.1 训练数据

train.isnull().sum() # 表明train这个数据中没有空数据
Store            0
DayOfWeek        0
Date             0
Sales            0
Customers        0
Open             0
Promo            0
StateHoliday     0
SchoolHoliday    0
dtype: int64

train数据无缺失,因此无需处理

3.2.2 测试数据

test.isnull().sum()
Id                0
Store             0
DayOfWeek         0
Date              0
Open             11
Promo             0
StateHoliday      0
SchoolHoliday     0
dtype: int64
cond = test['Open'].isnull()
test[cond]

在这里插入图片描述

cond = train['Store'] == 622
df = train[cond]
df.sort_values(by = 'Date').iloc[-50:] # 根据过往的数据,对测试数据中622号店铺进行填充
# 原来大部分情况,622都是营业!

在这里插入图片描述

test.fillna(1,inplace=True) # 填充空数据
test.isnull().sum()
Id               0
Store            0
DayOfWeek        0
Date             0
Open             0
Promo            0
StateHoliday     0
SchoolHoliday    0
dtype: int64

3.3.3 商店数据处理

store.isnull().sum()
Store                          0
StoreType                      0
Assortment                     0
CompetitionDistance            3
CompetitionOpenSinceMonth    354
CompetitionOpenSinceYear     354
Promo2                         0
Promo2SinceWeek              544
Promo2SinceYear              544
PromoInterval                544
dtype: int64
v1 = 'CompetitionDistance'
v2 = 'CompetitionOpenSinceMonth'
v3 = 'CompetitionOpenSinceYear'
v4 = 'Promo2SinceWeek'
v5 = 'Promo2SinceYear'
v6 = 'PromoInterval'# v2和v3 同时缺失
store[(store[v2].isnull()) & (store[v3].isnull())].shape
# v4、v5、v6同时缺失
store[(store[v4].isnull())&(store[v5].isnull())&(store[v6].isnull())].shape# 下面对缺失数据进行填充
# 店铺竞争数据缺失,而且缺失的都是对应的。
# 原因不明,而且数量也比较多,如果用中值或均值来填充,有失偏颇。暂且填0,解释意义就是刚开业
# 店铺促销信息的缺失是因为没有参加促销活动,所以我们以0填充
store.fillna(0,inplace=True) # 填充成,解释含义:刚开业
store.isnull().sum()
Store                        0
StoreType                    0
Assortment                   0
CompetitionDistance          0
CompetitionOpenSinceMonth    0
CompetitionOpenSinceYear     0
Promo2                       0
Promo2SinceWeek              0
Promo2SinceYear              0
PromoInterval                0
dtype: int64

3.3.4 销售时间关系

分析店铺销量随时间的变化

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')

在这里插入图片描述
从图中可以看出店铺的销售额是有周期性变化的,一年中11,12月份销量相对较高,可能是季节(圣诞节)因素或者促销等原因。此外从2014年6-9月份的销量来看,6,7月份的销售趋势与8,9月份类似,而我们需要预测的6周在2015年8,9月份,因此我们可以把2015年6,7月份最近6周的1115家店的数据留出作为测试数据,用于模型的优化和验证!

test['Date'].unique() # 测试数据,要预测8~9月份的销售情况
array(['2015-09-17', '2015-09-16', '2015-09-15', '2015-09-14','2015-09-13', '2015-09-12', '2015-09-11', '2015-09-10','2015-09-09', '2015-09-08', '2015-09-07', '2015-09-06','2015-09-05', '2015-09-04', '2015-09-03', '2015-09-02','2015-09-01', '2015-08-31', '2015-08-30', '2015-08-29','2015-08-28', '2015-08-27', '2015-08-26', '2015-08-25','2015-08-24', '2015-08-23', '2015-08-22', '2015-08-21','2015-08-20', '2015-08-19', '2015-08-18', '2015-08-17','2015-08-16', '2015-08-15', '2015-08-14', '2015-08-13','2015-08-12', '2015-08-11', '2015-08-10', '2015-08-09','2015-08-08', '2015-08-07', '2015-08-06', '2015-08-05','2015-08-04', '2015-08-03', '2015-08-02', '2015-08-01'],dtype=object)

4、合并数据

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')train.info()
Int64Index: 844338 entries, 0 to 844337
Data columns (total 18 columns):#   Column                     Non-Null Count   Dtype  
---  ------                     --------------   -----  0   Store                      844338 non-null  int64  1   DayOfWeek                  844338 non-null  int64  2   Date                       844338 non-null  object 3   Sales                      844338 non-null  int64  4   Customers                  844338 non-null  int64  5   Open                       844338 non-null  int64  6   Promo                      844338 non-null  int64  7   StateHoliday               844338 non-null  object 8   SchoolHoliday              844338 non-null  int64  9   StoreType                  844338 non-null  object 10  Assortment                 844338 non-null  object 11  CompetitionDistance        844338 non-null  float6412  CompetitionOpenSinceMonth  844338 non-null  float6413  CompetitionOpenSinceYear   844338 non-null  float6414  Promo2                     844338 non-null  int64  15  Promo2SinceWeek            844338 non-null  float6416  Promo2SinceYear            844338 non-null  float6417  PromoInterval              844338 non-null  object 
dtypes: float64(5), int64(8), object(5)
memory usage: 122.4+ MB
test.info()
Int64Index: 41088 entries, 0 to 41087
Data columns (total 17 columns):#   Column                     Non-Null Count  Dtype  
---  ------                     --------------  -----  0   Id                         41088 non-null  int64  1   Store                      41088 non-null  int64  2   DayOfWeek                  41088 non-null  int64  3   Date                       41088 non-null  object 4   Open                       41088 non-null  float645   Promo                      41088 non-null  int64  6   StateHoliday               41088 non-null  object 7   SchoolHoliday              41088 non-null  int64  8   StoreType                  41088 non-null  object 9   Assortment                 41088 non-null  object 10  CompetitionDistance        41088 non-null  float6411  CompetitionOpenSinceMonth  41088 non-null  float6412  CompetitionOpenSinceYear   41088 non-null  float6413  Promo2                     41088 non-null  int64  14  Promo2SinceWeek            41088 non-null  float6415  Promo2SinceYear            41088 non-null  float6416  PromoInterval              41088 non-null  object 
dtypes: float64(6), int64(6), object(5)
memory usage: 5.6+ MB

5、特征工程

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'特征转化为'IsPromoMonth'特征,表示某天某店铺是否处于促销月,1表示是,0表示否# 提示下:这里尽量不要用循环,用这种广播的形式,会快很多。循环可能会让你等的想哭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 = lambda x: 0 if x['PromoInterval'] == 0 else 1 if x['monthstr'] in x['PromoInterval'] else 0data['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)

6、构建训练数据和测试数据

# 删掉训练和测试数据集中不需要的特征
df_train=train.drop(['Date','Customers','Open','PromoInterval','monthstr'],axis=
1)
df_test=test.drop(['Id','Date','Open','PromoInterval','monthstr'],axis=1)
# 如上所述,保留训练集中最近六周的数据用于后续模型的测试
X_train=df_train[6*7*1115:]
X_test=df_train[:6*7*1115]

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)

在这里插入图片描述

8、提取模型训练的数据集

_ = 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_test = X_test.drop(['Sales'],axis=1)

使用np.log1p进行对目标值处理,目标值更加正态化!

_ = plt.hist(y_train,bins = 100) # 目标值,销售额,正态分布,不够正!!!

在这里插入图片描述

9、构建模型

9.1 定义评价函数

均方根百分比误差

在这里插入图片描述

#定义评价函数,可以传入后面模型中替代模型本身的损失函数
def rmspe(y,yhat):return np.sqrt(np.mean((1 - yhat/y)**2))# 起放大作用
def rmspe_xg(yhat,y):y=np.expm1(y.get_label())yhat=np.expm1(yhat)return 'rmspe',rmspe(y,yhat)

9.2 模型训练

%%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 = 6000dtrain = 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, # 在验证集上,当连续n次迭代,分数没有提高后,提前终止训练feval=rmspe_xg,# 模型评估的函数verbose_eval=True)# 打印输出log日志,每次训练详情gbm.save_model('./train_model.json')
[0]	train-rmse:8.01963	train-rmspe:6230.18506	validation-rmse:8.04813	validation-rmspe:6387.25244
[1]	train-rmse:7.77951	train-rmspe:4099.43457	validation-rmse:7.80813	validation-rmspe:4203.82471
[2]	train-rmse:7.54664	train-rmspe:2886.67944	validation-rmse:7.57505	validation-rmspe:2959.31250
[3]	train-rmse:7.32073	train-rmspe:2119.01221	validation-rmse:7.34880	validation-rmspe:2171.24536
[4]	train-rmse:7.10159	train-rmspe:1601.73401	validation-rmse:7.12929	validation-rmspe:1640.44104
[5]	train-rmse:6.88913	train-rmspe:1238.18860	validation-rmse:6.91654	validation-rmspe:1267.88232
[6]	train-rmse:6.68305	train-rmspe:973.55157	validation-rmse:6.71035	validation-rmspe:996.92786
[7]	train-rmse:6.48307	train-rmspe:775.59680	validation-rmse:6.51005	validation-rmspe:793.93579
[8]	train-rmse:6.28915	train-rmspe:625.33978	validation-rmse:6.31603	validation-rmspe:640.10901
[9]	train-rmse:6.10102	train-rmspe:509.09106	validation-rmse:6.12764	validation-rmspe:520.99493
[10]	train-rmse:5.91858	train-rmspe:418.29568	validation-rmse:5.94485	validation-rmspe:427.94669
[11]	train-rmse:5.74163	train-rmspe:346.45187	validation-rmse:5.76751	validation-rmspe:354.34009
[12]	train-rmse:5.57000	train-rmspe:288.96896	validation-rmse:5.59591	validation-rmspe:295.60095
[13]	train-rmse:5.40351	train-rmspe:242.61772	validation-rmse:5.42900	validation-rmspe:248.07785
[14]	train-rmse:5.24204	train-rmspe:204.91913	validation-rmse:5.26750	validation-rmspe:209.54759
[15]	train-rmse:5.08546	train-rmspe:174.12010	validation-rmse:5.11132	validation-rmspe:178.17413
[16]	train-rmse:4.93355	train-rmspe:148.72492	validation-rmse:4.95911	validation-rmspe:152.16476
[17]	train-rmse:4.78615	train-rmspe:127.62540	validation-rmse:4.81140	validation-rmspe:130.54283
[18]	train-rmse:4.64321	train-rmspe:110.06155	validation-rmse:4.66831	validation-rmspe:112.56993
[19]	train-rmse:4.50456	train-rmspe:95.35991	validation-rmse:4.52980	validation-rmspe:97.55514
[20]	train-rmse:4.37010	train-rmspe:82.98562	validation-rmse:4.39519	validation-rmspe:84.89100
[21]	train-rmse:4.23973	train-rmspe:72.53654	validation-rmse:4.26400	validation-rmspe:74.14584
[22]	train-rmse:4.11327	train-rmspe:63.64868	validation-rmse:4.13671	validation-rmspe:65.01503
[23]	train-rmse:3.99059	train-rmspe:56.06008	validation-rmse:4.01333	validation-rmspe:57.23002
[24]	train-rmse:3.87161	train-rmspe:49.55792	validation-rmse:3.89370	validation-rmspe:50.56471
[25]	train-rmse:3.75620	train-rmspe:43.95873	validation-rmse:3.77841	validation-rmspe:44.86082
[26]	train-rmse:3.64422	train-rmspe:39.11786	validation-rmse:3.66619	validation-rmspe:39.91478
[27]	train-rmse:3.53569	train-rmspe:34.93198	validation-rmse:3.55775	validation-rmspe:35.65234
...
[405]	train-rmse:0.13638	train-rmspe:0.00922	validation-rmse:0.15283	validation-rmspe:0.00465
[406]	train-rmse:0.13620	train-rmspe:0.00919	validation-rmse:0.15265	validation-rmspe:0.00457
[407]	train-rmse:0.13600	train-rmspe:0.00917	validation-rmse:0.15248	validation-rmspe:0.00460
[408]	train-rmse:0.13579	train-rmspe:0.00914	validation-rmse:0.15231	validation-rmspe:0.00462
Wall time: 2min 38s

9.2.1 params参数说明

  • eta[默认是0.3] 和GBM中的learning rate参数类似。通过减少每一步的权重,可以提高模型的鲁棒性。典型值0.01-0.2
  • max_depth [默认是3] 树的最大深度,这个值也是用来避免过拟合的3-10
  • subsample[默认是1] 这个参数控制对于每棵树,随机采样的比例。减小这个参数的值算法会更加
    保守,避免过拟合。但是这个值设置的过小,它可能会导致欠拟合。典型值:0.5-1
  • colsample_bytree[默认是1] 用来控制每颗树随机采样的列数的占比每一列是一个特征0.5-1(要依据特征个数来判断)
  • objective[默认是reg:linear]这个参数定义需要被最小化的损失函数。最常用的值有:
  • binary:logistic二分类的逻辑回归,返回预测的概率非类别。multi:softmax使用softmax的多分类
    器,返回预测的类别。在这种情况下,你还要多设置一个参数:num_class类别数目。

在这里插入图片描述

  • seed[默认是0]随机数的种子,设置它可以复现随机数据的结果,也可以用于调整参数。
  • booster[默认是gbtree ]选择每次迭代的模型,有两种选择:gbtree基于树的模型、gbliner线性模
  • silent[默认值=0]取0时表示打印出运行时信息,取1时表示以缄默方式运行,不打印运行时信息。

9.2.2 xgb.train()参数说明

  • params:这是一个字典,里面包含着训练中的参数关键字和对应的值
  • dtrain:训练的数据
  • num_boost_round:这是指提升迭代的次数,也就是生成多少基模型
  • evals:这是一个列表,用于对训练过程中进行评估列表中的元素。
  • feval: 自定义评估函数
  • early_stopping_rounds:早期停止次数 ,假设为100,验证集的误差迭代到一定程度在100次内不能再继续降低,就停止迭代。要求evals 里至少有 一个元素。
  • verbose_eval (可以输入布尔型或数值型):也要求evals 里至少有 一个元素。如果为True ,则对
  • evals中元素的评估结果会输出在结果中;如果输入数字,假设为5,则每隔5个迭代输出一次
  • learning_rates 每一次提升的学习率的列表
  • xgb_model 在训练之前用于加载的xgb model

9.3 模型评估

print('验证数据表现:') # X_test就是验证数据
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.0280719416230981

画图查看,模型评估结果

# 画图查看,模型评估结果
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['weight'] = res['Sales']/res['Prediction'] # 真实销量占预测值的百分比from matplotlib import font_manager
fm = font_manager.FontManager()plt.rcParams['font.family'] = 'STKaiti'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'] == shopdf1 = 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

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从分析结果来看,初始模型已经可以比较好的预测保留数据集的销售趋势,但相对真实值,模型的预测值整体要偏高一些。从对偏差数据分析来看,偏差最大的3个数据也是明显偏高。因此,我们可以以保留数据集为标准对模型进行偏差校正。

# 偏差数据
res.sort_values(by = ['Error'],ascending=False)
res[:10]

9.4 模型优化

9.4.1 整体模型优化

weights = [(0.99 + (i/1000)) for i in range(20)]errors = []for w in weights:# 偏差校正error = rmspe(np.expm1(y_test),np.expm1(yhat * w)) # 这就是对预测值,进行权重乘法,微小改变errors.append(error)errors = pd.Series(errors,index=weights)plt.figure(figsize=(9,6))
errors.plot()plt.xlabel('权重系数',fontsize = 18)
plt.ylabel('均方根百分比误差',fontsize = 18)index = errors.argmin()
print('最佳的偏差校正权重:',index,errors.iloc[7],weights[index])
最佳的偏差校正权重: 7 0.0013254117199704312 0.997

在这里插入图片描述

因为每个店铺都有自己的特点,而我们设计的模型对不同的店铺偏差并不完全相同,所以我们需要根据不同的店铺进行一个细致的校正。

9.4.2 更加细致的优化(考虑不同店铺)

shops = np.arange(1,1116)
weights1 = [] # 验证数据每个店铺的权重系数 46830
weights2 = [] # 测试数据每个店铺的权重系数 41088,提交到Kaggle官网for shop in shops:cond = res['Store'] == shopdf1 = pd.DataFrame(res[cond], columns=col_1) # 验证数据的预测数据和真实销量cond2 = df_test['Store'] == shopdf2 = pd.DataFrame(df_test[cond2])weights = [(0.98 + (i/1000)) for i in range(40)]errors = []for w in weights:error = rmspe(np.expm1(df1['Sales']),np.expm1(df1['Prediction'] * w))errors.append(error)errors = pd.Series(errors,index = weights)index = errors.argmin() # 最小的索引best_weight = np.array(weights[index]) # 只是一个数值weights1.extend(best_weight.repeat(len(df1)).tolist())weights2.extend(best_weight.repeat(len(df2)).tolist())# for循环结束,每个店铺的权重,是多少,计算得到了
# 验证数据调整校正系数的排序
X_test = X_test.sort_values(by = 'Store') # 1,2,3,……1115
X_test['weights1'] = weights1 # 权重和店铺,进行一一对应!
X_test = X_test.sort_index() # 根据索引大小进行排序
weights1 = X_test['weights1']
X_test = X_test.drop('weights1',axis = 1)# 测试数据调整校正系数
df_test = df_test.sort_values(by = 'Store') # 1,2,3,……1115
df_test['weights2'] = weights2 # 权重和店铺,进行一一对应!
df_test = df_test.sort_index() # 根据索引大小进行排序
weights2 = df_test['weights2']
df_test = df_test.drop('weights2',axis = 1)yhat_new = yhat * weights1 # 预测销售额,校正
rmspe(np.expm1(y_test),np.expm1(yhat_new))
0.0021121179356354716

9.5 模型预测

使用算法,对测试数据,进行预测,不经任何调整校正

test = xgb.DMatrix(df_test)y_pred = gbm.predict(test) # 算法预测的结果,结果提交Kaggle
# y_pred 是对数运算的结果
# 真实数据,数据转换,幂运算
# 保存数据,不经任何调整校正
result = pd.DataFrame({'ID':np.arange(1,41089),'Sales':np.expm1(y_pred)})result.to_csv('./result_1.csv',index=False)

对整体模型进行优化

# 对整体模型进行优化
w = 0.997
result = pd.DataFrame({'ID':np.arange(1,41089),'Sales':np.expm1(y_pred * w)})result.to_csv('./result_2.csv',index=False)

每个店铺的,权重校正,都不同,细致!!!

# 每个店铺的,权重校正,都不同,细致!!!
result = pd.DataFrame({'ID':np.arange(1,41089),'Sales':np.expm1(y_pred * weights2)})result.to_csv('./result_3.csv',index=False)

上面构建的模型经过优化后,已经有着不错的表现。如果想继续提高预测的精度,可以在模型融合上试试。

相关文章:

【机器学习】Kaggle实战Rossmann商店销售预测(项目背景、数据介绍/加载/合并、特征工程、构建模型、模型预测)

文章目录 1、项目背景2、数据介绍3、数据加载3.1 查看数据3.2 空数据处理3.2.1 训练数据3.2.2 测试数据3.3.3 商店数据处理3.3.4 销售时间关系 4、合并数据5、特征工程6、构建训练数据和测试数据7、数据属性间相关性系数8、提取模型训练的数据集9、构建模型9.1 定义评价函数9.2…...

简化计算步骤以减少误差

简化计算步骤以减少误差 同样一个计算问题,若能减少运算次数,既可以节省计算机的计算时间,还可以减小舍人误差。 例 计算 x 255 x^{255} x255的值. 如果逐个相乘要用 254 次乘法,但若写成 x 255 x ⋅ x 2 ⋅ x 4 ⋅ x 8 ⋅…...

利用AI大模型和Mermaid生成流程图

核心点1:利用大模型生成流程图的语句(Code) 确定业务流程: 用户需要明确要绘制的业务流程,包括主要步骤、决策点以及各步骤之间的关系。将确定的业务流程以文字形式描述出来。 生成Mermaid代码: 将描述好的…...

SqlServer 杂项知识整理

目录 一. decimal字段类型二. 查询时加锁 一. decimal字段类型 ⏹decimal(8,3): 整数5位,小数3位。一共8位。 如果输入 20,会自动格式化为 20.000如果输入 20.1,会自动格式化为 20.100 -- 给数据库新增一个字段,类型要求是decimal类型 ALT…...

【Uniapp-Vue3】@import导入css样式及scss变量用法与static目录

一、import导入css样式 在项目文件中创建一个common文件夹,下面创建一个css文件夹,里面放上style.css文件,编写的是公共样式,我们现在要在App.vue中引入该样式。 在App.vue中引入该样式,这样就会使样式全局生效&#…...

Maven 中 scope=provided 和 optional=true 的区别

先说效果&#xff0c;maven依赖声明中加了<scope>provided</scope>&#xff0c;或者加了<optional>true</optional>&#xff0c;从效果上看是一样的&#xff0c;都会中断依赖传递&#xff0c;观察下图&#xff1a; 图中&#xff0c;项目B分别依赖了C和…...

自动化测试与智能化测试的区别和关系

自动化测试与智能化测试的区别和关系 在现代软件开发过程中&#xff0c;测试环节是保证软件质量的重要组成部分。随着技术的不断进步&#xff0c;传统的手工测试方法逐渐无法满足高效、精确的需求&#xff0c;自动化测试&#xff08;Automated Testing&#xff09;应运而生。近…...

django在线考试系统

Django在线考试系统是一种基于Django框架开发的在线考试平台&#xff0c;它提供了完整的在线考试解决方案。 一、系统概述 Django在线考试系统旨在为用户提供便捷、高效的在线考试环境&#xff0c;满足教育机构、企业、个人等不同场景下的考试需求。通过该系统&#xff0c;用…...

centos9设置静态ip

CentOS 9 默认使用 NetworkManager 管理网络&#xff0c;而nmcli是 NetworkManager 命令行接口的缩写&#xff0c;是一个用来进行网络配置、管理网络连接的命令工具&#xff0c;可以简化网络设置&#xff0c;尤其是在无头&#xff08;没有图形界面&#xff09;环境下。 1、 cd…...

使用postMessage解决iframe与父页面传参

接收传递的消息时&#xff0c;可以将 window.addEventListener(message, function(e) { console.log(e.data) }) 写法&#xff0c;更换为 window.onmessage async function(e) {} 可以避免消息发送后&#xff0c;多次接收该参数 父页面js IframeEvent(){const send …...

浅谈云计算05 | 云存储等级及其接口工作原理

一、云存储设备 在当今数字化飞速发展的时代&#xff0c;数据已然成为个人、企业乃至整个社会的核心资产。从日常生活中的珍贵照片、视频&#xff0c;到企业运营里的关键业务文档、客户资料&#xff0c;数据量呈爆炸式增长。面对海量的数据&#xff0c;如何安全、高效且便捷地存…...

DolphinScheduler自身容错导致的服务器持续崩溃重大问题的排查与解决

01 问题复现 在DolphinScheduler中有如下一个Shell任务&#xff1a; current_timestamp() { date "%Y-%m-%d %H:%M:%S" }TIMESTAMP$(current_timestamp) echo $TIMESTAMP sleep 60 在DolphinScheduler将工作流执行策略设置为并行&#xff1a; 定时周期调度设置…...

Linux 容器漏洞

定义&#xff1a;Linux 容器漏洞是指在容器技术&#xff08;如 Docker、LXC 等&#xff09;运行环境中存在的安全弱点。这些漏洞可能存在于容器镜像本身、容器运行时&#xff08;如 runc&#xff09;、容器编排工具&#xff08;如 Kubernetes&#xff09;或者容器与主机之间的交…...

前端依赖安装指南

前端依赖安装指南 一、NVM管理工具安装 1.在 Windows 上安装 下载 NVM for Windows 的安装程序&#xff1a;(最新版本可以在 nvm-windows Releases 页面 找到)运行下载的安装程序并按步骤操作。 2.配置 NVM exe安装自动配置环境变量 3. 验证 NVM 安装 验证 NVM 是否成功…...

滑动窗口限流算法:基于Redis有序集合的实现与优化

滑动窗口限流算法是一种基于时间窗口的流量控制策略&#xff0c;它将时间划分为固定大小的窗口&#xff0c;并在每个窗口内记录请求次数。通过动态滑动窗口&#xff0c;算法能够灵活调整限流速率&#xff0c;以应对流量的波动。 算法核心步骤 统计窗口内的请求数量&#xff1…...

JavaRestClient 客户端初始化+索引库操作

1. 介绍 ES官方提供了各种不同语言的客户端&#xff0c;用来操作ES。这些客户端的本质就是组装DSL语句&#xff0c;通过http请求发送给ES。 Elasticsearch目前最新版本是8.0&#xff0c;其java客户端有很大变化。不过大多数企业使用的还是8以下版本 2. 客户端初始化 在elastic…...

理解Spark中运行程序时数据被分区的过程

在Spark中&#xff0c;数据分区是指将数据集分割成多个小的子集&#xff0c;即分区&#xff0c;以便在集群的多个节点上并行处理&#xff0c;从而提高处理效率。以下通过一个具体例子来理解&#xff1a; 例子背景 假设要分析一个包含100万条销售记录的数据集&#xff0c;每条…...

【微服务】面试 7、幂等性

幂等性概念及场景 概念&#xff1a;多次调用方法或接口不改变业务状态&#xff0c;重复调用结果与单次调用一致。例如在京东下单&#xff0c;多次点击提交订单只能成功一次。场景&#xff1a;包括用户重复点击、网络波动导致多次请求、mq 消息重复消费、代码中设置失败或超时重…...

10步打造完美ASP.NET、Web API和控制台应用程序文件夹结构

一、前言 在大型项目中&#xff0c;合理的文件夹结构是项目成功的关键之一。一个好的文件夹结构就像是一座井然有序的图书馆&#xff0c;每一本书&#xff08;代码文件&#xff09;都有其固定的位置&#xff0c;让人能迅速找到所需。它可以让团队成员更容易理解和维护代码&…...

30_Redis哨兵模式

在Redis主从复制模式中,因为系统不具备自动恢复的功能,所以当主服务器(master)宕机后,需要手动把一台从服务器(slave)切换为主服务器。在这个过程中,不仅需要人为干预,而且还会造成一段时间内服务器处于不可用状态,同时数据安全性也得不到保障,因此主从模式的可用性…...

双模充电桩发展前景:解锁新能源汽车未来的金钥匙,市场潜力无限

随着全球能源转型的浪潮席卷而来&#xff0c;新能源汽车行业正以前所未有的速度蓬勃发展&#xff0c;而作为其坚实后盾的充电基础设施&#xff0c;特别是双模充电桩&#xff0c;正逐渐成为推动这一变革的关键力量。本文将从多维度深入剖析双模充电桩的市场现状、显著优势、驱动…...

Trimble自动化激光监测支持历史遗产实现可持续发展【沪敖3D】

故事桥&#xff08;Story Bridge&#xff09;位于澳大利亚布里斯班&#xff0c;建造于1940年&#xff0c;全长777米&#xff0c;横跨布里斯班河&#xff0c;可载汽车、自行车和行人往返于布里斯班的北部和南部郊区。故事桥是澳大利亚最长的悬臂桥&#xff0c;是全世界两座手工建…...

深入解析 C++ 类型转换

简介 C 类型转换是开发者必须掌握的重要技能之一, 无论是处理隐式转换还是显式转换, 理解其背后的机制与用法至关重要. 本篇博客旨在从基础到高级全面解析 C 的类型转换, 包括实际开发中的应用场景和性能分析. 自动转换 隐式类型转换 编译器可以在无需明确指示的情况下, 将一…...

2025-1-9 QT 使用 QXlsx库 读取 .xlsx 文件 —— 导入 QXlsx库以及读取 .xlsx 的源码 实践出真知,你我共勉

文章目录 1. 导入QXlsx库2. 使用 QXlsx库 读取 .xlsx 文件小结 网上有很多教程&#xff0c;但太费劲了&#xff0c;这里有个非常简便的好方法&#xff0c;分享给大家。 1. 导入QXlsx库 转载链接 &#xff1a;https://github.com/QtExcel/QXlsx/blob/master/HowToSetProject.md…...

基于ILI9341液晶屏+STM32U5单片的显示试验

试验要求&#xff1a; 1、通过串口&#xff0c;下发两个命令 STR和PIC&#xff1b; 2、STR模式&#xff1a; &#xff08;1&#xff09;串口输入什么&#xff0c;屏幕上显示什么 &#xff08;2&#xff09;如果屏幕满&#xff0c;自动下滚 &#xff08;3&#xff09;输入回车&a…...

Vue.js组件开发-如何使用moment.js

在Vue.js组件开发中&#xff0c;需要处理日期和时间&#xff0c;moment.js 是一个非常有用的库。moment.js 提供了丰富的API来解析、验证、操作和显示日期和时间。 步骤&#xff1a; 1. 安装moment.js 首先&#xff0c;需要通过npm或yarn安装moment.js。在项目根目录下运行以…...

自然语言转 SQL:通过 One API 将 llama3 模型部署在 Bytebase SQL 编辑器

使用 Open AI 兼容的 API&#xff0c;可以在 Bytebase SQL 编辑器中使用自然语言查询数据库。 出于数据安全的考虑&#xff0c;私有部署大语言模型是一个较好的选择 – 本文选择功能强大的开源模型 llama3。 由于 OpenAI 默认阻止出站流量&#xff0c;为了简化网络配置&#…...

全面掌握APT、Vim和GCC:Ubuntu软件管理与开发指南

文章目录 Ubuntu 软件包管理器Ubuntu 软件包管理的基本概念常用的软件包管理器APTAPT常用命令 vimVim 的基本概念Vim 的工作模式Vim 的基本操作 gcc/gUbuntu 安装 gcc / g编译知识使用方法动静态函数库 Ubuntu 软件包管理器 在 **Ubuntu** 系统中&#xff0c;软件包管理器用于…...

项目实战--网页五子棋(用户模块)(1)

接下来我将使用Java语言&#xff0c;和Spring框架&#xff0c;实现一个简单的网页五子棋。 主要功能包括用户登录注册&#xff0c;人机对战&#xff0c;在线匹配对局&#xff0c;房间邀请对局&#xff0c;积分排行版等。 这篇文件讲解用户模块的后端代码 1. 用户表与实体类 …...

【Ubuntu与Linux操作系统:七、系统高级管理】

第7章 系统高级管理 7.1 Linux进程管理 进程是Linux系统中的基本运行单位&#xff0c;代表一个正在执行的程序。Linux通过进程管理实现多任务并发处理&#xff0c;支持用户高效利用系统资源。 1. 进程的基本概念&#xff1a; 进程状态&#xff1a;进程在运行过程中可能处于运…...

多线程面试相关

线程基础知识 线程与进程的区别 并行和并发的区别 创建线程的方式 Runnable和Callable有什么区别 run()方法和start()方法的区别 小结 线程包含哪些状态&#xff0c;各个状态之间如何变化 线程按顺序执行 notify()和notifyAll()的区别 Java中的wait方法和sleep方法的不同 如何…...

WMS仓库管理系统,Vue前端开发,Java后端技术源码(源码学习)

一、项目背景和建设目标 随着企业业务的不断扩展&#xff0c;仓库管理成为影响生产效率、成本控制及客户满意度的重要环节。为了提升仓库作业的透明度、准确性和效率&#xff0c;本方案旨在构建一套全面、高效、易用的仓库管理系统&#xff08;WMS&#xff09;。该系统将涵盖库…...

【前端】【CSS3】基础入门知识

目录 如何学习CSS 1.1什么是CSS​编辑 1.2发展史 1.三种导入方式 1.1、行内样式 1.2、外部样式 1.3、嵌入方式 2.选择器 2.1、基本选择器 &#xff08;1&#xff09;元素选择器 &#xff08;2&#xff09;类选择器 &#xff08;3&#xff09;id选择器&#xff1a;必…...

51单片机——定时器中断(重点)

STC89C5X含有3个定时器&#xff1a;定时器0、定时器1、定时器2 注意&#xff1a;51系列单片机一定有基本的2个定时器&#xff08;定时器0和定时器1&#xff09;&#xff0c;但不全有3个中断&#xff0c;需要查看芯片手册&#xff0c;通常我们使用的是基本的2个定时器&#xff…...

Android原生开发同一局域网内利用socket通信进行数据传输

1、数据接收端代码如下&#xff0c;注意&#xff1a;socket 接收信息需要异步运行&#xff1a; // port 端口号自定义一个值&#xff0c;比如 8888&#xff0c;但需和发送端使用的端口号保持一致 ServerSocket serverSocket new ServerSocket(port); while (true) {//这里为了…...

基于微信小程序的食堂线上预约点餐系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

算法初学者(图的存储)链式前向星

知识储备&#xff1a;概念&#xff0c;存储&#xff0c;遍历&#xff0c;最短路&#xff0c;最小生成树&#xff0c;拓扑排序-关键路径 图的存储&#xff1a;邻接矩阵&#xff0c;邻接表&#xff0c;十字链表&#xff0c;多重邻接表&#xff0c;边集数组 其中&#xff1a;邻接…...

Github 2025-01-11 Rust开源项目日报 Top10

根据Github Trendings的统计,今日(2025-01-11统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10C项目1Swift项目1Yazi - 快速终端文件管理器 创建周期:210 天开发语言:Rust协议类型:MIT LicenseStar数量:5668 个Fork数量:122…...

Leetcode 3419. Minimize the Maximum Edge Weight of Graph

Leetcode 3419. Minimize the Maximum Edge Weight of Graph 1. 解题思路2. 代码实现3. 算法优化 题目链接&#xff1a;3419. Minimize the Maximum Edge Weight of Graph 1. 解题思路 这一题我的思路就是二分法&#xff0c;找到能够完成遍历的临界值即可。 但是自己实际在…...

深入理解数据库索引及其优化策略

数据库作为现代应用系统的核心组件之一&#xff0c;如何高效地存储和检索数据成为开发者关注的焦点。 在处理大规模数据时&#xff0c;数据库索引 是提升查询性能的关键技术之一。本文将深入探讨数据库索引的工作原理、常见类型、创建索引的策略以及如何优化索引&#xff0c;以…...

安科瑞 Acrel-1000DP 分布式光伏监控系统在工业厂房分布式光伏发电项目中的应用

吕梦怡 18706162527 摘 要&#xff1a;常规能源以煤、石油、天然气为主&#xff0c;不仅资源有限&#xff0c;而且会造成严重的大气污染&#xff0c;开发清洁的可再生能源已经成为当今发展的重要任务&#xff0c;“节能优先&#xff0c;效率为本”的分布式发电能源符合社会发…...

css面试常考布局(圣杯布局、双飞翼布局、三栏布局、两栏布局、三角形)

两栏布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> &…...

【物流管理系统 - IDEAJavaSwingMySQL】基于Java实现的物流管理系统导入IDEA教程

有问题请留言或私信 步骤 下载项目源码&#xff1a;项目源码 解压项目源码到本地 打开IDEA 左上角&#xff1a;文件 → 新建 → 来自现有源代码的项目 找到解压在本地的项目源代码文件&#xff0c;点击确定&#xff0c;根据图示步骤继续导入项目 查看项目目录&#xff…...

IntelliJ IDEA 主题插件

在 IntelliJ IDEA 中&#xff0c;有很多优秀的主题插件可以帮助你改变 IDE 的外观和配色方案&#xff0c;使得开发过程更加愉悦和高效。以下是一些非常受欢迎和实用的 主题插件&#xff0c;以及如何安装和使用它们的步骤&#xff1a; &#x1f31f; 流行主题插件推荐 1️⃣ Ma…...

ASP.NET Core 中,Cookie 认证在集群环境下的应用

在 ASP.NET Core 中&#xff0c;Cookie 认证在集群环境下的应用通常会遇到一些挑战。主要的问题是 Cookie 存储在客户端的浏览器中&#xff0c;而认证信息&#xff08;比如 Session 或身份令牌&#xff09;通常是保存在 Cookie 中&#xff0c;多个应用实例需要共享这些 Cookie …...

k8s笔记29--使用kyverno提高运维效率

k8s笔记29--使用kyverno提高运维效率 介绍原理安装应用场景自动修正测试环境pod资源强制 Pod 标签限制容器镜像来源禁止特权容器其它潜在场景 注意事项说明 介绍 Kyverno是一个云原生的策略引擎&#xff0c;它最初是为k8s构建的&#xff0c;现在也可以在k8s集群之外用作统一的…...

快速上手Git——Windows系统下Git的安装与简单使用流程

一、Git的下载和安装 Git官网链接&#xff1a;https://git-scm.com/ 进入官网后选择Downloads 选择与系统相符合的版本下载&#xff0c;这里我使用的是windows系统 然后点击下载 根据流程安装完成后&#xff0c;使用以下命令查看git版本 git -v运行结果&#xff1a; 二、…...

apollo内置eureka dashboard授权登录

要确保访问Eureka Server时要求输入账户和密码&#xff0c;需要确保以下几点&#xff1a; 确保 eurekaSecurityEnabled 配置为 true&#xff1a;这个配置项控制是否启用Eureka的安全认证。如果它被设置为 false&#xff0c;即使配置了用户名和密码&#xff0c;也不会启用安全认…...

linux--防火墙 iptables 双网卡 NAT 桥接

linux--防火墙 iptables 双网卡 NAT 桥接 1 介绍1.1 概述1.2 iptables 的结构 2 四表五链2.1 iptables 的四表filter 表&#xff1a;过滤规则表&#xff0c;默认表。nat 表&#xff1a;地址转换表。mangle 表&#xff1a;修改数据包内容。raw 表&#xff1a;原始数据包表。 2.2…...

C#反射的应用案例与讲解

C# 反射 文章目录 C# 反射前言案例展示将对象转为字典测试用例执行效果代码讲解 HasValue扩展测试用例执行效果代码讲解 反射的底层逻辑反射的原理反射的基本概念反射常用的API和方法GetType类Activator类PropertyInfo类EventInfo 类MemberInfo类MethodInfo类 反射的优缺点优点…...