sklearn逻辑回归参数设置_线性回归与销售额预测

v2-26637b262a44e98a21d8622ebcee438e_1440w.jpg?source=172ae18b

这篇主要记录数据建模中的线性回归的学习


如何用Sklearn进行线性回归分析?

这部分主要记录2个关键知识点:

  1. 回顾回归模型原理与工作流程
  2. 如何使用Python的Sklearn进行模型搭建

什么是回归模型?

v2-063e8e47a708589379185a32cd7fe1c2_b.jpg

线性回归都有哪些应用场景?

  • 保险行业 (用户的保费 赔付金额)
  • 旅游行业 (用户的出行次数 度假时长)
  • 电商行业 (用户网页停留时间 购物车的商品数量)

注意:

  • 回归分析虽然是最常见的分析方法,但它背后有很复杂的统计假设。
  • 最重要的一个假设就是,随机误差项是一个平均值为0的随机变量,且服从正态分布。
  • 在完成回归分析的过程中,我们需要进行对应的验证

分析模型的核心包-sklearn

Sklearn(是Scikit-learn的缩写)是Python中常用于机器学习的第三方模块。

在实战中使用Scikit-learn可以极大的节省我们编写代码的时间以及减少我们的代码量,使我们有更多的精力去分析数据分布,调整模型和修改超参。

在Python中可以简单的调用Sklearn包里的模块就可以实现大多数机器学习任务:

  • 回归(线性回归)
  • 聚类问题
  • 分类预测(逻辑回归,决策树,随机森林等)

以下是 Sklearn 官网提供的一个流程图,蓝色圆圈内是判断条件,绿色方框内是可以选择的算法:

v2-77096f01e4707c2820600dd6d65a580c_b.jpg

Sklearn示例:8行代码完成回归模型

v2-4c4ef2d0aa7010faf9182982be513ee5_b.jpg

案例:宝洁销售额预测分析

对于宝洁这样的快消品企业,重要的数据应用:

  • 对商超门店的销售额做出精准预测
  • 量化自身所能控制的各种促销因素所能产生的效果
  • 对营销资源做出合理规划

在本例中,通过回归分析实现对各类因素投入产出比做出评估。

分析数据: 电视广告,线上,线下,门店内,微信渠道等促销投入和销售额

v2-6f4a838f234652b06c49f6ea68c034db_b.jpg

数据解读

v2-8505c10c93797d62d6889c2d4944d504_b.jpg

分析流程

v2-b69316c985b49a747952abcfae892fc0_b.jpg

第一步:数据概况分析

别忘了先导入数据哦!

  1. 准备好编译器
  2. 将以下代码复制到编译器中,并点击运行或使用Ctrl+Enter键。
#调包

我们获得的数据是什么样子的?

info()函数,了解dataframe数据类型

通过info()函数,我们发现了

  • local_tv有50多个空值
  • Event是个类别型变量(object),在sklearn回归模型中无法直接处理,需要转变成数字型变量

v2-3b252c71fc627ba34d7b9c604d746765_b.jpg

isnull()函数,判断数据集store每一列是否为空

  • 若为空值,标记为1,若不是空值则标记为0

sum()函数,对分析后的数据进行加总

  • 获得每列总的空值数量

v2-372aa73c4b4cad0d3ecbb3101c7b088a_b.jpg

describe()函数 ,了解dataframe数据的描述性统计量

  • 查看数据分布及数据大小情况
  • 确认数据与真实情况一致
    • 比如reach与person变量,与业务确认是否与真实情况一致

v2-7b7378272ac668327231196841bfe13c_b.jpg

使用代码,整合如下

#调包
import pandas as pd
# 读取数据
store=pd.read_csv('w2_store_rev.csv',index_col=0)
# 查看数据信息
store.info()
# 去除Unnamed:0的影响
store=pd.read_csv('w2_store_rev.csv',index_col=0)
# 统计数据空值
store.isnull().sum()
# 查看数据分布
store.describe()

第二步:单变量分析(对唯一的类别型变量event进行了具体值的查看,然后将其转换成了0/1的数值型变量 )

数据.字段.unique()函数

  • 使用unique()函数可以查看指定数据的字段中所有不重复的值,快速了解类别型变量具体的类别组成
  • 在课程中我们返回了event:non_event、special、cobranding、holiday这四类值

v2-4c6b65499ead0f4139d041846619c4a7_b.png

groupby()+describe()查看类别型变量event各类别的数据分布

  • 数据.groupby(['字段1'])['字段2'].describe()
    • 可以根据字段1进行分组查看字段2的数据分布
    • 课程中查看了revenue和local_tv两个字段在不同event分组下的分布

v2-69db16e9754ae80d6bc6600efaef61f8_b.jpg

get_dummies()将类别变量转化为哑变量

  • pd.get_dummies(数据)可以将数据中所有的类别型变量转换为0/1的数值型变量
  • 如果本行数据在此类别下,就会记为1

