线性回归

Posted on 2021-01-31 22:39  熊小尼  阅读(176)  评论(0)    收藏  举报

一、一元线性回归

 导入第三方模块
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
out:
Intercept 25792.200199
YearsExperience 9449.962321
dtype: float64

  

二、多元线性回归

# 导入模块
from sklearn import model_selection
# 导入数据
Profit = pd.read_excel(r'D:\pylearn\11\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}))


/*默认情况下,对于离散变量State而言,模型选择California值作为对照组。*/
结果:
模型的偏回归系数分别为:
 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变量衍生的哑变量
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)#axis=0代表跨行,axis=1代表跨列,inplace=True,
#不创建新的对象,直接对原始对象进行修改
# 拆分数据集Profit_New
train,test=model_selection.train_test_split(Profit_New,test_size=0.2,random_state=1234)
# 建模
model=sm.formula.ols('Profit~RD_Spend+Administration+Marketing_Spend+Florida+California',data=train).fit()
print('模型的偏回归系数分别为:\n',model.params)

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

 求相关系数

income.Salary.corr(income.YearsExperience)#相关系数
结果:0.9782416184887598

Profit.corrwith(Profit['Profit'])
结果:
RD_Spend           0.978437
Administration     0.205841
Marketing_Spend    0.739307
Profit             1.000000
dtype: float64

假设检验

目的:验证想法是否准确

模型的F检验:检验模型的合理性
1、提出问题的原假设和备择假设
2、在原假设的条件下,构造统计量F
3、根据样本信息,计算统计量的值
4、对比统计量的值和理论F分布的值,当统计量值超过理论值时,拒绝原假设,否则接受原假设

 

 

# 导入第三方模块
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)
# 导入模块
from scipy.stats import f
# 计算F分布的理论值
F_Theroy=f.ppf(q=0.95,dfn=p,dfd=n-p-1)
print('F分布的理论值为:',F_Theroy)

结果:
F统计量的值: 174.63721716844674
F分布的理论值为: 2.502635007415366

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

  

参数的t检验 

 

 

model.summary()

 

 

 

 

 

 

 

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3