<<返回python首页 python

《Python 应用案例》

Python促销前销售预测

在实战中学习,在学习中成长。今天的案例场景:在做活动促销前,基于现有的一些数据,想要做回归分析,预测本次促销的销售量会达到是多少,做到“未售而先知”,心里有数的效果,希望最快答复。因为最快,来不及深入观察,探索性分析,算法选择,参数调优等一系列过程,所以只是简单粗暴的预测。

Python促销前销售预测

本文转自微信公众号:Python数据科学修炼之路 作者:老杨啊小强

本转载已获作者授权,禁止二次转载

sklearn官网给出的回归模型有很多:https://scikit-learn.org/0.18/supervised_learning.html#supervised-learning

导入库

安装xgboost库

!pip3 install xgboost -i https://pypi.tuna.tsinghua.edu.cn/simple

导入相关库

import pandas as pd
import numpy as np
from sklearn.linear_model import BayesianRidge, ElasticNet# 批量导入要实现的回归算法
from sklearn.svm import SVR  # SVM中的回归算法
from xgboost import XGBRegressor
from sklearn.ensemble.gradient_boosting import GradientBoostingRegressor  # 集成算法
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import explained_variance_score, mean_absolute_error,mean_squared_error, r2_score  # 批量导入指标算法
import matplotlib.pyplot as plt  # 导入图形展示库

各库的用途解释】:

BayesianRidge:广义线性回归库,对数据适应能力较强,可防止过拟合

ElasticNet:广义线性回归库,Lasso和Ridge回归技术的混合体,在高维度和共线性的场景下应对自如。

SVR:支持向量机的回归库,SVM本身用于分类,分类精度相当不错,可以指定不同内核,默认的rbf核(高斯核)可以解决非线性的回归问题。

XGBRegressor:大名鼎鼎的XGBoost库的回归方法,在各个比赛中出好成绩的算法,通常效果不会错。

GradientBoostingRegressor:sklearn自己集成的回归算法GBDT,GBDT与XGBoost齐名,都是boosting类型的优化机制,精度有保障。

sklearn.metrics:评估指标

StandardScaler:用于数据的标准化,统一量纲,防止量纲差异对结果的影响

数据准备