head()+info()查看哑变量转化结果

  • head()可以直接看到event被拆分成了4列,每个类别1列,并且已经转化为了0/1的数值
  • info()则通过直接查看变量的类型,确认变量均为数值型变量(float,int)

v2-1c3e1005521a20ca7a8e2cdc71def08b_b.jpg

代码整合如下:

#了解event的具体值
store.event.unique()
#这些类别对应的revenue(销售额)是怎样的
store.groupby(['event'])['revenue'].describe()
#这几个类别对应的local_tv(本地电视广告投入)是怎样的
store.groupby(['event'])['local_tv'].describe()
#将类别变量转化为哑变量
store=pd.get_dummies(store)
# 查看生成event的4个标签,每个标签取值0/1
store.head(10)
#确认类别变量已经转换成数字变量
store.info()

第三步:相关与可视化分析

corr() 查看所有变量相关性

  • 数据.corr()会直接列出数据中所有变量彼此对应的相关性

业务发现

  • 在这里可以初步看到local_tv、instore与person和revenue的相关性

v2-fb6834d3da1fe4a4861849a2bf52a74c_b.jpg

corr()[['字段']]查看某一字段和所有变量的相关性

  • 在函数后加括号corr()[['revenue']],可获得与revenue(即分析中的因变量y)有关的变量相关性分析
  • 在这里,选取df中的单列字段要加两个中括号哦,否则会变成series

sort_values()根据某一字段做升降序排列

  • sort_values('字段',ascending=False)
  • 不加ascending则默认升序
  • ascending=False则设置为降序

业务发现

  • 在这一步我们看到local_tv/person/instore是三个与revenue相关性最高的变量
  • 对于相关性较低的变量虽然不能优先选为模型中的因变量,但也不代表它们与业务的相关性真的很弱
  • 回归、预测等分析,数据的颗粒度越细越好,当前的数据不全,不适合过度解读

v2-844405ef78c2942f42a2b3ea758d1818_b.jpg

接下来,将对local_tv/person/instore这三个变量进行可视化分析

先进行可视化包的导入:

import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

regplot()进行相关性可视化

  • sns.regplot(字段1,字段二,数据)会针对数据中的字段1和字段2生成一副散点图并添加一条线性回归的拟合参考线
  • 以sns.regplot('local_tv', 'revenue', store)为例
    • 自变量x在前,为local_tv
    • 因变量y在后,为revenue
# 对local_tv变量进行线性关系可视化分析
sns.regplot('local_tv','revenue',store)
# 对person变量进行线性关系可视化分析
sns.regplot('person','revenue',store)
# 对instore变量进行线性关系可视化分析
sns.regplot('instore','revenue',store)

v2-e51da24b2ef91aa72c14c29dbb76703d_b.jpg

第四步:线性回归模型的建立与评估

  1. 导入Sklearn包
  2. 设置模型为线性回归
# 调用sklearn中的线性回归工具包
from sklearn.linear_model import LinearRegression
# LinearRegression()设置模型为线性回归
model=LinearRegression()

设定自变量和因变量

  • y=store['revenue']也就是我们要预测的销售额
  • x=store[['local_tv','person','instore']]可以为自变量X设置多个变量

训练模型

  • model.fit(x,y)
  • local_tv中存在空值,这种情况下无法直接建模需要对空值进行处理
# 调用sklearn中的线性回归工具包
from sklearn.linear_model import LinearRegression
# LinearRegression()设置模型为线性回归
model=LinearRegression()
# 设定自变量和因变量
y=store['revenue']
x=store[['local_tv','person','instore']]

fillna()缺失值填充处理

  • 缺失值较少时,例如案例中为5%左右,可以直接进行填充
  • 缺失值过多时,例如达到80%~90%,之前我们可能会以为它没有意义而进行删除,但在大数据时代,缺失也是一种信息,也需要进行填充
  • 几种缺失值填充方式
    • 填充0:store=store.fillna(0)进行填充
    • 均值填充:
      • store=store.fillna(store.mean())#所有空值均值填充
      • store['local_tv']=store['local_tv'].fillna(store.local_tv.mean())#local_tv进行均值填充:
    • 中位数填充:
      • store=store.fillna(store.median())#所有空值中位数填充
      • store['local_tv']=store['local_tv'].fillna(store.local_tv.median())#local_tv进行中位数填充
    • 数据模型填充——例如local_tv和其他变量可能存在线性关系,用其线性模型的结果进行填充
  • 最后 http://store.info()查看是否填充完毕

v2-2903efed7d1bb9635b96e1e562f377ec_b.jpg

填充完成后重新加载变量并训练模型

  • 重新加载填充完的X变量x=store[['local_tv','person','instore']]
  • 重新训练模型model.fit(x,y)

