机器学习之广义线性模型(一)

本文详细介绍了线性模型的各种形式,包括普通最小二乘法、岭回归、Lasso等,并通过Python代码实例展示了如何使用这些模型进行数据拟合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.1 广义线性模型

1.1.1 普通最小二乘法

最小二乘法很经常用在线性回归Linear Regression, y^=Xw+b y ^ = X w + b 中,LR是用来拟合一个

w=(w1,w2,w3,...) w = ( w 1 , w 2 , w 3 , . . . )
的线性模型,而最小二乘法在其中的作用是用来计算预测值和实际值之间的残差平法和,并且使其最小,其中loss function为:
J(w,b)=12mmi=1(y^(i)y(i))2 J ( w , b ) = 1 2 m ∑ i = 1 m ( y ^ ( i ) − y ( i ) ) 2

然后再在梯度下降法Gradient Descent Optimization对系数w进行优化:
Jwj=1mmi=1(y^(i)y(i))x(i)j ∂ J ∂ w j = 1 m ∑ i = 1 m ( y ^ ( i ) − y ( i ) ) x j ( i )

Jb=1mmi=1(y^(i)y(i)) ∂ J ∂ b = 1 m ∑ i = 1 m ( y ^ ( i ) − y ( i ) )
说明:
y^(i)i y ^ ( i ) 表 示 第 i 个 样 本 的 预 测 值
y(i)i y ( i ) 表 示 第 i 个 样 本 的 真 实 值
x(i)j x j ( i ) 指的是第i个样本的第j个特征的值。

from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score  # 模型评价指标
import matplotlib.pyplot as plt
import numpy as np

# 生成500个点数据
X = 2 * np.random.rand(500, 1)
y = 5 + 3 * X + np.random.randn(500, 1)

plt.scatter(X, y)
plt.title("Dataset")
plt.xlabel('X')
plt.ylabel('y')
plt.show()
# 下面使用Sklearn中的线性回归模型进行拟合
lr = LinearRegression()
lr.fit(X, y)

# 再使用这个模型进行数据的预测
y_pred = lr.predict(X)
# 输出这个模型拟合的系数
print('The cofficients of lr is : ', lr.coef_)
# 计算mean squared error
print('The mse of the training sets is : ', mean_squared_error(y_true=y, y_pred=y_pred))

# 将模型拟合的图画出来
plt.scatter(X ,y, color='orange')
plt.plot(X, y_pred, color='red', linewidth=1)   # 拟合直线
plt.xticks([])
plt.yticks([])

plt.show()

这里写图片描述
由图可知,拟合的直线正好符合散点图的趋向

1.1.2 岭回归Ridge Regression

岭回归是线性回归的一个改善的版本,对系数施加L2正则:

minwXwy22+αw22 m i n w ∣∣ X w − y ∣ ∣ 2 2 + α ∣∣ w ∣ ∣ 2 2

其中α>=0, 是控制系数的收缩量的发杂性参数,α值越大,收缩量也就越大。
梯度下降在Ridge上的运用就不再做详细的推导,同学们可以按照上面的Linear Regression的推导进行练习,不难的。

from sklearn.linear_model import Ridge

## 引用上面的数据
ridge = Ridge(alpha=0.5)
ridge.fit(X, y)
# 再使用这个模型进行数据的预测
y_pred = ridge.predict(X)
# 输出这个模型拟合的系数
print('The cofficients of lr is : ', ridge.coef_)
# 计算mean squared error
print('The mse of the training sets is : ', mean_squared_error(y_true=y, y_pred=y_pred))

# 将模型拟合的图画出来
plt.scatter(X ,y, color='orange')
plt.plot(X, y_pred, color='red', linewidth=1)   # 拟合直线
plt.xticks([])
plt.yticks([])

plt.show()

在小型的数据集上,可能与无正则项的Linear Regression相差不大,但是加入正则项是可以是模型更加的鲁棒。

添加Cross Validation找出更加优秀的alpha系数。

# 我们还可以为岭回归添加交叉性验证
from sklearn.linear_model import RidgeCV

rid_cv = RidgeCV()   # alpha=(0.1, 1.0, 10.0)  # 通过cv找到更好的alpha系数
rid_cv.fit(X, y)
# 再使用这个模型进行数据的预测
y_pred = rid_cv.predict(X)
# 输出这个模型拟合的系数
print('The cofficients of lr is : ', rid_cv.coef_)
# 计算mean squared error
print('The mse of the training sets is : ', mean_squared_error(y_true=y, y_pred=y_pred))

1.1.3 Lasso

Lasso也是线性回归的一个改善模型,不过这个是加入了L1正则项,以获得稀疏解:

minwXwy22+αw1 m i n w ∣∣ X w − y ∣ ∣ 2 2 + α ∣∣ w ∣ ∣ 1

from sklearn.linear_model import Lasso
reg = Lasso(alpha=0.1)
reg.fit(X, y)
# 再使用这个模型进行数据的预测
y_pred = reg.predict(X)
# 输出这个模型拟合的系数
print('The cofficients of lr is : ', reg.coef_)
# 计算mean squared error
print('The mse of the training sets is : ', mean_squared_error(y_true=y, y_pred=y_pred))

本人github,欢迎star/follow:https://github.com/Gary-Deeplearning/sklearn-study-note
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值