般线性回归中,使用的假设函数是一元一次方程,也就是二维平面上的一条直线。但是很多时候可能会遇到直线方程无法很好的拟合数据的情况,这个时候可以尝试使用多项式回归。多项式回归中,加入了特征的更高次方(例如平方项或立方项),也相当于增加了模型的自由度,用来捕获数据中非线性的变化。添加高阶项的时候,也增加了模型的复杂度。随着模型复杂度的升高,模型的容量以及拟合数据的能力增加,可以进一步降低训练误差,但导致过拟合的风险也随之增加。
基础
- 多重线性回归(Multiple Linear Regression)
- 研究一个因变量与多个自变量间线性关系的方法
- 在实际工作中,因变量的变化往往受几个重要因素的影响,此时就需要用2个或2个以上的影响因素作为自变量来解释因变量的变化,这就是多重线性回归;
多重线性回归模型
1.模型
2.模型关键词解析
- 偏回归系数
- 多重线性模型中包含多个自变量,它们同时对因变量y发生作用,如果要考察一个自变量对因变量y的影响,就必须假设其他自变量保持不变;因此,多重线性模型中的回归系数称为偏回归系数,偏回归系数β_1是指在其他自变量保持不变的情况下,自变量x_1每变动一个单位,引起的因变量y的平均变化;β_2到β_n依次类推;
回归分析步骤
- 根据预测目标,确定自变量和因变量
- 绘制散点图,确定回归模型类型
- 估计模型参数,建立回归模型
- 对回归模型进行检验
- 利用回归模型进行预测
案例
某金融公司打算新开一类金融产品,现有9个金融产品的数据,包括用户购买金融产品的综合年化利率,以及公司收取用户的佣金(手续费);如下表所示,产品利率为11%,佣金为50,我们需要预测这款金融产品的销售额
data = pandas.read_excel('./MLR.xlsx',encoding='GBK')
第一步 确定变量
- 根据预测目标,确定自变量和因变量
- 因变量:销售额
- 自变量:利率、佣金
第二步 确定类型
- 绘制散点图,确定回归模型类型
- 从散点图和相关系数结果表可以看出,产品利率和销售额是强正相关;佣金与销售额是强负相关;因此,我们可以使用多重线性模型来解决这个问题;
- 也可以直接查看相关系系数进行查看
我们对自变量和因变量绘制散点图,因为需要绘制多个变量两两之间的散点图,在这里介绍一个更先进的绘图方法
scatter_matrix
:我们把自变量和因变量从data中选取出来,然后设置好对应的参数。第一个是图片的大小,如果变量太多,我们就要把图片的尺寸设置的足够大才能够展示出来;第二个参数diagonal是变量与变量本身的绘图方式,我们选择kde,是绘制直方图,这个参数是什么意思,我们执行代码就知道了,代码如下:
pd.plotting.scatter_matrix(data[["百分比利率","抽取用户佣金","金融产品销售额"]],
figsize =(10,10),diagonal = 'kid',color='r')
plt.show()
co=data[["百分比利率","抽取用户佣金","金融产品销售额"]].corr()
x = data[["百分比利率","抽取用户佣金"]]
y = data[["金融产品销售额"]]
print(co)
第三步 建立模型
- 估计模型参数,建立回归模型
- 多重线性回归模型参数的估计方法与简单线性回归模型参数的估计方法是相同的:都是采用最小二乘法进行估计
#建模
from sklearn.linear_model import LinearRegression
lrModel = LinearRegression()
#训练模型
lrModel.fit(x,y)
第四步 模型检验
- 对回归模型进行检验
拟合完方程的参数之后,我们就要对回归模型进行检验,在简单线性回归的分享中,我们用判定系数来验证方程的拟合程度,而在多重线性回归中,如果在模型中增加一个自变量,模型中R平方往往也会相应增加,这就会给我们一个错觉:要使得模型拟合的好,只要增加自变量即可。因此,
使用判定系数R平方来验证方程的拟合程度是不够科学的
,需要自变量个数进行修正和调整,也就是调整判定系数;以上,我们只要理解原理即可,公式记不住也不要紧,知道多重线性模型需要用调整判定系数来判定方程的拟合程度,会用Python看结果就可以了。
第五步 模型预测
- 利用回归模型进行预测
- 根据已有的自变量数据,预测需要的因变量对应的结果
#预测
lrModel.predict([11,50])
#查看参数
lrModel.coef_
#查看截距
lrModel.intercept_
完整代码
import pandas
import pandas as pd
import matplotlib
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
font = {
'family':'SimHei'
}
matplotlib.rc('font',**font)
data = pandas.read_excel('./MLR.xlsx',encoding='GBK')
# print(data)
pd.plotting.scatter_matrix(data[["百分比利率","抽取用户佣金","金融产品销售额"]],
figsize =(10,10),diagonal = 'kid',color='r')
# plt.show()
#相关系数R
corr=data[["百分比利率","抽取用户佣金","金融产品销售额"]].corr() #查看数据间的相关系数
x = data[["百分比利率","抽取用户佣金"]]
y = data[["金融产品销售额"]]
#建模
from sklearn.linear_model import LinearRegression
lrModel = LinearRegression()
#训练模型
lrModel.fit(x,y)
#预测
print(lrModel.predict([(9,75)])) #[[495.62788769]]
#查看参数
corf=lrModel.coef_
print(corf) #含有两个自变量 ,有两个参数[[62.35235754 -0.28005173]]
#查看截距
print(lrModel.intercept_) #[-44.5394503]