正文
14 回归分析
14.1 回归分析概述
14.1.2 一元线性回归模型
一般地, 如果自变量与因变量之间存在如下关系, 则可称为一元线性回归模型
变量 | 说明 |
---|---|
自变量 | |
因变量 | |
回归常数 | |
回归系数 | |
随机误差 | |
方差 |
14.2 回归方程推导及作用
14.2.1 回归方程
通过观察组样本观察值, 求出未知参数和, 记为, 则称为关于的经验回归方程, 简称回归方程
14.2.2 参数的最小二乘法估计
二乘~乘两次~平方
基本原则: 最优拟合直线应该使各点到回归直线的距离之和最小, 即平方和最小
求得
例 14.2 求线性回归方程
某公司为了研究某一类产品的产值(万元)和其毛利润(万元)之间的关系:
1 |
|
月份 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
产值 x | 100 | 110 | 120 | 130 | 140 | 150 | 160 | 170 | 180 | 190 |
毛利润 y | 45 | 51 | 54 | 61 | 66 | 70 | 74 | 78 | 85 | 89 |
求毛利润关于产值的线性回归方程
1 |
|
(10, 145.0, 67.3)
1 |
|
(8250.0, 3985.0)
得回归方程:
1 |
|
(-2.739393939393949, 0.48303030303030303)
用 sklearn 实现线性回归方程
1 |
|
(-2.739393939393949, 0.48303030303030303)
1 |
|
14.2.3 方差的估计
的无偏估计:
14.3 回归直线拟合度
14.3.1 因变量 y 变化的指标项
-
总离差平方和(SST): , 反映了因变量的个观察值与其均值的总离差
-
回归平方和(SSR): , 反映了因变量的总变化中, 有与之间的线性关系引起的的变化部分
-
残差平方和(SSE): , 反映了除对的线性影响之外的其他因素对变化的作用, 不能由回归直线来解释的变化部分
SST = SSR + SSE
14.3.2 判定系数
其实就是皮尔森相关系数的平方…
14.4 线性回归的模型检验
14.4.1 线性关系的显著性检验
14.4.2 回归系数的显著性检验
代公式吧…累了
14.5 利用回归直线进行估计和预测
-
预测区间估计: 对于自变量的给定值, 对的预测值作点估计以区间估计(个别值)
-
置信区间估计: 对于自变量的给定值, 估计的平均值及估计区间, 即估计平均值
代公式吧…累了
14.6 多元与曲线回归问题
14.6.1 多元线性回归分析
多元线性回归就是多个自变量与一个因变量的线性回归问题
直接举例吧, 不证明了
例 14.8
设有 1 个表示 4 个特征(自变量)和 1 个因变量的数据集:
1 |
|
x1 | x2 | x3 | x4 | y | |
---|---|---|---|---|---|
0 | 2104 | 5 | 1 | 15 | 368 |
1 | 1416 | 3 | 2 | 10 | 200 |
2 | 1534 | 3 | 2 | 5 | 280 |
3 | 852 | 2 | 1 | 7 | 126 |
利用"最小二乘法"求解回归模型时, 需要将特征(自变量)和因变量分解:
,
, 增加 1 列对应的是的系数
1 |
|
(matrix([[ 1, 2104, 5, 1, 15],
[ 1, 1416, 3, 2, 10],
[ 1, 1534, 3, 2, 5],
[ 1, 852, 2, 1, 7]]),
matrix([[368],
[200],
[280],
[126]]))
带入参数公式:, 解得
1 |
|
matrix([[-5632.],
[ 8.],
[-4096.],
[ 0.],
[ 0.]])
14.6.2 曲线回归分析
曲线回归通常才用代数代换法把非线性形式转换为线性形式处理
14.7 Python 工具包
14.7.2 利用 statsmodels 实现回归分析
例 14.11
设产生 50~个-10~10 的等差数列数作为自变量, 因变量为, 其中为误差项,
1 |
|
回归方程的参数 === [2.98049789 6.02186784 1.99927762]
Dep. Variable: | y | R-squared: | 1.000 |
---|---|---|---|
Model: | OLS | Adj. R-squared: | 1.000 |
Method: | Least Squares | F-statistic: | 2.098e+07 |
Date: | Mon, 25 Jul 2022 | Prob (F-statistic): | 1.44e-140 |
Time: | 15:39:09 | Log-Likelihood: | -64.732 |
No. Observations: | 50 | AIC: | 135.5 |
Df Residuals: | 47 | BIC: | 141.2 |
Df Model: | 2 | ||
Covariance Type: | nonrobust |
coef | std err | t | P>|t| | [0.025 | 0.975] | |
---|---|---|---|---|---|---|
const | 2.9805 | 0.129 | 23.138 | 0.000 | 2.721 | 3.240 |
x1 | 6.0219 | 0.055 | 109.986 | 0.000 | 5.912 | 6.132 |
x2 | 1.9993 | 0.001 | 2486.102 | 0.000 | 1.998 | 2.001 |
Omnibus: | 4.258 | Durbin-Watson: | 1.994 |
---|---|---|---|
Prob(Omnibus): | 0.119 | Jarque-Bera (JB): | 3.257 |
Skew: | 0.437 | Prob(JB): | 0.196 |
Kurtosis: | 3.894 | Cond. No. | 401. |
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
statsmodels 中的 summary 解读(使用 OLS)
14.8 综合分析——个人医疗保费预测服务
保险公司向保险人收取的保险费,必须高于支付给被保险人的保险费才能获利。
以医疗费用为例,通过分析病人的数据,来预测这部分群体的平均医疗费用,为年度保费价格的设定提供参考。
通过不同病人的病人的数据来预测医疗费用,因为因变量是一个连续的值,所以这个问题是一个回归问题。
准备工作:调用相关库
1 |
|
1 获取数据和观察数据
1 |
|
(1338, 7)
1 |
|
Index(['age', 'sex', 'bmi', 'children', 'smoker', 'region', 'charges'], dtype='object')
1 |
|
age | sex | bmi | children | smoker | region | charges | |
---|---|---|---|---|---|---|---|
0 | 19 | female | 27.900 | 0 | yes | southwest | 16884.92400 |
1 | 18 | male | 33.770 | 1 | no | southeast | 1725.55230 |
2 | 28 | male | 33.000 | 3 | no | southeast | 4449.46200 |
3 | 33 | male | 22.705 | 0 | no | northwest | 21984.47061 |
4 | 32 | male | 28.880 | 0 | no | northwest | 3866.85520 |
变量 | 描述 |
---|---|
age | 年龄(不超过 64 岁) |
sex | 性别 |
bmi | 体重(kg)/身高(米)² |
children | 孩子/受抚养者数量 |
smoker | 吸烟情况 |
region | 居住地(美国各地理区域) |
charges | 因变量, 当前数据人上年度保险的额度 |
1 |
|
age int64
sex object
bmi float64
children int64
smoker object
region object
charges float64
dtype: object
1 |
|
age | bmi | children | charges | |
---|---|---|---|---|
count | 1338.000000 | 1338.000000 | 1338.000000 | 1338.000000 |
mean | 39.207025 | 30.663397 | 1.094918 | 13270.422265 |
std | 14.049960 | 6.098187 | 1.205493 | 12110.011237 |
min | 18.000000 | 15.960000 | 0.000000 | 1121.873900 |
25% | 27.000000 | 26.296250 | 0.000000 | 4740.287150 |
50% | 39.000000 | 30.400000 | 1.000000 | 9382.033000 |
75% | 51.000000 | 34.693750 | 2.000000 | 16639.912515 |
max | 64.000000 | 53.130000 | 5.000000 | 63770.428010 |
(1) 缺失值处理
- 若缺失值意义不大, 可以直接删除
如果缺失值有意义:
-
缺失值较少, 可以直接去掉
-
用已有的值的平均值或众数代替缺失值
-
用已知的数据作回归模型, 进行预测, 再用其他特征数据预测缺失值
1 |
|
<AxesSubplot:>
可惜了, 没有缺失值
2 探索数据和准备数据
(2) 特征工程
从原始数据中提取到的特征的好坏直接影响模型的效果, 特征工程就是从原式数据中最大限度地提取特征, 以供机器学习和算法使用
类型 | 提取方法 |
---|---|
数值类型 | 直接使用或进行标准化处理 |
时间序列 | 转化成单独的年月日 |
分类数据 | 使用标签编码(类别只有两个, 如男=1, 女=0)或独热编码(类别超过两个) |
其他类型 | 独热编码 |
标签编码: 使用 map 函数对数据进行重新定义Pandas 中的宝藏函数-map
1 |
|
age | sex | bmi | children | smoker | region | charges | |
---|---|---|---|---|---|---|---|
0 | 19 | 0 | 27.900 | 0 | 1 | southwest | 16884.92400 |
1 | 18 | 1 | 33.770 | 1 | 0 | southeast | 1725.55230 |
2 | 28 | 1 | 33.000 | 3 | 0 | southeast | 4449.46200 |
3 | 33 | 1 | 22.705 | 0 | 0 | northwest | 21984.47061 |
4 | 32 | 1 | 28.880 | 0 | 0 | northwest | 3866.85520 |
1 |
|
region_northeast | region_northwest | region_southeast | region_southwest | |
---|---|---|---|---|
0 | 0 | 0 | 0 | 1 |
1 | 0 | 0 | 1 | 0 |
2 | 0 | 0 | 1 | 0 |
3 | 0 | 1 | 0 | 0 |
4 | 0 | 1 | 0 | 0 |
... | ... | ... | ... | ... |
1333 | 0 | 1 | 0 | 0 |
1334 | 1 | 0 | 0 | 0 |
1335 | 0 | 0 | 1 | 0 |
1336 | 0 | 0 | 0 | 1 |
1337 | 0 | 1 | 0 | 0 |
1338 rows × 4 columns
1 |
|
汇总: (1338, 10)
age | sex | bmi | children | smoker | charges | region_northeast | region_northwest | region_southeast | region_southwest | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 19 | 0 | 27.900 | 0 | 1 | 16884.92400 | 0 | 0 | 0 | 1 |
1 | 18 | 1 | 33.770 | 1 | 0 | 1725.55230 | 0 | 0 | 1 | 0 |
2 | 28 | 1 | 33.000 | 3 | 0 | 4449.46200 | 0 | 0 | 1 | 0 |
3 | 33 | 1 | 22.705 | 0 | 0 | 21984.47061 | 0 | 1 | 0 | 0 |
4 | 32 | 1 | 28.880 | 0 | 0 | 3866.85520 | 0 | 1 | 0 | 0 |
age, bmi, children 为连续型数据, 采用标准化的特征提取
1 |
|
age | sex | bmi | children | smoker | charges | region_northeast | region_northwest | region_southeast | region_southwest | |
---|---|---|---|---|---|---|---|---|---|---|
0 | -1.438764 | 0 | -0.453320 | -0.908614 | 1 | 16884.92400 | 0 | 0 | 0 | 1 |
1 | -1.509965 | 1 | 0.509621 | -0.078767 | 0 | 1725.55230 | 0 | 0 | 1 | 0 |
2 | -0.797954 | 1 | 0.383307 | 1.580926 | 0 | 4449.46200 | 0 | 0 | 1 | 0 |
3 | -0.441948 | 1 | -1.305531 | -0.908614 | 0 | 21984.47061 | 0 | 1 | 0 | 0 |
4 | -0.513149 | 1 | -0.292556 | -0.908614 | 0 | 3866.85520 | 0 | 1 | 0 | 0 |
(3) 特征相关性分析
1 |
|
相关矩阵:
age sex bmi children smoker charges \
age 1.000000 -0.020856 0.109272 0.042469 -0.025019 0.299008
sex -0.020856 1.000000 0.046371 0.017163 0.076185 0.057292
bmi 0.109272 0.046371 1.000000 0.012759 0.003750 0.198341
children 0.042469 0.017163 0.012759 1.000000 0.007673 0.067998
smoker -0.025019 0.076185 0.003750 0.007673 1.000000 0.787251
charges 0.299008 0.057292 0.198341 0.067998 0.787251 1.000000
region_northeast 0.002475 -0.002425 -0.138156 -0.022808 0.002811 0.006349
region_northwest -0.000407 -0.011156 -0.135996 0.024806 -0.036945 -0.039905
region_southeast -0.011642 0.017117 0.270025 -0.023066 0.068498 0.073982
region_southwest 0.010016 -0.004184 -0.006205 0.021914 -0.036945 -0.043210
region_northeast region_northwest region_southeast \
age 0.002475 -0.000407 -0.011642
sex -0.002425 -0.011156 0.017117
bmi -0.138156 -0.135996 0.270025
children -0.022808 0.024806 -0.023066
smoker 0.002811 -0.036945 0.068498
charges 0.006349 -0.039905 0.073982
region_northeast 1.000000 -0.320177 -0.345561
region_northwest -0.320177 1.000000 -0.346265
region_southeast -0.345561 -0.346265 1.000000
region_southwest -0.320177 -0.320829 -0.346265
region_southwest
age 0.010016
sex -0.004184
bmi -0.006205
children 0.021914
smoker -0.036945
charges -0.043210
region_northeast -0.320177
region_northwest -0.320829
region_southeast -0.346265
region_southwest 1.000000
相关矩阵的上三角表示:
age sex bmi children smoker charges \
age 0.0 -0.020856 0.109272 0.042469 -0.025019 0.299008
sex -0.0 0.000000 0.046371 0.017163 0.076185 0.057292
bmi 0.0 0.000000 0.000000 0.012759 0.003750 0.198341
children 0.0 0.000000 0.000000 0.000000 0.007673 0.067998
smoker -0.0 0.000000 0.000000 0.000000 0.000000 0.787251
charges 0.0 0.000000 0.000000 0.000000 0.000000 0.000000
region_northeast 0.0 -0.000000 -0.000000 -0.000000 0.000000 0.000000
region_northwest -0.0 -0.000000 -0.000000 0.000000 -0.000000 -0.000000
region_southeast -0.0 0.000000 0.000000 -0.000000 0.000000 0.000000
region_southwest 0.0 -0.000000 -0.000000 0.000000 -0.000000 -0.000000
region_northeast region_northwest region_southeast \
age 0.002475 -0.000407 -0.011642
sex -0.002425 -0.011156 0.017117
bmi -0.138156 -0.135996 0.270025
children -0.022808 0.024806 -0.023066
smoker 0.002811 -0.036945 0.068498
charges 0.006349 -0.039905 0.073982
region_northeast 0.000000 -0.320177 -0.345561
region_northwest -0.000000 0.000000 -0.346265
region_southeast -0.000000 -0.000000 0.000000
region_southwest -0.000000 -0.000000 -0.000000
region_southwest
age 0.010016
sex -0.004184
bmi -0.006205
children 0.021914
smoker -0.036945
charges -0.043210
region_northeast -0.320177
region_northwest -0.320829
region_southeast -0.346265
region_southwest 0.000000
相关矩阵:
age age 0.000000
sex -0.020856
bmi 0.109272
children 0.042469
smoker -0.025019
...
region_southwest charges -0.000000
region_northeast -0.000000
region_northwest -0.000000
region_southeast -0.000000
region_southwest 0.000000
Length: 100, dtype: float64
第一个变量 | 第二个变量 | 相关性 | |
---|---|---|---|
0 | smoker | charges | 0.787251 |
1 | age | charges | 0.299008 |
2 | bmi | region_southeast | 0.270025 |
3 | bmi | charges | 0.198341 |
4 | age | bmi | 0.109272 |
自变量与因变量 charges 的相关性按降序排列:
1 |
|
charges 1.000000
smoker 0.787251
age 0.299008
bmi 0.198341
region_southeast 0.073982
children 0.067998
sex 0.057292
region_northeast 0.006349
region_northwest -0.039905
region_southwest -0.043210
Name: charges, dtype: float64
(4) 特征选择
选取各个特征相关系数最大的前 6 个特征, 重新构建数据集
1 |
|
smoker | age | bmi | region_southeast | children | sex | charges | |
---|---|---|---|---|---|---|---|
0 | 1 | -1.438764 | -0.453320 | 0 | -0.908614 | 0 | 16884.92400 |
1 | 0 | -1.509965 | 0.509621 | 1 | -0.078767 | 1 | 1725.55230 |
2 | 0 | -0.797954 | 0.383307 | 1 | 1.580926 | 1 | 4449.46200 |
3 | 0 | -0.441948 | -1.305531 | 0 | -0.908614 | 1 | 21984.47061 |
4 | 0 | -0.513149 | -0.292556 | 0 | -0.908614 | 1 | 3866.85520 |
3 建立模型
(1) 分离自变量和因变量
1 |
|
(2) 检查因变量数据是否满足正态分布
1 |
|
###有警告信息###
<AxesSubplot:xlabel='charges', ylabel='Density'>
保险分布的数据右偏(平均数大于中位数)
可以采用取对数, 去平方根的方法将大的数据向左移
1 |
|
###有警告信息###
<AxesSubplot:xlabel='charges', ylabel='Density'>
(3) 划分数据集, 建立训练数据集和测试数据集
1 |
|
训练集 (936, 6),测试集 (402, 6)
(4) 使用线性回归创建模型
1 |
|
最佳拟合线:截距 8.851551231348216
回归系数:[ 1.53318059 0.48875255 0.08953472 -0.07628352 0.1276445 -0.08411224]
4 评估模型
1 |
|
个人医保数据线性回归模型的决定系数即 R 平方为:0.7830070691295015
个人医保数据线性回归模型的平均绝对误差为:0.2707571270860692
个人医保数据线性回归模型的均方误差 MSE 为:0.17131210181347262
个人医保数据线性回归模型的中值绝对误差为:0.14746506518623992
个人医保数据线性回归模型的可解释方差值为:0.7831735070420169
个人医保数据线性回归模型的判定系数即 R 平方为:0.7830070691295015
通过交叉验证来持续优化模型(十折交叉验证)
十折交叉验证,英文名叫做 10-fold cross-validation,用来测试算法准确性。是常用的测试方法。将数据集分成十份,轮流将其中 9 份作为训练数据,1 份作为测试数据,进行试验。
1 |
|
最佳拟合线:截距 8.851551231348216
回归系数:[ 1.53318059 0.48875255 0.08953472 -0.07628352 0.1276445 -0.08411224]
个人医保数据线性回归模型的平均绝对误差为:0.28154076344034734
个人医保数据线性回归模型的均方误差 MSE 为:0.20010936615767003
个人医保数据线性回归模型的中值绝对误差为:0.13490158250103956
个人医保数据线性回归模型的可解释方差值为:0.7630797649634316
个人医保数据线性回归模型的判定系数即 R 平方为:0.7630793987615034
14.9 高手点拨
解析法 | 梯度下降法 |
---|---|
要求必须可逆 | 不要求可逆 |
求的逆费时较多, 当特征较多时运算很慢 | 特征较多时运算不会特别慢 |
不需要特征缩放 | 需要特征缩放 |
只需计算一次就能求解 | 需要多次迭代 |
不需要选择学习步长 | 需要选择学习步长 |
对于更复杂的问题可能求不出解 | 可用于更复杂的问题, 可移植性强 |
具体地说, 只要特征变量的数量小于 10000, 通常会使用解析法, 而不是梯度下降法