机器学习项目--库存需求预测1--xgboost模型

系列文章

机器学习项目--库存需求预测1_xgboost2.0.3对应sklearn版本-CSDN博客

机器学习项目--库存需求预测2--Arima模型-CSDN博客

机器学习项目--库存需求预测3--LSTM模型-CSDN博客

一、导入库和数据集

代码环境:

python==3.10

scikit-learn==1.0.2

xgboost==2.0.3

import numpy as np
import pandas as pd

import matplotlib.pyplot as plt
import seaborn as sb
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder, StandardScaler
from sklearn import metrics
from sklearn.svm import SVC
from xgboost import XGBRegressor
from sklearn.linear_model import LinearRegression, Lasso, Ridge
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error as mae

读取数据集加载到pandas的数据框内,并打印它的前5行

df = pd.read_csv("D:/data/rossmann-stores-clustering-and-forecast/train.csv")
display(df.head())
display(df.tail())

现在让我们检查一下我们计算的数据大小

df.shape

让我们检查数据集的每列包含哪种类型的数据

df.info()

二、特征工程

得到年月日特征变量

parts = df["Date"].str.split("-", n=3, expand=True)
df["year"] = parts[0].astype("int")
df["month"] = parts[1].astype("int")
df["day"] = parts[2].astype("int")
df.head()

判断是否是工作日

from datetime import datetime
import calendar

def weekend_or_weekday(year, month, day):
    
    d = datetime(year, month, day)
    if d.weekday() > 4:
        return 1
    else:
        return 0

df["weekend"] = df.apply(lambda  x:weekend_or_weekday(x["year"], x["month"], x["day"]), axis=1)
df.head()

判断一下是否是假期

from datetime import date
import holidays

def is_holiday(x):
    india_holidays = holidays.country_holidays("IN")
    
    if india_holidays.get(x):
        return 1
    else:
        return 0

df["holidays"] = df["Date"].apply(is_holiday)
df.head()

添加一些周期特性因子

df['m1'] = np.sin(df['month'] * (2 * np.pi / 12))
df['m2'] = np.cos(df['month'] * (2 * np.pi / 12))
df.head()

删除掉没用的列

df.drop(["Date", "Open", "Promo", "StateHoliday", "SchoolHoliday", "Customers"], axis=1, inplace=True)
df.head()

三、探索数据分析

df["Store"].nunique()

得知数据有1115家店铺的数据

查看主要变量对象的销量分布

features = ["Store", "year", "month", "day", "DayOfWeek", "weekend", "holidays"]

plt.subplots(figsize=(20,10))
for i, col in enumerate(features):
    plt.subplot(2, 3, i+1)
    df.groupby(col).mean()["Sales"].plot.bar()
plt.show()

现在让我们来看看随着月末的临近,库存的变化情况.

plt.figure(figsize=(10,5))
df.groupby('day').mean()['Sales'].plot()
plt.show()

 

 画出30天的表现

plt.figure(figsize=(15, 10))
  
# Calculating Simple Moving Average 
# for a window period of 30 days
window_size = 30
data = df[df['year']==2013]
windows = data['Sales'].rolling(window_size)
sma = windows.mean()
sma = sma[window_size - 1:]
  
data['Sales'].plot()
sma.plot()
plt.legend()
plt.show()

 

 由于sales列中的数据是连续的,让我们检查它的分布,并检查该列中是否有一些离群值。

plt.subplots(figsize=(12, 5))
plt.subplot(1, 2, 1)
sb.distplot(df['Sales'])
  
plt.subplot(1, 2, 2)
sb.boxplot(df['Sales'])
plt.show()

 高度相关的特征

plt.figure(figsize=(10, 10))
sb.heatmap(df.corr() > 0.8,
           annot=True,
           cbar=False)
plt.show()

 

四、模型训练

 我们将分离特征和目标变量,并将它们分为训练数据和测试数据

features = df.drop(["Sales", "year"], axis=1)
target = df["Sales"].values
X_train, X_test, Y_train, Y_test = train_test_split(features, target, test_size=0.05, random_state=22)

X_train.shape, X_test.shape

 对数据进行标准化

# Normalizing the features for stable and fast training.
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

进行建模

先用LinearRegression, XGBRegressor, Lasso, Ridge进行建模并打印效果

models = [LinearRegression(), XGBRegressor(), Lasso(), Ridge()]

for i in range(4):
    models[i].fit(X_train, Y_train)
    
    print(models[i])
    train_preds = models[i].predict(X_train)
    print("Training Error: {}".format(mae(Y_train, train_preds)))
    
    test_preds = models[i].predict(X_test)
    print('Validation Error : ', mae(Y_test, test_preds))

 

 再用lightGBM进行建模并打印效果

params = {
    "objective": "mae",
    "boosting_type": "gbdt",
    "learning_rate": 0.004,
    "n_estimators": 4000,
    "num_leaves": 2**5 - 1,
    "min_data_in_leaf": 2**3 - 1,
    "bagging_fraction": 0.8,
    "feature_fraction": 0.8,
    "seed": 42
}
import lightgbm as lgb
train_data = lgb.Dataset(X_train, label=Y_train)
model = lgb.train(params, train_data, num_boost_round=100)

 

y_pred = model.predict(X_test)
print('Validation Error : ', mae(Y_test, test_preds))

各个模型的效果如下

序号算法mae
1LinearRegression2534.60762743034
2XGBRegressor1610.615012757817
3Lasso2534.648771611585
4Ridge2534.607649225326
5lightGBM2453.607649225326

可以看出XGBoost算法的效果最好,所以针对这个问题我们可以用XGBoost进行建模

五、数据来源和源码获取

训练数据来源于kaggle,读者可以去kagga下载。

或者加小编微信获取:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值