• 【线性回归、岭回归、Lasso回归分别预测患者糖尿病病情】数据挖掘实验一


    Ⅰ、项目任务要求

    • 任务描述:将“diabetes”糖尿病患者数据集划分为训练集和测试集,利用训练集分别结合线性回归、岭回归、Lasso回归建立预测模型,再利用测试集来预测糖尿病患者病情并验证预测模型的拟合能力。
    • 具体任务要求如下:
      • 搜集并加载“diabetes”患者糖尿病指数数据集。
      • 定义训练集和测试集(训练集和测试集比例分别为8:2;7:3;6:4)。
      • 建立线性回归模型。
      • 分别利用可视化方法和交叉验证法确定惩罚参数λ并建立岭回归模型。
      • 分别利用可视化方法和交叉验证法确定惩罚参数λ并建立Lasso回归模型。
      • 分别用岭回归模型和Lasso回归模型通过测试集预测患者糖尿病病情。
      • 利用最小平均均方误差来评估上述三个预测模型的拟合能力。
      • 结果分析(上述三种预测模型的对比分析),建议图表结合说明并写出预测模型方程。

    参考资料网址:

    II、数据集描述(10)

    。。。。。。(详细描述数据集:如特征属性名称及意义、记录数等)

    III、主要算法原理及模型评价方法陈述(15分)

    。。。。。。(写出项目中涉及的主要算法原理及模型评价方法)

    IV、代码实现(45分)

    import matplotlib.pyplot as plt
    import numpy as np
    from sklearn import datasets, linear_model, model_selection
    
    
    # from sklearn import datasets, linear_model, discriminant_analysis, model_selection
    
    # todo: 查看数据(训练集:X_train, y_train; 测试集X_test, y_test)
    def check_data():
        with open("data/X_train.txt", "w") as file:
            for i in range(len(X_train)):
                file.write(f"【样本{i+1}】:{X_train[i]}\n")
        with open("data/y_train.txt", "w") as file:
            for i in range(len(y_train)):
                file.write(f"【样本{i+1}】:{y_train[i]}\n")
        with open("data/X_test.txt", "w") as file:
            for i in range(len(X_test)):
                file.write(f"【样本{i+1}】:{X_test[i]}\n")
        with open("data/y_test.txt", "w") as file:
            for i in range(len(y_test)):
                file.write(f"【样本{i+1}】:{y_test[i]}\n")
    
    # todo: 可视化展示
    def show_plot(alphas, scores):
        figure = plt.figure()
        ax = figure.add_subplot(1, 1, 1)
        ax.plot(alphas, scores)
        ax.set_xlabel(r"$\alpha$")
        ax.set_ylabel(r"score")
        ax.set_xscale("log")
        ax.set_title("Ridge")
        plt.show()
    
    
    # Todo: 加载数据
    # 加载糖尿病数据集
    diabetes = datasets.load_diabetes()
    # 使用 model_selection.train_test_split() 将数据集分成训练集和测试集,其中训练集占 75%,测试集占 25%(最佳)
    # random_state 参数设置了随机种子,以确保结果的可重复性
    X_train, X_test, y_train, y_test = model_selection.train_test_split(diabetes.data, diabetes.target, test_size=0.25, random_state=0)
    # 查看划分数据(保存至data/*)
    check_data()
    
    
    # Todo: 建立线性回归模型
    print('========== ※ 线性回归模型 ※ ==========')
    # 通过sklearn的 linear_model 创建线性回归对象
    linearRegression = linear_model.LinearRegression()
    # 进行训练
    linearRegression.fit(X_train, y_train)
    # 通过LinearRegression的coef_属性获得权重向量,intercept_获得b的值
    print("权重向量:%s, b的值为:%.2f" % (linearRegression.coef_, linearRegression.intercept_))
    # 计算出损失函数的值
    print("损失函数的值: %.2f" % np.mean((linearRegression.predict(X_test) - y_test) ** 2))
    # 计算预测性能得分
    print("预测性能得分: %.2f" % linearRegression.score(X_test, y_test))
    
    
    # Todo: 分别利用可视化方法和交叉验证法确定惩罚参数λ并建立岭回归模型
    print('========== ※ 岭回归模型 ※ ==========')
    ridgeRegression = linear_model.Ridge()
    ridgeRegression.fit(X_train, y_train)
    print("权重向量:%s, b的值为:%.2f" % (ridgeRegression.coef_, ridgeRegression.intercept_))
    print("损失函数的值:%.2f" % np.mean((ridgeRegression.predict(X_test) - y_test) ** 2))
    print("预测性能得分: %.2f" % ridgeRegression.score(X_test, y_test))
    
    # todo: 测试不同的α值对预测性能的影响
    alphas = [0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000]
    scores = []
    for i, alpha in enumerate(alphas):
        ridgeRegression = linear_model.Ridge(alpha=alpha)
        ridgeRegression.fit(X_train, y_train)
        scores.append(ridgeRegression.score(X_test, y_test))
    show_plot(alphas, scores)
    
    
    # Todo: 分别利用可视化方法和交叉验证法确定惩罚参数λ并建立Lasso回归模型
    print('========== ※ Lasso归模型 ※ ==========')
    lassoRegression = linear_model.Lasso()
    lassoRegression.fit(X_train, y_train)
    print("权重向量:%s, b的值为:%.2f" % (lassoRegression.coef_, lassoRegression.intercept_))
    print("损失函数的值:%.2f" % np.mean((lassoRegression.predict(X_test) - y_test) ** 2))
    print("预测性能得分: %.2f" % lassoRegression.score(X_test, y_test))
    
    # todo: 测试不同的α值对预测性能的影响
    alphas = [0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000]
    lassos_scores = []
    for i, alpha in enumerate(alphas):
        lassoRegression = linear_model.Lasso(alpha=alpha)
        lassoRegression.fit(X_train, y_train)
        lassos_scores.append(lassoRegression.score(X_test, y_test))
    show_plot(alphas, lassos_scores)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93

    V、运行结果截图(15分)

    在这里插入图片描述

    • 岭回归
      在这里插入图片描述
    • Lasso回归
      在这里插入图片描述

    VI、结果分析(15分)

    。。。。。。(详细分析结果)

    VII、小组分工及贡献比

  • 相关阅读:
    【重识云原生】第六章容器6.1.3节——Docker常用命令
    计算机毕业设计之java+ssm理发店会员管理系统
    【算法】深度搜索(DFS) 和 广度搜索(BFS)
    快速学会ansible的安装
    动态类型语言和静态类型语言的区别
    产品代码都给你看了,可别再说不会DDD(七):实体与值对象
    spring cloud gateway整合security实现统一权鉴
    java8新特性,Lambda 表达式
    413 Request Entity Too Large
    typescript ts 基础知识之接口、泛型
  • 原文地址:https://blog.csdn.net/Lenhart001/article/details/132959366