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

    技术2022-07-13  69

    目录

     

    岭回归

    原理

    缩减系数来“理解”数据

    优点

    总结

    小结

    应用场景

    代码实现

    导包

    样本小于特征,无数个解

    打乱索引

    矩阵乘法

    比较三种算法

    计算斜率

    岭回归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应该选绿色的部分,比较平缓的降低。特征比较多,样本量少的时候,用岭回归。

     

    Processed: 0.010, SQL: 9