系列文章
机器学习项目--库存需求预测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 |
| 1 | LinearRegression | 2534.60762743034 |
| 2 | XGBRegressor | 1610.615012757817 |
| 3 | Lasso | 2534.648771611585 |
| 4 | Ridge | 2534.607649225326 |
| 5 | lightGBM | 2453.607649225326 |
可以看出XGBoost算法的效果最好,所以针对这个问题我们可以用XGBoost进行建模
五、数据来源和源码获取
训练数据来源于kaggle,读者可以去kagga下载。
或者加小编微信获取:


2499

被折叠的 条评论
为什么被折叠?