查看自变量系数与截距

  • 查看自变量系数model.coef_,按顺序返回自变量系数的结果
  • 查看模型截距model.intercept_
# 缺失值填充
store=store.fillna(0)
# 查看是否填充完毕
store.info()
# 重新加载填充完的X变量
x=store[['local_tv','person','instore']]
# 重新训练模型
model.fit(x,y)
# 查看自变量系数
model.coef_
# 查看截距
model.intercept_

评估模型的常用指标为 MAE 与 RMSE:

MAE(Mean Absolute Error)

  • 绝对平均误差,是绝对误差的平均值
  • 把每个数据点的预测值和真实值相见,将所有数据点加总求平均
  • 可以更好地反映预测值误差的实际情况
  • Python中代码实现:
    • score=model.score(x,y)#x和y打分
    • predictions=model.predict(x)#计算y预测值
    • error=predictions-y#计算误差
    • mae=abs(error).mean()#计算mae

v2-1701ff78a1b26cc75f07d129955fea5b_b.jpg

RMSE(Root Mean Square Error)

  • 均方根误差,将每个数据点的误差取平方后开方
  • RMSE比起MAE放大了误差,对误差的惩罚更重
  • 常用来作为机器学习模型预测结果衡量的标准
  • Python中代码实现:
    • score=model.score(x,y)#x和y打分
    • predictions=model.predict(x)#计算y预测值
    • error=predictions-y#计算误差
    • rmse=(error**2).mean()**.5#计算rmse

v2-7e25755d052ab6b0b8580d1586c60c62_b.jpg
#模型的评估,x为'local_tv','person','instore'
score=model.score(x,y)#x和y打分
predictions=model.predict(x)#计算y预测值
error=predictions-y#计算误差
rmse=(error**2).mean()**.5#计算rmse
mae=abs(error).mean()#计算mae
print(rmse)
print(mae)

模型的优化:

模型的优化经历了2个阶段,从下图中你可以发现每次优化对于模型误差值的提升。

v2-ac9c4c3ace90acd938edd0ba002441fa_b.jpg

1.增加online变量

  • 一方面根据统计指标评估新增x变量对y变量的解释度
  • 另一方面,从业务角度看,新增变量后,之前的变量对目标的贡献度系数会有什么变化。
  • 结果发现rmse和mae都有下降,但下降幅度较有限。
# 模型的评估,x为'local_tv','person','instore','online'
x=store[['local_tv','person','instore','online']]
model.fit(x,y)
#发现模型误差略有调整
score=model.score(x,y)#x和y打分
predictions=model.predict(x)#计算y预测值
error=predictions-y#计算误差
rmse=(error**2).mean()**.5#计算rmse
mae=abs(error).mean()#计算mae
print(rmse)
print(mae)

2.对local_tv进行均值填充

  • 之前填充local_tv的方法是填充0,但local_tv的值通常较大,填充0会造成一定的误差。
  • 若我们使用均值填充,可能会有不一样的结果。
  • 使用均值填充后,发现rmse和mae的值都大幅降低,模型的预测效果有很大的提升。
store=pd.read_csv('w2_store_rev.csv',index_col=0)
store=pd.get_dummies(store)
store=store.fillna(store.local_tv.mean())
y=store['revenue']
x=store[['local_tv','person','instore','online']]
model.fit(x,y)
score=model.score(x,y)#x和y打分
predictions=model.predict(x)#计算y预测值
error=predictions-y#计算误差
rmse=(error**2).mean()**.5#计算rmse
mae=abs(error).mean()#计算mae
print(rmse)
print(mae)

直接训练模型并查看模型参数

  • from statsmodels.formula.api import ols
  • x=store[['local_tv','person','instore']]
  • y=store['revenue']
  • model=ols('y~x',store).fit() # 用ols的方法根据store数据中已经设置好的X变量和y变量训练模型
  • print(model.summary())# 查看coef-系数、P值显著性等更加细致的模型特征

v2-6ca14717ea03bec29936001d98f99c50_b.jpg
# 查看标准的模型输出表
from statsmodels.formula.api import ols
x=store[['local_tv','person','instore']] 
y=store['revenue']
model=ols('y~x',store).fit()
print(model.summary())

v2-7685c33f126088815056c261efff8987_b.jpg
一张图总结

宝洁回归模型结果与业务解读

宝洁销售额回归模型

  • 模型解读
    • 销售额=-52880+1.75*local_tv+2050*person+4.09*instore
      • local_tv代表本地电视广告投入
      • person代表门店销售人员投入
      • instore代表门店内海报陈列等投入
  • 业务解读
    • 每提升1元的电视广告投入,可以得到1.75元的销售额回报
    • 而每提升1元的店内海报投入,则可以实现4.09元的销售回报
    • 不断收集数据和添加新变量能提升对整体营销资源投入的把握
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值