线性回归,岭回归,套索回归等等

本文深入解析岭回归原理,探讨其在解决过拟合、多重共线性及特征选择方面的作用,通过对比线性回归、Lasso回归,展示岭回归在样本量少于特征数时的优势,并提供详细的代码实现。

目录

 

岭回归

原理

缩减系数来“理解”数据

优点

总结

小结

应用场景

代码实现

导包

样本小于特征,无数个解

打乱索引

矩阵乘法

比较三种算法

计算斜率

岭回归alpha最优化

导包

设X矩阵

设y

岭回归拟合

画图表示 alpha和coefs的关系


岭回归

原理

缩减系数来“理解”数据

优点

缩减方法可以去掉不重要的参数,因此能更好地理解数据。此外,与简单的线性回归相比,缩减法能取得更好的预测效果

岭回归是加了二阶正则项的最小二乘,主要适用于过拟合严重或各变量之间存在多重共线性的时候,岭回归是有bias的,这里的bias是为了让variance更小。

为了得到一致假设而使假设变得过度严格称为过拟合,bias:指的是模型在样本上的输出与真实值的误差;variance:指的是每个模型的输出结果与所有模型平均值(期望)之间的误差。

总结

小结

1.岭回归可以解决特征数量比样本量多的问题,2.岭回归作为一种缩减算法可以判断哪些特征重要或者不重要,有点类似于降维的效果,3.缩减算法可以看作是对一个模型增加偏差的同时减少方差。

应用场景

1.数据点少于变量个数,2.变量间存在共线性(最小二乘回归得到的系数不稳定,方差很大),3.应用场景就是处理高度相关的数据。

代码实现

导包

# LinearRegression,Ridge,Lasso

import numpy as np

from sklearn.linear_model import LinearRegression,Ridge,Lasso,RidgeCV,LassoCV

import matplotlib.pyplot as plt
%matplotlib inline

样本小于特征,无数个解

# 50样本,200特征
# 无解:无数个解
X = np.random.randn(50,200)

w = np.random.randn(200)#系数
w

打乱索引


index = np.arange(0,200)
np.random.shuffle(index)#顺序打乱
index

将其中的190个置为0

w[index[:190]] = 0
w

矩阵乘法

y = X.dot(w)
y#50个

比较三种算法

#不计算截距
linear = LinearRegression(fit_intercept=False)

ridge = RidgeCV(alphas = [0.001,0.01,0.1,1,2,5,10,20,50,100],cv = 5,fit_intercept=False)#交叉验证找最佳的系数alpha

lasso = LassoCV(alphas=[0.001,0.01,0.1,1,2,5,10],cv = 3,fit_intercept=False)#交叉验证找最佳的系数alpha



linear.fit(X,y)

ridge.fit(X,y)

lasso.fit(X,y)

计算斜率

linear_w = linear.coef_

ridge_w = ridge.coef_

lasso_w = lasso.coef_
plt.figure(figsize=(12,9))
axes = plt.subplot(2,2,1)
axes.plot(w)

axes = plt.subplot(2,2,2)
axes.plot(linear_w)
axes.set_title('Linear')

axes = plt.subplot(2,2,3)
axes.plot(ridge_w)
axes.set_title('Ridge')

axes = plt.subplot(2,2,4)
axes.plot(lasso_w)
axes.set_title('Lasso')

岭回归可以让模型更简单。套索回归擅长样本少于属性,解稀松。

岭回归alpha最优化

导包

import numpy as np

import matplotlib.pyplot as plt
%matplotlib inline

from sklearn.linear_model import Ridge

设X矩阵

X = 1/(np.arange(1,11) + np.arange(0,10).reshape(-1,1))
X

 

设y

y = np.ones(10)
y

岭回归拟合

ridge = Ridge(fit_intercept=False)#让截距等于0

alphas = np.logspace(start = -10,stop = -2,num = 200)#logspace等比数列,比linespace划分的更加细腻

coefs = []#斜率

for a in alphas:
    ridge.set_params(alpha = a)
    
    ridge.fit(X,y)
    
    coefs.append(ridge.coef_)

coefs
    

画图表示 alpha和coefs的关系

# 结论:找图中平滑的区域作为alpha值(参考)
_ = plt.plot(alphas,coefs) 
plt.xscale('log')#缩放 log形式
plt.ylabel('coef',fontsize = 25,color = 'red',rotation = 0)
plt.xlabel('alpha',fontsize = 25)

 

alpha越大,就越起收缩的作用。

选alpha应该选绿色的部分,比较平缓的降低。特征比较多,样本量少的时候,用岭回归。

 

### 线性回归岭回归套索回归的区别 #### 定义与基本原理 线性回归是一种基础的监督学习算法,用于建立因变量 \(y\) 和自变量 \(X\) 的线性关系。其核心目标是最小化残差平方和 (RSS),即 \(\sum(y_i - \hat{y}_i)^2\)[^1]。 然而,在实际应用中,当数据存在多重共线性或多维特征时,普通的线性回归可能会过拟合训练集。为了缓解这一问题,引入了正则化的变体——岭回归套索回归。 - **岭回归**通过向损失函数加入 L2 正则项来约束权重参数的大小,防止它们变得过大。具体形式为:\(J(w) = RSS + \alpha ||w||_2^2\),其中 \(\alpha\) 是正则化强度超参数[^2]。 - **套索回归**采用的是 L1 正则项,使得部分系数可能被压缩至零,从而实现自动特征选择的功能。其优化目标可表示为:\(J(w) = RSS + \alpha ||w||_1\)。 两种方法的主要区别在于如何处理冗余特征以及对稀疏性的偏好程度不同。Lasso 更倾向于构建简洁模型;而 Ridge 则更注重整体性能提升而非剔除无关紧要的因素。 --- ### 实战案例分析 以下是几个典型的实战场景及其适用情况: #### 场景一:房价预测 假设我们要基于房屋面积、房间数量等多个因素预测房产价格,则可以选择上述三种技术分别建模比较效果优劣度。如果发现某些输入维度之间高度相关联(比如卧室数与浴室数目),那么运用带惩罚机制版本会更加合适一些因为这样能够有效抑制这些关联带来的负面影响。 #### 场景二:基因表达数据分析 对于高通量测序产生的海量生物标志物测量值而言,由于样本规模通常远小于特征总数,因此非常适合利用lasso来进行降维操作以便找出真正有意义的关键驱动因子作为后续研究对象。 #### Python代码示例 下面提供一段简单的Python脚本演示这几种回归方式的应用过程: ```python from sklearn.linear_model import LinearRegression, Ridge, Lasso import numpy as np # 构造模拟数据集 np.random.seed(0) X = np.random.rand(100, 5) * 10 true_coef = [3., -2., 0., 1., 0.] # 只有前三个特征重要 noise = np.random.randn(100) * 2. y = X @ true_coef + noise # 训练不同的回归器 lr = LinearRegression().fit(X, y) ridge = Ridge(alpha=1).fit(X, y) lasso = Lasso(alpha=0.1).fit(X, y) print("Linear Regression Coefficients:", lr.coef_) print("Ridge Regression Coefficients:", ridge.coef_) print("Lasso Regression Coefficients:", lasso.coef_) ``` 此程序片段展示了如何初始化并适应各种类型的估计器到给定的数据上,并打印各自得出的结果以供观察对比之用。 --- ### 总结 综上所述,虽然三者都属于广义上的线性模型范畴之内,但由于采用了不同程度及方向上的调整策略,所以最终呈现出的效果各有千秋。在面对特定业务需求的时候可以根据实际情况灵活选用最恰当的那个选项即可获得最佳解决方案[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值