从零开始监督学习1

传统监督学习之回归问题

目录

[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. 环境验证框架

执行以下操作,无报错即环境配置成功

  1. 激活实验环境后,在终端输入python并回车,进入Python交互环境
  2. 依次输入以下代码,每输一行按一次回车,无报错即验证通过
    1
    2
    3
    4
    5
    import numpy
    import sklearn
    import matplotlib
    import seaborn
    print("所有库安装成功")
  3. 输入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,结果才为TrueTrue and FalseFalse
or或,两边有一个为True,结果就为TrueTrue 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:
# 条件1为True时执行的代码(缩进必须一致,推荐4个空格)
elif 条件2:
# 条件1为False,条件2为True时执行的代码
else:
# 所有条件都为False时执行的代码
  • 示例:
1
2
3
4
5
6
7
score = 85
if score >= 90:
print("优秀")
elif score >= 60:
print("及格")
else:
print("不及格")

(2)循环语句

for循环(用于遍历序列、固定次数循环)
  • 语法格式:
1
2
for 变量 in 可遍历对象:
# 每次循环执行的代码
  • 常用示例:
1
2
3
4
5
6
7
8
# 遍历列表
my_list = [1,2,3,4,5]
for num in my_list:
print(num)

# 固定次数循环,range(5)生成0-4的整数序列
for i in range(5):
print(f"第{i+1}次循环")
while循环(用于满足条件时循环)
  • 语法格式:
1
2
3
while 循环条件:
# 条件为True时执行的代码
# 需设置条件变为False的出口,避免死循环
  • 示例:
1
2
3
4
count = 0
while count < 5:
print(count)
count += 1 # 每次循环count加1,直到count>=5时退出循环

循环控制关键字

关键字作用说明
break立即终止整个循环,跳出循环体
continue跳过本次循环剩余的代码,直接进入下一次循环

5. 函数定义与使用

  • 语法格式:
1
2
3
def 函数名(参数1, 参数2, ...):
# 函数内部执行的代码
return 返回值 # 可选,没有return默认返回None
  • 示例:
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) # 输出8

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 预处理类名

预处理类语法格式作用说明
StandardScaler1. 创建对象:scaler = StandardScaler()
2. 训练集拟合与转换:X_train_scaled = scaler.fit_transform(X_train)
3. 测试集转换:X_test_scaled = scaler.transform(X_test)
特征标准化,将特征转换为均值为0、标准差为1的分布
MinMaxScaler1. 创建对象:scaler = MinMaxScaler()
2. 训练集拟合与转换:X_train_scaled = scaler.fit_transform(X_train)
3. 测试集转换:X_test_scaled = scaler.transform(X_test)
特征归一化,将特征缩放到0-1之间
LabelEncoder1. 创建对象:le = LabelEncoder()
2. 拟合与转换:y_encoded = le.fit_transform(y)
将文本标签转换为数字标签

(4)模型基础通用语法

所有scikit-learn模型的使用语法完全统一,通用格式如下:

  1. 导入模型:from sklearn.模型类别 import 模型类名
  2. 创建模型对象:model = 模型类名(参数1=值1, 参数2=值2, random_state=42)
  3. 模型训练:model.fit(X_train, y_train)(有监督模型)/ model.fit(X_train)(无监督模型)
  4. 模型预测:y_pred = model.predict(X)
  5. 模型转换(降维/预处理类):X_transformed = model.transform(X)
模型类别常用模型类名模型用途
线性模型LinearRegression线性回归任务
LogisticRegression逻辑回归分类任务
判别分析LinearDiscriminantAnalysis线性判别分析分类/降维
支持向量机SVC支持向量机分类任务
SVR支持向量机回归任务
聚类模型KMeansK-Means聚类任务
降维模型PCA主成分分析降维任务
近邻模型KNeighborsClassifierK近邻分类任务
KNeighborsRegressorK近邻回归任务
模型通用属性说明
model.coef_训练完成后模型的特征权重系数
model.intercept_训练完成后模型的偏置项/截距项
model.feature_names_in_训练时使用的特征名称
  1. 核心超参数:alpha (正则化强度)
  • 作用:它决定了对模型复杂度的“惩罚”力度。
  • 取值:必须是正浮点数。alpha 越大,惩罚越重,模型越简单(防止过拟合);alpha 越小,越接近普通线性回归。

  1. 随机性控制:random_state
  • 作用:用于固定伪随机数生成器的种子。
  • 必要性:虽然线性回归本身通常是确定性的,但在复杂的求解过程中(尤其是 Lasso 的坐标下降法)涉及随机初始化。

  1. 其他常用参数 (默认值通常已足够)
参数名默认值作用说明
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 # 调用所有CPU核心加速搜索
)
# 执行搜索
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),该数据集源自真实临床医学研究,是全球机器学习领域用于回归建模的标准基准数据集。

本数据集的核心建模场景为 “基于患者生理特征,预测糖尿病病情进展程度”,模拟临床场景中“通过患者基础生理指标,提前预判病情发展趋势”的实际需求——临床医生可通过这类模型,结合患者的生理数据快速评估病情进展风险,为后续干预治疗方案的制定提供数据支撑,这也是本次回归建模任务的核心目的。

