栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

数据分析 | 多元线性回归

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据分析 | 多元线性回归

多元线性回归模型

一、相关关系

01 相关分析 二、一元线性回归模型

01 简介02 代码实现 三、多元线性回归模型

01 模型参数求解02 代码实现

一、相关关系

相关关系是客观现象存在的一种非确定的相互依存关系,即自变量的每一个取值,因变量由于受随机因素影响,与其所对应的数值是非确定性的。相关分析中的自变量和因变量没有严格的区别,可以互换。

01 相关分析

相关系数计算公式:
ρ = Σ ( X i − X ˉ ) ( Y i − Y ˉ ) Σ ( X i − X ˉ ) 2 ( Y i − Y ˉ ) 2 rho = frac{Sigma(X_i-bar X)(Y_i-bar Y)}{sqrt{Sigma(X_i-bar X)^2(Y_i-bar Y)^2}} ρ=Σ(Xi​−Xˉ)2(Yi​−Yˉ)2 ​Σ(Xi​−Xˉ)(Yi​−Yˉ)​
其中:
∣ ρ ∣ ≥ 0.8 , 高 度 相 关 0.5 ≤ ∣ ρ ∣ < 0.8 , 中 度 相 关 0.3 ≤ ∣ ρ ∣ < 0.5 , 弱 相 关 ∣ ρ ∣ < 0.3 , 几 乎 不 相 关 |rho|geq 0.8 ,高度相关\ 0.5leq|rho|<0.8,中度相关\ 0.3leq|rho|<0.5,弱相关\ |rho|<0.3,几乎不相关 ∣ρ∣≥0.8,高度相关0.5≤∣ρ∣<0.8,中度相关0.3≤∣ρ∣<0.5,弱相关∣ρ∣<0.3,几乎不相关
注意:不相关的意思是不存在线性关系!

相关系数代码实现:

income = pd.read_csv(r'Salary_Data.csv', engine='python')
income.Salary.corr(income.YearExperience)

获得Salary与YearExperience之间的相关系数。

Profit.drop('State', axis=1).corrwith(Profit['Profit'])

去除Profit数据集中的State分类型变量,然后获取Profit变量与其他变量之间的相关系数。

二、一元线性回归模型 01 简介

一元线性回归分析预测法,是根据自变量x和因变量Y的相关关系,建立x与Y的线性回归方程进行预测的方法。由于市场现象一般是受多种因素的影响,而并不是仅仅受一个因素的影响。所以应用一元线性回归分析预测法,必须对影响市场现象的多种因素做全面分析。只有当诸多的影响因素中,确实存在一个对因变量影响作用明显高于其他因素的变量,才能将它作为自变量,应用一元相关回归分析市场预测法进行预测 。

一元线性回归分析法的预测模型为:

Y t = a x t + b Y_t = ax_t+b Yt​=axt​+b
式中,x**t代表t期自变量的值;

Y t Y_t Yt​代表t期因变量的值;

a、b代表一元线性回归方程的参数。

a、b参数由下列公式求得(用代表):

b = Σ Y i n − a Σ x i n ; b=frac{Sigma Y_i}{n}-afrac{Sigma x_i}{n}; b=nΣYi​​−anΣxi​​;

a = n Σ x i Y i − Σ x i Σ Y i n Σ x i 2 − ( Σ x i ) 2 a=frac{nSigma x_iY_i-Sigma x_iSigma Y_i}{nSigma x_i^2-(Sigma x_i)^2} a=nΣxi2​−(Σxi​)2nΣxi​Yi​−Σxi​ΣYi​​

02 代码实现

导入第三方库:import statsmodel.api as sm

sm.ols(formula, data, subset=None, drop_cols=None)

formula:以字符串的形式指定线性回归模型的公式,如’y~x’就表示简单线性回归模型data:指定建模的数据集subset:通过bool类型的数组对象,获取data的子集用于建模drop_cols:指定需要从data中删除的变量

import pandas as pd
import statsmodels.api as sm

income = pd.read_csv(r'Salary_Data.csv', engine='python')

# 利用收入数据集,构建回归函数
fit = sm.formula.ols('Salary ~ YearsExperience', data = income).fit()
# 返回模型的参数值
fit.params

得到结果:

Intercept          25792.200199
YearsExperience     9449.962321
dtype: float64

即结果为:Salary = 25792.200199 + 9449.962321YearsExperience

三、多元线性回归模型

