传统监督学习之回归问题 目录[TOC]
基础配置和语法前置 1. 环境安装配置全框架(Mac版本)配置项 执行命令 作用说明 Miniconda安装(M芯片专属) curl -O https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-arm64.sh && bash Miniconda3-latest-MacOSX-arm64.sh安装适配M芯片的Python环境管理工具,全程按提示输入yes或回车确认即可 专属实验环境创建 conda create -n ml_lab python=3.10 -y创建独立的实验环境,避免与其他项目环境冲突 实验环境激活 conda activate ml_lab进入创建好的实验环境,每次打开终端做实验必须先执行此命令 核心依赖库安装 pip install numpy scikit-learn matplotlib seaborn一键安装本次实验所有需要的工具库,无需单独安装 环境退出 conda deactivate实验结束后退出当前环境
2. 环境验证框架执行以下操作,无报错即环境配置成功
激活实验环境后,在终端输入python并回车,进入Python交互环境 依次输入以下代码,每输一行按一次回车,无报错即验证通过1 2 3 4 5 import numpyimport sklearnimport matplotlibimport seabornprint ("所有库安装成功" )
输入exit()并回车,退出Python交互环境 3. Mac适配配置框架适配场景 配置内容 作用说明 绘图中文显示 所有绘图代码前必须添加以下两行 解决Mac系统绘图时中文乱码、负号显示异常的问题 plt.rcParams["font.sans-serif"] = ["PingFang SC", "Arial Unicode MS"]调用Mac自带的中文字体 plt.rcParams["axes.unicode_minus"] = False正常显示负号 编辑器选择 推荐安装VS Code 轻量代码编辑器,适配M芯片,自带代码高亮、运行功能 代码运行方式 1. 新建后缀为.py的文件编写代码 2. 激活环境后,在终端执行python 文件名.py 标准的Python代码运行方式
二、Python基础必用语法全框架 1. 变量与命名规则语法规则 详细说明 合法示例 非法示例 变量定义 格式:变量名 = 存储内容,将右侧内容赋值给左侧变量 age = 20 data_list = [1,2,3]123name = 10(数字开头)命名规范 只能由字母、数字、下划线组成,不能以数字开头,区分大小写,不能使用Python内置关键字 user_name train_data model_1class = 2(关键字)my-name = 3(含特殊符号)关键字说明 Python内置有特殊含义的单词,不能作为变量名,如if for while def class True False None - 所有内置关键字均不可用作变量名
2. 基础数据类型与常用操作数据类型 定义说明 常用操作示例 整数int 不带小数点的数字 a = 10 b = -5 支持加减乘除运算浮点数float 带小数点的数字 c = 3.14 d = -0.5 支持所有数学运算字符串str 用单引号/双引号包裹的文本内容 name = "Python" s = '实验数据' 拼接:new_str = name + s 长度获取:len(name)布尔值bool 只有两个取值:True(真)False(假),用于条件判断 is_ok = True is_finish = False列表list 用[]包裹,元素用逗号分隔,可存储不同类型数据,可修改、可添加、可删除 my_list = [1, 2, 3, "文本", True] 添加元素:my_list.append(4) 获取长度:len(my_list) 索引取值:my_list[0](取第一个元素) 切片:my_list[1:3](取第2到第3个元素)字典dict 用{}包裹,以键:值对的形式存储数据,键必须是唯一的字符串/数字,值可以是任意类型 my_dict = {"name": "张三", "age": 20, "score": 90} 取值:my_dict["name"] 修改值:my_dict["age"] = 21 添加键值对:my_dict["gender"] = "男"
3. 常用运算符运算符类型 运算符 作用说明 示例 结果 算术运算符 +加法 5 + 38 -减法 5 - 32 *乘法 5 * 315 /除法(结果为浮点数) 6 / 23.0 //整除(结果为整数,舍去小数) 7 // 23 %取余(取除法的余数) 7 % 21 **幂运算 2 ** 38 比较运算符 ==等于,判断两边是否相等,返回布尔值 5 == 5True !=不等于,判断两边是否不相等 5 != 3True >大于 5 > 3True <小于 5 < 3False >=大于等于 5 >= 5True <=小于等于 3 <= 5True 逻辑运算符 and与,两边都为True,结果才为True True and FalseFalse or或,两边有一个为True,结果就为True True or FalseTrue not非,取反 not TrueFalse 赋值运算符 =基础赋值 a = 10- +=加法赋值 a += 5 等价于 a = a + 5- -=减法赋值 a -= 3 等价于 a = a - 3-
4. 流程控制语句 (1)条件判断语句(if-elif-else)1 2 3 4 5 6 if 条件1 : elif 条件2 : else :
1 2 3 4 5 6 7 score = 85 if score >= 90 : print ("优秀" ) elif score >= 60 : print ("及格" ) else : print ("不及格" )
(2)循环语句 for循环(用于遍历序列、固定次数循环)1 2 3 4 5 6 7 8 my_list = [1 ,2 ,3 ,4 ,5 ] for num in my_list: print (num) for i in range (5 ): print (f"第{i+1 } 次循环" )
while循环(用于满足条件时循环)1 2 3 4 count = 0 while count < 5 : print (count) count += 1
循环控制关键字关键字 作用说明 break立即终止整个循环,跳出循环体 continue跳过本次循环剩余的代码,直接进入下一次循环
5. 函数定义与使用1 2 3 def 函数名 (参数1 , 参数2 , ... ): return 返回值
1 2 3 4 5 6 7 8 def add_num (a, b ): result = a + b return result sum_result = add_num(3 , 5 ) print (sum_result)
6. 代码注释规范注释类型 语法格式 作用说明 单行注释 # 注释内容对单行代码进行说明,#后的内容不会被执行 多行注释 用三个单引号'''或三个双引号"""包裹内容 对大段代码、函数、文件进行说明,包裹的内容不会被执行
1 2 3 4 5 6 7 """ 这是一个多行注释 用于说明整个文件的功能 本次实验的示例代码 """ a = 10
7. 基础错误处理1 2 3 4 5 6 7 8 try : except : else : finally :
1 2 3 4 5 try : num = int (input ("请输入一个数字:" )) print (f"你输入的数字是{num} " ) except : print ("输入错误,请输入有效的数字" )
三、上机核心库工具语法全框架 1. NumPy 数值计算库语法框架通用导入格式:import numpy as np(行业通用别名)
功能分类 语法格式 作用说明 示例 数组创建 np.array(列表/元组)将Python列表/元组转换为NumPy数组 arr = np.array([1,2,3,4])np.zeros((行数, 列数))创建指定形状的全0数组 zero_arr = np.zeros((3, 4))np.ones((行数, 列数))创建指定形状的全1数组 one_arr = np.ones((2, 5))np.arange(起始值, 结束值, 步长)创建等差序列数组,不包含结束值 range_arr = np.arange(0, 10, 2)np.linspace(起始值, 结束值, 元素个数)创建指定元素个数的等差序列数组 lin_arr = np.linspace(0, 1, 100)数组属性查看 数组名.shape查看数组的形状(行数, 列数) arr.shape数组名.ndim查看数组的维度 arr.ndim数组名.size查看数组的总元素个数 arr.size数组名.dtype查看数组中元素的数据类型 arr.dtype数组索引与切片 数组名[行索引, 列索引]取数组中指定位置的元素,索引从0开始 arr[0, 1](取第1行第2列的元素)数组名[行起始:行结束, 列起始:列结束]切片取数组的子数组,不包含结束索引 arr[0:3, 1:4]数组名[:, 列索引]取指定列的所有行数据 arr[:, 2](取第3列的所有数据)数组名[行索引, :]取指定行的所有列数据 arr[1, :](取第2行的所有数据)数组基础运算 数组1 + 数组2两个形状相同的数组对应元素相加 arr1 + arr2数组1 - 数组2两个形状相同的数组对应元素相减 arr1 - arr2数组1 * 数组2两个形状相同的数组对应元素相乘 arr1 * arr2数组1 / 数组2两个形状相同的数组对应元素相除 arr1 / arr2数组 @ 数组矩阵乘法(线性代数运算) arr1 @ arr2数组 * 数字数组中所有元素都乘以该数字 arr * 10常用统计函数 np.mean(数组)计算数组所有元素的平均值 np.mean(arr)np.sum(数组)计算数组所有元素的和 np.sum(arr)np.max(数组)找出数组中的最大值 np.max(arr)np.min(数组)找出数组中的最小值 np.min(arr)np.std(数组)计算数组的标准差 np.std(arr)np.var(数组)计算数组的方差 np.var(arr)数组名.T数组的转置(行和列互换) arr.T
2. scikit-learn 机器学习库语法框架 (1)内置数据集模块通用导入格式:from sklearn.datasets import 数据集函数名
数据集类型 函数名 数据集说明 回归数据集 fetch_california_housing()加利福尼亚房价数据集 load_diabetes()糖尿病数据集 分类数据集 load_breast_cancer()威斯康星乳腺癌二分类数据集 load_iris()鸢尾花三分类数据集 load_digits()手写数字多分类数据集 聚类数据集 make_moons()生成月亮形非线性数据集 make_blobs()生成高斯分布聚类数据集 数据集通用属性 说明 数据集.data特征数据(二维数组,每行是一个样本,每列是一个特征) 数据集.target标签数据(一维数组,每个样本对应的标签/目标值) 数据集.feature_names特征名称列表 数据集.target_names标签名称列表
(2)数据集划分模块通用导入格式:from sklearn.model_selection import train_test_split
1 2 3 4 5 6 X_train, X_test, y_train, y_test = train_test_split( 特征数据, 标签数据, test_size=测试集占比, random_state=随机种子数, stratify=标签数据(可选,分层抽样用) )
参数说明:test_size:测试集占总数据的比例,0-1之间,如0.3代表30%的数据作为测试集random_state:固定随机种子,保证每次划分的结果完全一致stratify:按标签数据的分布进行分层抽样,保证训练集和测试集的标签分布一致 (3)数据预处理模块通用导入格式:from sklearn.preprocessing import 预处理类名
预处理类 语法格式 作用说明 StandardScaler 1. 创建对象:scaler = StandardScaler() 2. 训练集拟合与转换:X_train_scaled = scaler.fit_transform(X_train) 3. 测试集转换:X_test_scaled = scaler.transform(X_test) 特征标准化,将特征转换为均值为0、标准差为1的分布 MinMaxScaler 1. 创建对象:scaler = MinMaxScaler() 2. 训练集拟合与转换:X_train_scaled = scaler.fit_transform(X_train) 3. 测试集转换:X_test_scaled = scaler.transform(X_test) 特征归一化,将特征缩放到0-1之间 LabelEncoder 1. 创建对象:le = LabelEncoder() 2. 拟合与转换:y_encoded = le.fit_transform(y) 将文本标签转换为数字标签
(4)模型基础通用语法所有scikit-learn模型的使用语法完全统一,通用格式如下:
导入模型:from sklearn.模型类别 import 模型类名 创建模型对象:model = 模型类名(参数1=值1, 参数2=值2, random_state=42) 模型训练:model.fit(X_train, y_train)(有监督模型)/ model.fit(X_train)(无监督模型) 模型预测:y_pred = model.predict(X) 模型转换(降维/预处理类):X_transformed = model.transform(X) 模型类别 常用模型类名 模型用途 线性模型 LinearRegression线性回归任务 LogisticRegression逻辑回归分类任务 判别分析 LinearDiscriminantAnalysis线性判别分析分类/降维 支持向量机 SVC支持向量机分类任务 SVR支持向量机回归任务 聚类模型 KMeansK-Means聚类任务 降维模型 PCA主成分分析降维任务 近邻模型 KNeighborsClassifierK近邻分类任务 KNeighborsRegressorK近邻回归任务 模型通用属性 说明 model.coef_训练完成后模型的特征权重系数 model.intercept_训练完成后模型的偏置项/截距项 model.feature_names_in_训练时使用的特征名称
核心超参数:alpha (正则化强度) 作用 :它决定了对模型复杂度的“惩罚”力度。取值 :必须是正浮点数。alpha 越大,惩罚越重,模型越简单(防止过拟合);alpha 越小,越接近普通线性回归。随机性控制:random_state 作用 :用于固定伪随机数生成器的种子。必要性 :虽然线性回归本身通常是确定性的,但在复杂的求解过程中(尤其是 Lasso 的坐标下降法)涉及随机初始化。其他常用参数 (默认值通常已足够) 参数名 默认值 作用说明 fit_interceptTrue是否计算截距(即 y =w**x +b 中的 b )。如果你的数据已经过中心化处理,可以设为 False。 max_iter1000最大迭代次数。如果模型报错“未收敛”,需要调大这个值。 tol1e-4解的精度(收敛阈值)。当两次迭代之间的改进小于这个值时,训练停止。 solver (仅 Ridge)'auto'指定求解算法(如 svd, cholesky, sag 等)。通常保持 auto 让系统自动根据数据规模选择最优算法。
(5)模型评估指标模块通用导入格式:from sklearn.metrics import 指标函数名
任务类型 指标函数名 语法格式 指标说明 回归任务 r2_scorer2_score(y_true, y_pred)R2决定系数,越接近1模型效果越好 mean_absolute_errormean_absolute_error(y_true, y_pred)平均绝对误差MAE,值越小误差越小 mean_squared_errormean_squared_error(y_true, y_pred)均方误差MSE,值越小误差越小 分类任务 accuracy_scoreaccuracy_score(y_true, y_pred)准确率,正确预测的样本占总样本的比例 classification_reportclassification_report(y_true, y_pred)分类报告,输出精确率、召回率、F1分数 confusion_matrixconfusion_matrix(y_true, y_pred)混淆矩阵,展示分类的正确与错误情况 roc_curvefpr, tpr, thresholds = roc_curve(y_true, y_score)计算ROC曲线的坐标值 roc_auc_scoreroc_auc_score(y_true, y_score)计算AUC值,越接近1模型效果越好 聚类任务 silhouette_scoresilhouette_score(X, labels)轮廓系数,评估聚类效果,越接近1聚类效果越好 calinski_harabasz_scorecalinski_harabasz_score(X, labels)CH指数,值越大聚类效果越好 adjusted_rand_scoreadjusted_rand_score(y_true, labels)调整兰德指数,评估聚类结果与真实标签的匹配度
(6)超参数调优模块通用导入格式:from sklearn.model_selection import GridSearchCV
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 param_grid = { "参数名1" : [值1 , 值2 , 值3 ], "参数名2" : [值1 , 值2 , 值3 ] } grid_search = GridSearchCV( estimator=模型对象, param_grid=param_grid, cv=交叉验证折数, scoring=评估指标, n_jobs=-1 ) grid_search.fit(X_train, y_train) best_model = grid_search.best_estimator_ best_params = grid_search.best_params_ best_score = grid_search.best_score_
3. Matplotlib 数据可视化库语法框架通用导入格式:import matplotlib.pyplot as plt(行业通用别名,推荐固定使用)
功能分类 语法格式 作用说明 画布创建 plt.figure(figsize=(宽度, 高度), dpi=分辨率)创建画布,设置画布大小和清晰度,单位为英寸 子图创建 fig, axes = plt.subplots(行数, 列数, figsize=(宽度, 高度))创建多个子图,axes为子图对象数组,可通过axes[i,j]调用对应子图 常用绘图类型 plt.plot(x, y, label="图例名称", color="颜色", linewidth=线宽, linestyle="线型")绘制折线图 plt.scatter(x, y, label="图例名称", color="颜色", s=点的大小, alpha=透明度)绘制散点图 plt.bar(x, height, label="图例名称", color="颜色", alpha=透明度)绘制柱状图 plt.hist(x, bins=分箱数, color="颜色", alpha=透明度)绘制直方图 plt.contourf(X, Y, Z, cmap=颜色映射, alpha=透明度)绘制等高线填充图(用于决策边界) 图表元素配置 plt.xlabel("x轴名称", fontsize=字体大小)设置x轴的标签名称 plt.ylabel("y轴名称", fontsize=字体大小)设置y轴的标签名称 plt.title("图表标题", fontsize=字体大小)设置图表的标题 plt.xlim(最小值, 最大值)设置x轴的显示范围 plt.ylim(最小值, 最大值)设置y轴的显示范围 plt.legend(fontsize=字体大小, loc=位置)显示图例,loc可设置图例位置,如"upper right" plt.grid(alpha=透明度, linestyle="线型")显示网格线 plt.xticks(rotation=旋转角度)设置x轴刻度的旋转角度 plt.yticks(rotation=旋转角度)设置y轴刻度的旋转角度 图表显示与保存 plt.show()显示绘制完成的图表 plt.savefig("保存路径/文件名.png", dpi=分辨率, bbox_inches="tight")将图表保存为图片文件,bbox_inches="tight"可避免标签被截断 颜色与线型 常用颜色名称:"#1f77b4"(蓝)、"#ff7f0e"(橙)、"#2ca02c"(绿)、"#d62728"(红) 支持十六进制颜色码、颜色名称、RGB值 常用线型:"-"(实线)、"--"(虚线)、":"(点线)、"-."(点划线) 用于折线图的线条样式设置
4. Seaborn 高级可视化库语法框架通用导入格式:import seaborn as sns(行业通用别名,推荐固定使用)
简化复杂图表的绘制,与matplotlib完全兼容 | 常用绘图函数 | 语法格式 | 作用说明 | |--------------|----------|----------| | sns.heatmap | sns.heatmap(数据矩阵, annot=True, cmap=颜色映射, fmt="格式") | 绘制热力图,常用于混淆矩阵可视化,annot=True显示数值 | | sns.pairplot | sns.pairplot(数据集, hue="标签列名") | 绘制特征两两之间的散点图矩阵,用于数据探索 | | sns.boxplot | sns.boxplot(x="x列", y="y列", data=数据集) | 绘制箱线图,用于查看数据分布与异常值 | | sns.lineplot | sns.lineplot(x="x列", y="y列", data=数据集) | 绘制带置信区间的折线图 | | sns.scatterplot | sns.scatterplot(x="x列", y="y列", hue="分类列", data=数据集) | 绘制分类散点图 | | 全局风格设置 | sns.set_style("whitegrid") | 设置绘图的全局风格,可选"darkgrid"/"white"/"dark" | | | sns.set_palette("颜色主题") | 设置全局颜色主题,如"husl"/"Set2"/"coolwarm" | 开始上机:回归问题详细题目 背景说明本次任务使用 scikit-learn官方内置的糖尿病数据集(Diabetes Dataset) ,该数据集源自真实临床医学研究,是全球机器学习领域用于回归建模的标准基准数据集。
本数据集的核心建模场景为 “基于患者生理特征,预测糖尿病病情进展程度” ,模拟临床场景中“通过患者基础生理指标,提前预判病情发展趋势”的实际需求——临床医生可通过这类模型,结合患者的生理数据快速评估病情进展风险,为后续干预治疗方案的制定提供数据支撑,这也是本次回归建模任务的核心目的。
数据集详细说明(明确变量、数据含义,清晰指导建模)样本与数据规模:数据集共包含442名糖尿病患者的样本,每个样本对应1个标签(病情进展指标)和10个特征(患者生理指标),无缺失值、无异常值,无需额外数据清洗,可直接用于建模。 特征变量(输入变量,共10个,均为连续型数值,对应患者核心生理指标):age:患者年龄(单位:岁),反映年龄对糖尿病病情进展的影响; sex:患者性别(编码为数值,0代表女性,1代表男性),用于分析性别差异对病情的影响; bmi:体重指数(Body Mass Index,单位:kg/m²),核心指标,反映肥胖程度与糖尿病进展的关联; bp:平均血压(单位:mm Hg),血压异常是糖尿病并发症的重要诱因; s1~s6:6项血清生化指标(均为连续型数值),分别对应患者体内不同的血糖、血脂等生化参数,是评估糖尿病病情的关键临床指标(具体对应临床生化指标无需深入了解,仅需作为特征变量使用)。 标签变量(输出变量,1个连续型数值):标签值代表患者患病1年后,糖尿病病情的进展程度(数值越大,代表病情进展越明显、风险越高),建模核心是通过上述10个生理特征,精准预测该病情进展指标。 建模逻辑说明本次回归任务的核心逻辑的是 “构建输入(10项生理特征)与输出(病情进展程度)之间的线性关联模型” :通过训练模型,学习患者生理指标(如BMI、血压、血清指标)与病情进展之间的量化关系,最终实现“输入新患者的生理数据,即可预测其未来病情进展程度”的目标,贴合临床实际应用场景。
操作要求从scikit-learn库中加载上述指定的官方数据集 将数据集拆分为训练集与测试集,要求测试集占总数据的25%,固定随机种子为42 对训练集与测试集的特征数据完成标准化处理 调用scikit-learn库中的Ridge模型,在训练集上完成模型训练,要求固定随机种子为42,正则化强度参数alpha设置为1.0 分别使用训练好的模型,对训练集、测试集完成预测操作 输出训练集、测试集的预测结果对应的R2指标、MAE指标、MSE指标 绘制测试集的真实标签与预测结果的对比散点图,同时叠加一条y=x的参考线 输出训练完成后模型的特征权重数值 上机操作流程指南(本地环境) 前置准备打开Mac自带的「终端」App 激活专属实验环境:conda activate ml_lab 打开VS Code(或其他你习惯的代码编辑器),新建一个名为regression_lab.py的文件 实验操作步骤在regression_lab.py文件中,新建代码块(或直接按顺序写代码),导入本次实验需要用到的所有工具库 加载任务指定的官方糖尿病数据集 按要求拆分训练集与测试集 完成特征数据的标准化处理 定义任务指定的Ridge模型 在训练集上完成模型训练 分别对训练集、测试集完成预测操作 计算并输出要求的所有评估指标 绘制要求的可视化图表 输出训练完成后模型的特征权重数值 保存文件,在终端中执行python regression_lab.py运行代码 信息参考 (一)回归问题通用实验流程图1 2 3 4 5 6 7 8 9 10 flowchart TD A[导入所有工具库] --> B[加载官方指定数据集] B --> C[拆分训练集与测试集<br>固定随机种子、测试集占比] C --> D[特征数据标准化<br>训练集fit_transform<br>测试集仅transform] D --> E[定义指定模型<br>设置要求的参数] E --> F[在训练集上训练模型] F --> G[分别对训练集、测试集预测] G --> H[计算并输出所有评估指标] G --> I[绘制要求的可视化图表] F --> J[输出模型的特征权重]
(二)回归问题通用实验伪代码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 # 伪代码仅说明逻辑,不能直接运行 导入 numpy 导入 matplotlib.pyplot 导入 sklearn.datasets.指定数据集 导入 sklearn.model_selection.train_test_split 导入 sklearn.preprocessing.StandardScaler 导入 sklearn.模型类别.指定模型 导入 sklearn.metrics.所有要求的指标 # 适配Mac中文显示 设置matplotlib中文字体 设置matplotlib负号正常显示 # 加载数据集 data = 指定数据集() 特征数据 = data.data 标签数据 = data.target # 拆分数据集 训练集特征, 测试集特征, 训练集标签, 测试集标签 = train_test_split( 特征数据, 标签数据, test_size=要求的测试集占比, random_state=42 ) # 标准化数据 scaler = StandardScaler() 训练集特征标准化 = scaler.fit_transform(训练集特征) 测试集特征标准化 = scaler.transform(测试集特征) # 定义并训练模型 model = 指定模型( 参数1=要求的值, 参数2=要求的值, random_state=42 ) model.fit(训练集特征标准化, 训练集标签) # 预测 训练集预测 = model.predict(训练集特征标准化) 测试集预测 = model.predict(测试集特征标准化) # 计算并输出指标 训练集R2 = R2指标(训练集标签, 训练集预测) 训练集MAE = MAE指标(训练集标签, 训练集预测) 训练集MSE = MSE指标(训练集标签, 训练集预测) 测试集R2 = R2指标(测试集标签, 测试集预测) 测试集MAE = MAE指标(测试集标签, 测试集预测) 测试集MSE = MSE指标(测试集标签, 测试集预测) 打印(训练集指标) 打印(测试集指标) # 绘制可视化图表 创建画布 绘制测试集真实标签vs预测结果的散点图 绘制y=x的参考线 设置x轴、y轴标签 设置图表标题 显示图例 显示网格 显示图表 # 输出特征权重 打印(模型的特征权重)
框架示例代码(基于波士顿房价替代数据集,细节不同)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 import numpy as npimport matplotlib.pyplot as pltfrom sklearn.datasets import fetch_california_housingfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import StandardScalerfrom sklearn.linear_model import Lassofrom sklearn.metrics import r2_score, mean_absolute_error, mean_squared_errorplt.rcParams["font.sans-serif" ] = ["PingFang SC" , "Arial Unicode MS" ] plt.rcParams["axes.unicode_minus" ] = False housing = fetch_california_housing() X = housing.data y = housing.target print (f"替代数据集特征维度:{X.shape} " )print (f"替代数据集特征名称:{housing.feature_names} " )X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2 , random_state=42 ) scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) model = Lasso(alpha=0.5 , random_state=42 ) model.fit(X_train_scaled, y_train) y_train_pred = model.predict(X_train_scaled) y_test_pred = model.predict(X_test_scaled) print ("\n=== 替代数据集训练集评估结果 ===" )print (f"R2决定系数:{r2_score(y_train, y_train_pred):.4 f} " )print (f"平均绝对误差MAE:{mean_absolute_error(y_train, y_train_pred):.4 f} " )print (f"均方误差MSE:{mean_squared_error(y_train, y_train_pred):.4 f} " )print ("\n=== 替代数据集测试集评估结果 ===" )print (f"R2决定系数:{r2_score(y_test, y_test_pred):.4 f} " )print (f"平均绝对误差MAE:{mean_absolute_error(y_test, y_test_pred):.4 f} " )print (f"均方误差MSE:{mean_squared_error(y_test, y_test_pred):.4 f} " )plt.figure(figsize=(10 , 7 )) plt.scatter(y_test, y_test_pred, color="#1f77b4" , alpha=0.6 , s=40 , label="预测样本" ) min_val = min (y_test.min (), y_test_pred.min ()) max_val = max (y_test.max (), y_test_pred.max ()) plt.plot([min_val, max_val], [min_val, max_val], color="#ff7f0e" , linewidth=2 , linestyle="--" , label="y=x参考线" ) plt.xlabel("真实房价(单位:10万美元)" , fontsize=12 ) plt.ylabel("预测房价(单位:10万美元)" , fontsize=12 ) plt.title("替代数据集测试集真实房价vs预测房价对比" , fontsize=14 ) plt.legend(fontsize=12 ) plt.grid(alpha=0.3 ) plt.show() print ("\n=== 替代数据集Lasso模型特征权重 ===" )for feature_name, weight in zip (housing.feature_names, model.coef_): print (f"{feature_name} : {weight:.6 f} " )