数据集详细说明(明确变量、数据含义,清晰指导建模)

  1. 样本与数据规模:数据集共包含442名糖尿病患者的样本,每个样本对应1个标签(病情进展指标)和10个特征(患者生理指标),无缺失值、无异常值,无需额外数据清洗,可直接用于建模。
  2. 特征变量(输入变量,共10个,均为连续型数值,对应患者核心生理指标):
    • age:患者年龄(单位:岁),反映年龄对糖尿病病情进展的影响;
    • sex:患者性别(编码为数值,0代表女性,1代表男性),用于分析性别差异对病情的影响;
    • bmi:体重指数(Body Mass Index,单位:kg/m²),核心指标,反映肥胖程度与糖尿病进展的关联;
    • bp:平均血压(单位:mm Hg),血压异常是糖尿病并发症的重要诱因;
    • s1~s6:6项血清生化指标(均为连续型数值),分别对应患者体内不同的血糖、血脂等生化参数,是评估糖尿病病情的关键临床指标(具体对应临床生化指标无需深入了解,仅需作为特征变量使用)。
  3. 标签变量(输出变量,1个连续型数值):
    • 标签值代表患者患病1年后,糖尿病病情的进展程度(数值越大,代表病情进展越明显、风险越高),建模核心是通过上述10个生理特征,精准预测该病情进展指标。

建模逻辑说明

本次回归任务的核心逻辑的是 “构建输入(10项生理特征)与输出(病情进展程度)之间的线性关联模型”:通过训练模型,学习患者生理指标(如BMI、血压、血清指标)与病情进展之间的量化关系,最终实现“输入新患者的生理数据,即可预测其未来病情进展程度”的目标,贴合临床实际应用场景。

操作要求

  1. 从scikit-learn库中加载上述指定的官方数据集
  2. 将数据集拆分为训练集与测试集,要求测试集占总数据的25%,固定随机种子为42
  3. 对训练集与测试集的特征数据完成标准化处理
  4. 调用scikit-learn库中的Ridge模型,在训练集上完成模型训练,要求固定随机种子为42,正则化强度参数alpha设置为1.0
  5. 分别使用训练好的模型,对训练集、测试集完成预测操作
  6. 输出训练集、测试集的预测结果对应的R2指标、MAE指标、MSE指标
  7. 绘制测试集的真实标签与预测结果的对比散点图,同时叠加一条y=x的参考线
  8. 输出训练完成后模型的特征权重数值

上机操作流程指南(本地环境)

前置准备

  1. 打开Mac自带的「终端」App
  2. 激活专属实验环境:conda activate ml_lab
  3. 打开VS Code(或其他你习惯的代码编辑器),新建一个名为regression_lab.py的文件

实验操作步骤

  1. regression_lab.py文件中,新建代码块(或直接按顺序写代码),导入本次实验需要用到的所有工具库
  2. 加载任务指定的官方糖尿病数据集
  3. 按要求拆分训练集与测试集
  4. 完成特征数据的标准化处理
  5. 定义任务指定的Ridge模型
  6. 在训练集上完成模型训练
  7. 分别对训练集、测试集完成预测操作
  8. 计算并输出要求的所有评估指标
  9. 绘制要求的可视化图表
  10. 输出训练完成后模型的特征权重数值
  11. 保存文件,在终端中执行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 np
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Lasso
from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error

# Mac系统中文显示适配
plt.rcParams["font.sans-serif"] = ["PingFang SC", "Arial Unicode MS"]
plt.rcParams["axes.unicode_minus"] = False

# 1. 加载替代数据集(波士顿房价已弃用,用fetch_california_housing替代)
housing = fetch_california_housing()
X = housing.data
y = housing.target
print(f"替代数据集特征维度:{X.shape}")
print(f"替代数据集特征名称:{housing.feature_names}")

# 2. 拆分训练集与测试集(测试集占比20%,随机种子42)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)

# 3. 特征数据标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# 4. 定义替代模型(Lasso回归,alpha=0.5,随机种子42)
model = Lasso(alpha=0.5, random_state=42)

# 5. 在训练集上训练模型
model.fit(X_train_scaled, y_train)

# 6. 分别对训练集、测试集预测
y_train_pred = model.predict(X_train_scaled)
y_test_pred = model.predict(X_test_scaled)

# 7. 计算并输出所有评估指标
print("\n=== 替代数据集训练集评估结果 ===")
print(f"R2决定系数:{r2_score(y_train, y_train_pred):.4f}")
print(f"平均绝对误差MAE:{mean_absolute_error(y_train, y_train_pred):.4f}")
print(f"均方误差MSE:{mean_squared_error(y_train, y_train_pred):.4f}")

print("\n=== 替代数据集测试集评估结果 ===")
print(f"R2决定系数:{r2_score(y_test, y_test_pred):.4f}")
print(f"平均绝对误差MAE:{mean_absolute_error(y_test, y_test_pred):.4f}")
print(f"均方误差MSE:{mean_squared_error(y_test, y_test_pred):.4f}")

# 8. 绘制测试集真实标签vs预测结果的对比散点图+参考线
plt.figure(figsize=(10, 7))
# 绘制散点图
plt.scatter(y_test, y_test_pred, color="#1f77b4", alpha=0.6, s=40, label="预测样本")
# 绘制y=x参考线
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()

# 9. 输出模型的特征权重
print("\n=== 替代数据集Lasso模型特征权重 ===")
for feature_name, weight in zip(housing.feature_names, model.coef_):
print(f"{feature_name}: {weight:.6f}")