首页 > 技术文章 > 线性回归模型

shof 2020-10-27 22:57 原文

⼀元线性回归模型

两边变量之间存在明显的线性关系

相关系数算法

# 方式1:用数学公式计算
import numpy
import pandas
X = [52,19,7,33,2]
Y = [162,61,22,100,6]
#公式计算
#均值
XMean = numpy.mean(X)
YMean = numpy.mean(Y)
#标准差
XSD = numpy.std(X)
YSD = numpy.std(Y)
#z分数
ZX = (X-XMean)/XSD
ZY = (Y-YMean)/YSD  
# 相关系数
r = numpy.sum(ZX*ZY)/(len(X))
r


# 方式2:使用numpy中的corrcoef方法直接计算
t=numpy.corrcoef(X,Y)
t


# 方法3:pandas中的corr方法直接计算
data = pandas.DataFrame({'X':X,'Y':Y})
t2=data.corr()
t2

⼀元线性回归模型的应⽤

# 导⼊第三⽅模块
import statsmodels.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('Salary_Data.csv')
# 利⽤收⼊数据集,构建回归模型
fit = sm.formula.ols('Salary ~ YearsExperience', data = income).fit()
# 返回模型的参数值
fit.params

多元线性回归模型

对于⼀元线性回归模型来说,其反映的是单个⾃变量对因变量的影响,然⽽实际情况中,影
响因变量的⾃变量往往不⽌⼀个,从⽽需要将⼀元线性回归模型扩展到多元线性回归模型。

多元线性回归模型的应⽤

# 导⼊模块
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数据集建模
# C(离散型变量)会转成哑变量
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}))

多元线性回归模型的预测

# ⽣成由State变量衍⽣的哑变量
dummies = pd.get_dummies(Profit.State)
# 将哑变量与原始数据集⽔平合并
Profit_New = pd.concat([Profit,dummies], axis = 1)
# 删除State变量和California变量(因为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)

模型的F检验

'''
F检验用来检验模型是否合理
'''

# 1.计算统计量:
# 导⼊第三⽅模块
import numpy as np
# 计算建模数据中因变量的均值
ybar=train.Profit.mean()
# 统计变量个数和观测个数
p=model.df_model
n=train.shape[0]
# 计算回归离差平⽅和
RSS=np.sum((model.fittedvalues-ybar)**2)
# 计算误差平⽅和
ESS=np.sum(model.resid**2)
# 计算F统计量的值
F=(RSS/p)/(ESS/(n-p-1))
print('F统计量的值:',F)
'''
out:
F统计量的值:174.6372
'''

# 2.对⽐结果下结论
# 导⼊模块
from scipy.stats import f
# 计算F分布的理论值
F_Theroy = f.ppf(q=0.95, dfn = p,dfd = n-p-1)
print('F分布的理论值为:',F_Theroy)
'''
out:
F分布的理论值为: 2.502635007415366
'''

'''
计算出来的F统计量值174.64远远⼤于F分布的理论值2.50,所以应当拒绝原假设,即
认为多元线性回归模型是显著的,也就是说回归模型的偏回归系数都不全为0。
'''

参数的t检验

'''
T检验用来检验参数是否合理
'''

# 有关模型的概览信息
model2.summary()

'''
参数对应的P值(P>|t|)小于0.05,才说明其余变量没有通过系数的显著性检验。
即在模型中这些变量不是影响结果的重要原因。
'''

推荐阅读