基于货架库存会对货架的销量产生影响的猜想,建立模型求取保证货架活力的最低库存 ,使用货架库存随着时间变化的数据来训练模型。
import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.preprocessing import PolynomialFeatures from sklearn.linear_model import LinearRegression from sklearn.pipeline import Pipeline from sklearn.model_selection import cross_val_score
datas = pd.read_csv('C:/Users/acer/Desktop/sf-data1.CSV') datas.head()
day | id | sku | |
---|---|---|---|
0 | 1 | A122493 | 274 |
1 | 1 | A167385 | 280 |
2 | 1 | A188452 | 279 |
3 | 1 | A275823 | 271 |
4 | 1 | A353800 | 265 |
观察各货架的库存随着随着时间的变化,发现随着库存越来越低销量存在拐点(库存在低于一定程度时销量慢慢停滞),所以认定货架库存会对货架的销量产生影响的猜想成立
#各货架库存随时间变化的散点图 fig = plt.figure(figsize=(16, 16)) for i, j in zip(list(datas.id.unique()), range(len(list(datas.id.unique())))): sp = fig.add_subplot(3,3,j+1) plt.scatter(datas[datas.id==i].day,datas[datas.id==i].sku) sp.set_title(i) sp.set_xlabel('day') sp.set_ylabel('sku')
对观测货架的库存按天取均值,得到一组新数据(新的数据代表所有货架每天的库存均值),以这组数据建立模型,并估计保证货架活力的最低库存
sku_mean = list() for i in list(datas.day.drop_duplicates()): sku_mean.append(datas[datas.day==i].sku.mean()) data = pd.DataFrame(dict(day = list(datas.day.drop_duplicates()), sku_mean = sku_mean)) print(data) plt.scatter(data.day, data.sku_mean)
day sku_mean 0 1 273.111111 1 2 258.555556 2 3 244.111111 3 4 235.000000 4 5 221.111111 5 6 206.888889 6 7 192.555556 7 8 180.777778 8 9 171.666667 9 10 164.000000 10 11 157.888889 11 12 151.666667 12 13 146.666667 13 14 141.555556 14 15 136.444444 15 16 131.333333 16 17 126.555556 17 18 123.111111 18 19 120.777778 19 20 117.555556 20 21 113.777778
<matplotlib.collections.PathCollection at 0x2ae5afc50>
![](https://i-blog.csdnimg.cn/blog_migrate/86ed19453164937a34293ab56fa5b836.png)
建立2、3、4次多项式模型,选出最佳模型
day = np.array(data.day).reshape(-1,1)
sku_mean = np.array(data.sku_mean).reshape(-1,1)
degrees = [2, 3, 5] plt.figure(figsize=(12, 5)) for i in range(len(degrees)): ax = plt.subplot(1, len(degrees), i + 1) #plt.setp(ax, xticks=(), yticks=()) polynomial_features = PolynomialFeatures(degree=degrees[i],include_bias=False)#使用i次拟合模型 linear_regression = LinearRegression()#建立线性回归模拟器 pipeline = Pipeline([("polynomial_features", polynomial_features), ("linear_regression", linear_regression)])#管道函数,包装函数 pipeline.fit(day, sku_mean) scores = cross_val_score(pipeline, day, sku_mean, scoring="neg_mean_squared_error", cv=6)#使用6折交叉函数评估模型 plt.plot(day, pipeline.predict(day), label="Model")#模型图像 plt.scatter(day, sku_mean, edgecolor='b', s=20, label="Samples")#散点图 plt.xlabel('day') plt.ylabel('sku') plt.legend(loc='best') plt.tight_layout() print(degrees[i],'次多项式交叉验证得分:',np.round(scores,3))#输出各验证块得分,保留三位小数,scores得分越低越好 print('截距:', np.round(linear_regression.intercept_, 3)) print('系数:',np.round(linear_regression.coef_, 3)) for i in list(datas.id.unique()): day = np.array(datas[datas.id == i].day).reshape(-1,1) sku = np.array(datas[datas.id == i].sku).reshape(-1,1) sku_predict = pipeline.predict(day) print('货架', i, '预测值与真实值的方差:',sum(abs((sku-sku_predict))))
2 次多项式交叉验证得分: [-25.407 -11.506 -12.576 -13.136 -4.455 -46.016] 截距: [288.526] 系数: [[-15.836 0.367]] 货架 A122493 预测值与真实值的方差: [108.52726744] 货架 A167385 预测值与真实值的方差: [83.84477861] 货架 A188452 预测值与真实值的方差: [123.39734844] 货架 A275823 预测值与真实值的方差: [154.98522789] 货架 A353800 预测值与真实值的方差: [82.05393589] 货架 A378337 预测值与真实值的方差: [335.99730221] 货架 A555168 预测值与真实值的方差: [131.63246654] 货架 A606732 预测值与真实值的方差: [165.48621026] 货架 A692238 预测值与真实值的方差: [99.87570375] 3 次多项式交叉验证得分: [-224.745 -8.546 -9.205 -5.262 -0.263 -19.648] 截距: [293.182] 系数: [[-1.8114e+01 6.2000e-01 -8.0000e-03]] 货架 A122493 预测值与真实值的方差: [111.66487034] 货架 A167385 预测值与真实值的方差: [77.24853086] 货架 A188452 预测值与真实值的方差: [123.12205415] 货架 A275823 预测值与真实值的方差: [163.83667447] 货架 A353800 预测值与真实值的方差: [85.64801992] 货架 A378337 预测值与真实值的方差: [330.7526821] 货架 A555168 预测值与真实值的方差: [125.29274328] 货架 A606732 预测值与真实值的方差: [152.39309407] 货架 A692238 预测值与真实值的方差: [89.25827524] 5 次多项式交叉验证得分: [-1.287563e+03 -3.652000e+00 -8.510000e-01 -2.406000e+00 -4.585000e+00 -3.734700e+01] 截距: [280.544] 系数: [[-6.754 -2.239 0.285 -0.013 0. ]] 货架 A122493 预测值与真实值的方差: [113.84140579] 货架 A167385 预测值与真实值的方差: [64.25593217] 货架 A188452 预测值与真实值的方差: [129.05619528] 货架 A275823 预测值与真实值的方差: [148.43293249] 货架 A353800 预测值与真实值的方差: [92.54495995] 货架 A378337 预测值与真实值的方差: [338.46397757] 货架 A555168 预测值与真实值的方差: [138.63485879] 货架 A606732 预测值与真实值的方差: [149.5886654] 货架 A692238 预测值与真实值的方差: [73.64250533]
![](https://i-blog.csdnimg.cn/blog_migrate/7bfb1574e7caab55439a00f45244e919.png)