Python 线性回归

1 声明

本文的数据来自网络,部分代码也有所参照,这里做了注释和延伸,旨在技术交流,如有冒犯之处请联系博主及时处理。

2 线性回归简介

相关概念见下:

如果想通过一个模型找到目标变量和特征的线性关系就用到线性回归(在房价的预测的场景中假设拿到地段、面积、学区、建筑时间等特征后,通过训练线性回归模型,进而可对的新数据进行预测)。线性回归假设特征与目标变量存在线性关系,换言之这种影响(系数或参数,神经网络里又叫权重)是常量。这里是概率统计里的应用,下面以二元回归作为里例子,演示其原理。

Python 线性回归_拟合

这里 Python 线性回归_python线性回归_02是目标变量, Python 线性回归_线性回归_03是每个特征,

Python 线性回归_岭回归_04

Python 线性回归_拟合_05是x1和x2的系数。 Python 线性回归_python线性回归_06是截距,Python 线性回归_线性回归_07 是误差。更普通的方式可以矩阵的形式表达 Y=Xβ+ε,一般使用最小二乘法拟合得系数的解为

Python 线性回归_岭回归_08

详细证明见:​​最小二乘法(多元)推导​​

相关统计量

Python 线性回归_拟合_09

详见:​​Excel一元线性回归示例​​

交互项(Interactive Term):当特征间有相互作用时可以使用交互项,表现形式见下:

Python 线性回归_线性回归_10

正则化:

为了解决过拟合、方差较高的问题,需要对线性回归模型进行正则化(收缩惩罚即RSS和系数更小),一般用L1(LaSSO)、L2(岭回归)法。

Python 线性回归_拟合_11

这里的RSS对应前文的SSE即残差平方和,线性回归模型的目的就是使得RSS最小。

其中岭回归里通过如下方式添加惩罚项(α乘以系数的平方和,α是超参数):

Python 线性回归_线性回归_12

LASSO正则化(α乘以系数绝对值的和,α是超参数,n是样本数):

Python 线性回归_拟合_13

3 线性回归代码示例

# 加载相关包:标准化、线性回归、特征构造
# Scenario 1 普通线性回归
from sklearn.linear_model import LinearRegression,Ridge
from sklearn.datasets import load_boston
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler

# 加载波士顿房价数据并指定特征和目标变量
boston = load_boston()
features = boston.data[:,0:2]
target = boston.target
# 创建并拟合线性回归模型
regression = LinearRegression()

model1 = regression.fit(features, target)

# 查看截距
print(model1.intercept_)
# 查看系数β1、β2
print(model1.coef_)


# Scenario 2 带交互项的线性回归
# 通过PolynomialFeatures创建交互项
interaction = PolynomialFeatures(
degree=3, include_bias=False, interaction_only=True)
features_interaction = interaction.fit_transform(features)

# 创建并拟合线性回归模型
regression = LinearRegression()
model2 = regression.fit(features_interaction, target)
# 验证样本交互项X1*X2
print(features_interaction[0])
# 查看带交互项的系数
print(model2.coef_)

# Scenario 3 正则化之岭回归
# 标准化数据,即特征都在同一量纲上(无量纲)
scaler = StandardScaler()
features_standardized = scaler.fit_transform(features)

# 创建带α的岭回归并拟合
regression = Ridge(alpha=0.5)
model3 = regression.fit(features_standardized, target)


# 评价指标R2(仅演示如何使用)
from sklearn.metrics import r2_score
print('R^2 train: %.3f' % r2_score(target, model1.predict(features)))

Python 线性回归_岭回归_14

4 总结