zoukankan      html  css  js  c++  java
  • 岭回归与Lasso回归模型

    由于计算一般线性回归的时候,其计算方法是: p = (X’* X)**(-1) * X’ * y 很多时候 矩阵(X’* X)是不可逆的,所以回归系数p也就无法求解,
    需要转换思路和方法求解:加2范数的最小二乘拟合(岭回归)

    岭回归模型的系数表达式: p = (X’ * X )**(-1) *X’ *y

    如何实现岭回归:

    from sklearn.linear_model import Ridge,RidgeCV


    Ridge用于构建岭回归模型、RidgeCV用于交叉验证求解Ridge回归模型的最佳参数。

    岭回归解决了线性回归中矩阵X’X不可逆的问题,即添加l2正则的惩罚项,就是第2范数,最终导致模型回归系数的缩减,会保留所有变量,无法降低模型的复杂度。
    为此:引入了Lasso回归;
    目标函数: 

    J§ = ((y-Xp)**2).sum() + lambda ||p||1 = ((y-Xp)**2).sum() + (lambda*abs§).sum()


    lambda为惩罚项系数 ; ||p||1 表示所有回归系数绝对值的和。
    实现Lasso:

    from sklearn.linear_model import Lasso,LassoCV


    LassoCV用于实现Lasso的交叉验证,通常用于求解最佳参数。Lasso用于构建Lasso回归模型。
    Lasso回归与岭回归都是用于回归预测问题:

    Lasso回归的简单应用:

    数据集:糖尿病数据集,1个因变量、10个自变量;因变量含义:糖尿病指数,值越小说明糖尿病的治疗效果越好。

    from sklearn.linear_model import Lasso,LassoCV
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    from sklearn import model_selection

    读取数据:

    # 读取糖尿病数据集
    diabetes = pd.read_excel(r'diabetes.xlsx', sep = '')
    # 构造自变量(剔除患者性别、年龄和因变量)
    predictors = diabetes.columns[2:-1]
    # 将数据集拆分为训练集和测试集
    X_train, X_test, y_train, y_test = model_selection.train_test_split(diabetes[predictors], diabetes['Y'], test_size = 0.2, random_state = 1234 )

    寻找最佳lambda值所在的大概范围(如何都不合适则需要重新定义Lambdas):

    # 构造不同的Lambda值
    Lambdas = np.logspace(-5, 2, 200)
    # 构造空列表,用于存储模型的偏回归系数
    lasso_cofficients = []
    
    for Lambda in Lambdas:
        lasso = Lasso(alpha = Lambda, normalize=True, max_iter=10000)
        lasso.fit(X_train, y_train)
        lasso_cofficients.append(lasso.coef_)
        
    # 绘制Lambda与回归系数的关系
    plt.plot(Lambdas, lasso_cofficients)
    
    # 对x轴作对数变换
    plt.xscale('log')
    # 设置折线图x轴和y轴标签
    plt.xlabel('Lambda')
    plt.ylabel('Cofficients')
    
    # 显示图形
    plt.show()

    基于交叉验证找出最佳lambda值:

    # LASSO回归模型的交叉验证
    lasso_cv = LassoCV(alphas = Lambdas, normalize=True, cv = 10, max_iter=10000)
    lasso_cv.fit(X_train, y_train)
    
    # 输出最佳的lambda值
    lasso_best_alpha = lasso_cv.alpha_
    lasso_best_alpha

    基于最佳参数进行建模:

    from sklearn.metrics import mean_squared_error
    # 基于最佳的lambda值建模
    lasso = Lasso(alpha = lasso_best_alpha, normalize=True, max_iter=10000)
    lasso.fit(X_train, y_train)
    
    # 返回LASSO回归的系数
    pd.Series(index = ['Intercept'] + X_train.columns.tolist(),data = [lasso.intercept_] + lasso.coef_.tolist())

    使用模型进行预测:

    # 预测
    lasso_predict = lasso.predict(X_test)
    print(lasso_predict)
    # 预测效果验证
    RMSE = np.sqrt(mean_squared_error(y_test,lasso_predict))
    RMSE

    RMSE得到是:53.0487…
    我使用线性回归得到是53.4…,岭回归的是,53.12…相对于线性回归以及岭回归来说,还行。
    希望大家给予意见和建议。谢谢。

  • 相关阅读:
    github fork项目后,代码更新
    UIScrollView的用法,属性
    调整屏幕亮度,调整字体大小
    iOS UIFont 字体名字大全
    ios 6以后,UILabel全属性
    oc中的各种遍历(迭代)方法
    判断app是否是第一次启动
    ios 显示代码块(show the code snippet library)
    ios 添加动画的方法
    添加app第一次启动页面
  • 原文地址:https://www.cnblogs.com/chenruhai/p/12464207.html
Copyright © 2011-2022 走看看