python之sklearn-分类算法-3.3 线性回归的改进-岭回归

一,带有L2正则化的线性回归-岭回归

岭回归,其实也是一种线性回归。只不过在算法建立回归方程时候,加上正则化的限制,从而达到解决过拟合的效果。

二,API

  • sklearn.linear_model.Ridge(alpha=1.0)
    • 具有l2正则化的线性回归
    • alpha:正则化力度,也叫 λ
      • λ取值:0~1 1~10
    • coef_:回归系数
  • sklearn.linear_model.RidgeCV(_BaseRidgeCV, RegressorMixin)
    • 具有l2正则化的线性回归,可以进行交叉验证
    • coef_:回归系数
class _BaseRidgeCV(LinearModel):
    def __init__(self, alphas=(0.1, 1.0, 10.0),
                 fit_intercept=True, normalize=False, scoring=None,
                 cv=None, gcv_mode=None,
                 store_cv_values=False):

三,正则化对于权重参数的影响

在这里插入图片描述

  • 正则化力度越大,权重系数会越小
  • 正则化力度越小,权重系数会越大

四,波士顿房价预测实例

rd = Ridge(alpha=1.0)

rd.fit(x_train, y_train)
print("岭回归的权重参数为:", rd.coef_)

y_rd_predict = std_y.inverse_transform(rd.predict(x_test))

print("岭回归的预测的结果为:", y_rd_predict)
print("岭回归的均方误差为:", mean_squared_error(y_test, y_rd_predict))
from sklearn.linear_model import LinearRegression,SGDRegressor
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
from sklearn.linear_model import Ridge
def mylinearregression():
    """线性回归预测房子价格"""
    lb = load_boston()
    # print(lb.data)
    # print(lb.target)

    # # 对数据集进行划分
    x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.3, random_state=24)

    # 需要做标准化处理对于特征值处理
    std = StandardScaler()

    # 需要做标准化处理对于特征值处理
    x_train = std.fit_transform(x_train)
    x_test = std.fit_transform(x_test)

    # 1,使用线性模型进行预测 ---正规方程求解
    lr = LinearRegression(fit_intercept=True)

    # fit之后已经得出参数结果
    lr.fit(x_train, y_train)
    print("正规方程计算出的权重:",lr.coef_)
    print("正规方程计算出的偏置:", lr.intercept_)

    # 使用predict来预测测试集结果
    y_lr_predict = lr.predict(x_test)
    print("正规方程预测的结果为:", y_lr_predict)

    # 调用均方误差去评估LinearRegression的结果误差如何
    error = mean_squared_error(y_test,y_lr_predict)
    print("正规方程的均方误差为:", error)

    # 2,使用线性模型进行预测 ---梯度下降进行预测
    # sgd = SGDRegressor(loss="squared_loss",fit_intercept=True,learning_rate="invscaling")
    sgd = SGDRegressor(loss="squared_loss", fit_intercept=True, learning_rate="constant", eta0=0.001)
    # 使用fit训练梯度下降模型
    sgd.fit(x_train, y_train)

    print("梯度下降计算出的权重:",sgd.coef_)
    print("梯度下降计算出的偏置:", sgd.intercept_)

    # 使用predict来预测测试集结果
    y_sgd_predict = sgd.predict(x_test)
    print("梯度下降预测的结果为:", y_sgd_predict)

    # 调用均方误差去评估SGDRegressor的结果误差如何
    sgd_error = mean_squared_error(y_test,y_sgd_predict)
    print("梯度下降的均方误差为:", sgd_error)

    # 3,使用线性模型进行预测 ---L2正则化(岭回归)进行预测
    rd = Ridge(alpha=1.0)

    # 使用fit训练岭回归模型
    rd.fit(x_test,y_test)
    print("岭回归计算出的权重:",rd.coef_)
    print("岭回归计算出的偏置:", rd.intercept_)

    # 使用predict来预测测试集结果
    y_rd_predict = rd.predict(x_test)
    print("岭回归预测的结果为:", y_rd_predict)

    # 调用均方误差去评估SGDRegressor的结果误差如何
    rd_error = mean_squared_error(y_test,y_rd_predict)
    print("岭回归的均方误差为:", rd_error)
    return None

if __name__ == "__main__":
    mylinearregression()

猜你喜欢

转载自blog.csdn.net/TFATS/article/details/108258045