对于一元线性回归来说,其反映的是单个自变量对因变量的影响,而当自变量不只一个时,则需要将一元线性回归模型扩展到多元线性回归模型。
y = { y 1 y 2 ⋮ y n ,   X = { x 11    x 12    ⋯    x 1 p x 21    x 22    ⋯    x 2 p     ⋮ x n 1    x n 2    ⋯    x n p y=begin{cases}y_1\y_2\vdots\y_nend{cases},,X=begin{cases}x_{11},,x_{12},,cdots,,x_{1p}\x_{21},,x_{22},,cdots,,x_{2p}\,,,vdots\x_{n1},,x_{n2},,cdots,,x_{np}end{cases} y=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧​y1​y2​⋮yn​​,X=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧​x11​x12​⋯x1p​x21​x22​⋯x2p​⋮xn1​xn2​⋯xnp​​
其中, x i j x_{ij} xij​表示第i行第j列的变量值,多元线性回归模型即为因变量y 与自变量X的线性组合,即:
y   =   β 0 + β 1 x 1 + β 2 x 2 + ⋯ + β p x p + ϵ y,=,beta_0+beta_1x_1+beta_2x_2+cdots+beta_px_p+epsilon y=β0​+β1​x1​+β2​x2​+⋯+βp​xp​+ϵ
化为矩阵形式即为: y   =   X β   +   ϵ y,=,Xbeta,+,epsilon y=Xβ+ϵ

01 模型参数求解

构造目标函数:
J ( β ) = Σ ϵ 2 = Σ ( y − X β ) 2 J(beta)=Sigmaepsilon^2=Sigma(y-Xbeta)^2 J(β)=Σϵ2=Σ(y−Xβ)2
展开平方项:
J ( β ) = ( y − X β ) ′ ( y − X β ) = ( y y ′ − y ′ X β − β ′ X ′ y + β ′ X ′ X β ) J(beta)=(y-Xbeta)'(y-Xbeta)=(yy'-y'Xbeta-beta'X'y+beta 'X'Xbeta) J(β)=(y−Xβ)′(y−Xβ)=(yy′−y′Xβ−β′X′y+β′X′Xβ)
求偏导:
∂   J ( β ) ∂ β = ( 0 − X ′ y − X ′ y + 2 X X ′ β ) = 0 frac{partial,J(beta)}{partialbeta}=(0-X'y-X'y+2XX'beta)=0 ∂β∂J(β)​=(0−X′y−X′y+2XX′β)=0
计算偏回归系数:
β = ( X ′ X ) − 1 X ′ y beta=(X'X)^{-1}X'y β=(X′X)−1X′y

02 代码实现
# 多元线性回归模型的预测
from sklearn import model_selection

# 导入数据
Profit = pd.read_excel(r'Predict to Profit.xlsx')

# 将数据区分为训练集和测试集
train,test = model_selection.train_test_split(Profit, test_size = 0.2, random_state = 1234)
# 根据train数据集建模
model = sm.formula.ols('Profit~RD_Spend+Administration+Marketing_Spend+C(State)', data = train).fit()

print('模型的偏回归系数分别为:n', model.params)
# 删除test数据集中的Profit变量,用剩下的自变量进行预测
test_X = test.drop(labels = 'Profit', axis = 1)
pred = model.predict(exog = test_X)

print('对比预测值与实际值的差异:n', pd.Dataframe({'Prediction':pred,'Real':test.Profit}))

结果为:

模型的偏回归系数分别为:
 Intercept               58581.516503
C(State)[T.Florida]       927.394424
C(State)[T.New York]     -513.468310
RD_Spend                    0.803487
Administration             -0.057792
Marketing_Spend             0.013779
dtype: float64
对比预测值与实际值的差异:
        Prediction       Real
8   150621.345801  152211.77
48   55513.218079   35673.41
14  150369.022458  132602.65
42   74057.015562   71498.49
29  103413.378282  101004.64
44   67844.850378   65200.33
4   173454.059691  166187.94
31   99580.888894   97483.56
13  128147.138396  134307.35
18  130693.433835  124266.90

注意:State为离散分类型变量,需要前加C。对于分类变量,由于其不是数值无法直接计算,需要:

如果分类变量只有两个水平(例如性别,男和女),我们只需要定义一个虚拟变量就可以了,用0表示男,用1表示女。当一个分类变量超过两个水平时,我们必须在定义虚拟变量和解释虚拟变量两方面谨慎从事。重点是要牢记:在多元回归分析中,如果一个分类变量有k个水平,那么需要在多元回归分析中定义k-1个虚拟变量。

当然,在分类变量多于两个水平时,也可以人为的丢弃,如下:

# 生成由State变量衍生出的哑变量
dummies = pd.get_dummies(Profit.State)
# 将哑变量与原始数据集水平合并
Profit_New = pd.concat([Profit,dummies], axis = 1)
# 删除State和Califonia变量(因为State变量已经被分解为哑变量,New York变量需要作为参照组)
Profit_New.drop(labels = ['State','New York'], axis = 1, inplace = True)
# 拆分数据集Profit_New
train,test = model_selection.train_test_split(Profit_New, test_size = 0.2, random_state = 1234)
# 建模
model2 = sm.formula.ols('Profit~RD_Spend+Administration+Marketing_Spend+Florida+California', data=train).fit()
print("模型的偏回归系数分别为:n", model2.params)

结果为:

模型的偏回归系数分别为:
 Intercept          58068.048193
RD_Spend               0.803487
Administration        -0.057792
Marketing_Spend        0.013779
Florida             1440.862734
California           513.468310
dtype: float64

Profit = 0.803487RD_Spend - 0.057792Administration + 0.013779Marketing_Spend + 1140.862734Florida + 513.468310Califonia

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/739500.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号