问题:特征和目标向量之间的线性关系的模型
scikit-learn
库
# 加载库
from sklearn.linear_model import LinearRegression
from sklearn.datasets import fetch_california_housing
# 加载加州房价
housing = fetch_california_housing()
features = housing.data[:,0:2]
target = housing.target
# 创建线性回归模型
regression = LinearRegression()
# 在线性模型中获取均值和方差
model = regression.fit(features, target)
# 查看差值
print(model.intercept_)
# 查看系数集合
print(model.coef_)
# 进行预测
print(model.predict(features)[0])
线性回归假设特征和目标向量之间的关系是近似线性的。 也就是说,特征对目标向量的影响(也称为系数、权重或参数)是恒定的。 在我们的解决方案中,为了解释起见,我们只使用两个特征训练了我们的模型。 这意味着我们的线性模型将是:
y ^ = β ^ 0 + β ^ 1 x 1 + β ^ 2 x 2 + ϵ \hat y =\hat \beta_0 +\hat \beta_1 x_1 + \hat \beta_2 x_2 + \epsilon y^=β^0+β^1x1+β^2x2+ϵ
其中 ŷ 是我们的目标,xi 是单个特征的数据,是通过拟合模型确定的系数, ϵ \epsilon ϵ是误差。 拟合模型后,我们可以查看每个参数的值。偏差或截距,可以使用intercept_ 查看
β ^ i \hat \beta_i β^i可以通过_coef查看
# 查看差值
print(model.intercept_)
# 查看系数集合
print(model.coef_)
# 进行预测
print(model.predict(features)[0])
优点:可解释性
1、模型公式: y ^ = X ω \hat y = X\omega y^=Xω
2、损失函数: Σ i = 1 m ( y i − y ^ i ) 2 \Sigma^m_{i=1}(y_i-\hat y_i)^2 Σi=1m(yi−y^i)2(SSE)
3、模型目标: m i n a r g ω ∣ ∣ y − X ω ∣ ∣ 2 min_{arg\ \omega} || y- X\omega||^2 minarg ω∣∣y−Xω∣∣2
4、矩阵求导: ∂ R S S ∂ ω = ∂ ( y − X ω ) T ( y − X ω ) ∂ ω = ∂ ( y T − ω T X T ) ( y − X ω ) ∂ ω = ∂ ( y T y − y T X ω − ω T X T y + ω T X T X ω ) ∂ ω = 0 − X T y − X T y + 2 X T X ω = 2 ( X T X ω − X T y ) = 0 \frac{\partial RSS}{\partial \omega}\\ =\frac{\partial(y-X\omega)^T(y-X\omega)}{\partial \omega} \\ =\frac{\partial (y^T-\omega ^TX^T)(y-X\omega)}{\partial \omega} \\=\frac{\partial (y^Ty-y^TX\omega -\omega^TX^Ty+\omega^TX^TX\omega)}{\partial \omega}\\ =0 - X^Ty-X^Ty +2X^TX\omega \\= 2(X^TX\omega -X^Ty) = 0 ∂ω∂RSS=∂ω∂(y−Xω)T(y−Xω)=∂ω∂(yT−ωTXT)(y−Xω)=∂ω∂(yTy−yTXω−ωTXTy+ωTXTXω)=0−XTy−XTy+2XTXω=2(XTXω−XTy)=0
ps.在求导处使用了如下规则:
5、 解方程:
X T X ω − X T y = 0 = > ω = ( X T X ) − 1 X T y X^TX\omega -X^Ty = 0 => \omega = (X^TX)^{-1}X^Ty XTXω−XTy=0=>ω=(XTX)−1XTy
前提是 X T X X^TX XTX可逆
# 加载库
from sklearn.linear_model import LinearRegression
from sklearn.datasets import fetch_california_housing
from sklearn.preprocessing import PolynomialFeatures
# 加载加州房价
housing = fetch_california_housing()
features = housing.data[:, 0:2]
target = housing.target
# 创建交互项
interaction = PolynomialFeatures(
degree=3, include_bias=False, interaction_only=True)
features_interaction = interaction.fit_transform(features)
# 创建线性回归模型
regression = LinearRegression()
# Fit the linear regression
model = regression.fit(features_interaction, target)
y ^ = β ^ 0 + β ^ 1 x 1 + β ^ 2 x 2 + β ^ 3 x 1 x 2 + ϵ \hat y = \hat \beta_0 + \hat \beta_1x_1 + \hat\beta_2x_2+\hat\beta_3x_1x_2+\epsilon y^=β^0+β^1x1+β^2x2+β^3x1x2+ϵ
在这里 β ^ 3 x 1 x 2 \hat\beta_3x_1x_2 β^3x1x2就是新添加的交互项
我们一般用两个特征相乘来表达交叉项
PolynomialFeatures()可以创建交叉项
三个重要参数:
# 加载库
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.datasets import fetch_california_housing
# 加载加州房价
housing = fetch_california_housing()
features = housing.data[:,0:2]
target = housing.target
# 多项式 x^2 and x^3
polynomial = PolynomialFeatures(degree=3, include_bias=False)
features_polynomial = polynomial.fit_transform(features)
# 创建线性关系
regression = LinearRegression()
# 拟合线性关系
model = regression.fit(features_polynomial, target)
减少线性模型的方差
Use a learning algorithm that includes a shrinkage penalty (also called regularization) like ridge regression and lasso regression(使用包含收缩惩罚(正则化)的算法,如岭回归
和套索回归
)
shrinkage_penalty.py
# Load libraries
from sklearn.linear_model import Ridge
from sklearn.datasets import fetch_california_housing
from sklearn.preprocessing import StandardScaler
# 加利福尼亚房价数据集
housing = fetch_california_housing()
features = housing.data
target = housing.target
# 标准化
scaler = StandardScaler()
features_standardized = scaler.fit_transform(features)
# 岭回归
regression = Ridge(alpha=0.5)
# 适用模型
model = regression.fit(features_standardized, target)
传统线性模型的Loss函数:残差平方和: R S S = Σ i = 1 n ( y i − y ^ i ) 2 RSS=\Sigma_{i=1}^{n}(y_i-\hat y_i)^2 RSS=Σi=1n(yi−y^i)2
收缩惩罚(正则化)学习模型的损失函数与RSS相似,但是希望线性模型的系数可以尽可能的少。收缩惩罚的名称表示希望将模型缩小
有两种常用的正则化相信模型:岭回归和lasso回归。它们唯一的不同就是正则项的不同:
Ridge regression的损失函数: R S S + α Σ j = 1 p β ^ j 2 RSS + \alpha\Sigma_{j=1}^p \hat\beta_j^2 RSS+αΣj=1pβ^j2
β ^ j \hat\beta_j β^j是线性模型每一个变量前面的系数
Lasso regression的损失函数: 1 2 n R S S + α Σ j = 1 p ∣ β ^ j ∣ \frac{1}{2n}RSS+\alpha\Sigma_{j=1}^p|\hat\beta_j| 2n1RSS+αΣj=1p∣β^j∣
n是observation样本的数量
β ^ j \hat\beta_j β^j是线性模型每一个变量前面的系数
使用什么模型呢?
对于超参数 α \alpha α,决定了正则项的权重,在scikit包中,作为alpha参数输入模型中
我们可以使用scikit-learn中的RigerCV
使用交叉检验法把 α \alpha α作为参数进行训练
# Load library
from sklearn.linear_model import RidgeCV
# 创建一系列的alpha参数,使用交叉检验法进行比较
regr_cv = RidgeCV(alphas=[0.1, 1.0, 10.0])
# 拟合模型
model_cv = regr_cv.fit(features_standardized, target)
# 查看结果
print(model_cv.coef_)
print(model_cv.alpha_)
lasso_regression.py
# 加载python库
from sklearn.linear_model import Lasso
from sklearn.datasets import fetch_california_housing
from sklearn.preprocessing import StandardScaler
# 加利福尼亚房价数据集
housing = fetch_california_housing()
features = housing.data
target = housing.target
# 标准化数据
scaler = StandardScaler()
features_standardized = scaler.fit_transform(features)
# Create lasso regression with alpha value
regression = Lasso(alpha=0.5)
# Fit the linear regression
model = regression.fit(features_standardized, target)