raw_data=np.loadtxt('/share/datasets/promotion-prediction-regression.txt)# 读取数据文件
X_raw,y = raw_data[:, :-1],raw_data[:, -1]  # 分割自变量,因变量
model_ss = StandardScaler()
X = model_ss.fit_transform(X_raw)

Numpy的loadtxt方法读进来的文件,已经是数组格式,用数组切片,分割自变量X和Y,然后标准化,用fit_transform方法,直接训练转化。

拆分数据集

num = int(X.shape[0]*0.7)
X_train,X_test = X[:num,:],X[num:,:] # 拆分训练集和测试集
y_train,y_test = y[:num],y[num:] # 拆分训练集和测试集

X有506个样本,13个特征变量,X和y前70%用于训练,后30%用于测试。

初选回归模型

model_names = ['BayesianRidge', 'XGBR', 'ElasticNet', 'SVR', 'GBR']  # 不同模型的名称列表
model_br = BayesianRidge()  # 建立贝叶斯岭回归模型对象
model_xgbr = XGBRegressor(random_state=0)  # 建立XGBR对象
model_etc = ElasticNet(random_state=0)  # 建立弹性网络回归模型对象
model_svr = SVR(gamma='scale')  # 建立支持向量机回归模型对象
model_gbr = GradientBoostingRegressor(random_state=0)  # 建立梯度增强回归模型对象
model_list = [model_br, model_xgbr, model_etc,model_svr, model_gbr]  # 不同回归模型对象的集合
pre_y_list = [model.fit(X_train, y_train).predict(X_test) for model in model_list]  # 各个回归模型预测的y值列表

1、model_names建立不同的模型名称列表,

2、建立不同的模型实例,

3、将模型实例组合列表,

4、用列表推导式,在训练集做训练,在测试集预测y值,预测的y值与实际的y_test的值作比较。

模型效果评估

n_samples, n_features = X.shape  # 总样本量,总特征数
model_metrics_functions = [explained_variance_score, mean_absolute_error, mean_squared_error,r2_score]  # 回归评估指标对象集
model_metrics_list = [[m(y_test, pre_y_list[i]) for m in model_metrics_functions] for i in range(len(model_list))]  # 回归评估指标列表
regresstion_score = pd.DataFrame(model_metrics_list, index=model_names,
                   columns=['explained_variance', 'mae', 'mse', 'r2'])  # 建立回归指标的数据框
print('all samples: %d \t features: %d' % (n_samples, n_features),'\n','-'*60)  # 打印输出样本量和特征数量
print('\n','regression metrics:','\n','-'*60)  # 打印输出标题
print(regresstion_score)  # 打印输出回归指标的数据框

1、通过shape方法,得到数据集的数量和特征数;

2、modelmetricsfunctions是评估指标列表

explainedvaricancescore:可解释方差的回归评分函数

meanabsoluteerror:平均绝对误差

meansquarederror:平均平方误差

r2_score:R方

img

img

3、两层列表推导式,类似两个for循环:

内层:取每个评估函数,实际的y和预测的y做回归指标评估,得到不同的指标

外层:取每个回归模型y的预测值,再调用内层,得到每个回归模型的回归指标的评估

由指标矩阵可知:

XGBRegressorGradientBoostingRegressor效果最好,

贝叶斯和支持向量机在默认参数的情况下效果差,

弹性网络ElasticNet效果可以,但是弱于两个集成算法。

06

模型效果图对比

plt.figure(figsize=(10, 10))  # 创建画布
for i, pre_y in enumerate(pre_y_list):  # 读出通过回归模型预测得到的索引及结果
    plt.subplot(len(pre_y_list)+1,1,i+1)
    plt.plot(np.arange(len(y_test)), y_test, color='k', label='true y')  # 画出原始值的曲线
    plt.plot(np.arange(len(y_test)), pre_y_list[i], 'g--', label=model_names[i])  # 画出每条预测结果线
    plt.title('True and {} result comparison'.format(model_names[i]))  # 标题
    plt.legend(loc='upper right')  # 图例位置
    plt.tight_layout() # 自动调整子图间隔

虚线是真实值,实线是预测值,拟合效果最好的可以看出是两个集成算法。

模型应用

print('regression prediction','\n','-'*40)

for i, new_point in enumerate(new_point_set):  # 循环读出每个要预测的数据点
    x_matrix = np.array(new_point).reshape(1, -1)
    x_scaled = model_ss.transform(x_matrix)
    new_pre_y = model_xgbr.predict(x_scaled)  # 使用GBR进行预测
    print('predict for new point %d is:  %.2f' % (i + 1, new_pre_y))  

# 打印输出每个数据点的预测信息
regression prediction 

模型应用,我们用梯度提升决策树GradientBoostingRegressor进行预测,

输入newpointset,得到四个预测值训练的时候进行fit_transform,预测的时候也要对其转化后预测。

08

小结

  • 1、使用Numpy读数据,配合Pandas对数据处理
  • 2、sklearn的linear_model库的BayesianRidge贝叶斯回归,ElasticNet弹性网络,SVM中的SVR支持向量机,ensemble.gradient中的GradientBoostingRegressor梯度提升决策树,XGBRegressor
  • 3、StandardScaler做数据的标准化处理
  • 4、fit训练模型,predict方法预测,transform方法做数据的处理
  • 5、matplotlib.pyplot做图形的可视化展示。

对于本文提到的各种机器学习算法,本人有时间,后期会更新算法原理以及数学推导过程,也可以推荐大家啃“西瓜书”,或者在看网易云课堂学习斯坦福大学吴恩达老师机器学习视频公开课,英语和我一样不过关也不要紧,有中文字幕的哦!

移动端设备除iPad Pro外,其它移动设备仅能阅读基础的文本文字。
建议使用PC或笔记本电脑,浏览器使用Chrome或FireFox进行浏览,以开启左侧互动实验区来提升学习效率,推荐使用的分辨率为1920x1080或更高。
我们坚信最好的学习是参与其中这一理念,并致力成为中文互联网上体验更好的学练一体的IT技术学习交流平台。
您可加QQ群:575806994,一起学习交流技术,反馈网站使用中遇到问题。
内容、课程、广告等相关合作请扫描右侧二维码添加好友。

狐狸教程 Copyright 2021

进入全屏