从零开始监督学习2

传统监督学习之逻辑回归

语法进阶

1. scikit-learn 分类任务专属语法框架

(1)分类任务专用内置数据集模块

通用导入格式:from sklearn.datasets import 数据集函数名

数据集类型函数名数据集说明核心用途
二分类数据集load_breast_cancer()威斯康星乳腺癌数据集,569个样本,30个特征,标签为良性/恶性肿瘤,无缺失值,官方标准分类基准数据集逻辑回归题目指定使用数据集
多分类数据集load_iris()鸢尾花三分类数据集,150个样本,4个特征,3种鸢尾花类别示例代码使用数据集
多分类数据集load_wine()葡萄酒三分类数据集,178个样本,13个特征,3种葡萄酒类别拓展练习
分类数据集通用属性说明
数据集.data特征数据(二维数组,每行1个样本,每列1个特征)
数据集.target标签数据(一维数组,分类任务中为0/1/2…的类别编码)
数据集.feature_names特征名称列表
数据集.target_names类别名称列表(如['良性','恶性']

(2)数据集划分新增核心参数:stratify

已包含在train_test_split语法中,为分类任务专属参数

参数名语法格式作用说明使用要求
stratifytrain_test_split(..., stratify=标签数据)按标签数据的类别分布进行分层抽样,保证训练集和测试集中,各类别的样本占比和原数据集完全一致,避免样本分布不均导致模型效果偏差分类任务推荐必用,保证类别分布均衡

(3)LogisticRegression 逻辑回归分类模型

通用导入格式:from sklearn.linear_model import LogisticRegression
通用创建格式:model = LogisticRegression(参数1=值1, 参数2=值2, random_state=42)

核心参数名默认值详细作用说明本次任务使用要求
penalty'l2'正则化类型,可选'l1'/'l2'/'elasticnet'/'none',用于控制模型复杂度,防止过拟合保持默认'l2'即可
C1.0正则化强度的倒数,C越小,正则化惩罚越强,模型越简单;C越大,惩罚越弱,越接近无正则化的逻辑回归无特殊要求时保持默认1.0
random_stateNone固定随机种子,保证模型训练结果可复现必须设置为42
max_iter100模型求解的最大迭代次数,若数据未标准化,容易出现“未收敛”报错必须设置为1000,保证模型收敛
fit_interceptTrue是否计算模型偏置项(截距项)保持默认True即可
solver'lbfgs'模型求解算法,小数据集默认'lbfgs'即可,适配二分类/多分类任务保持默认即可
模型专属方法作用说明
model.predict_proba(X)预测样本属于每个类别的概率,返回二维数组,每行对应1个样本,每列对应1个类别的概率;二分类任务中第二列即为正类的预测概率,用于绘制ROC曲线

(4)分类任务专用评估指标模块

通用导入格式:from sklearn.metrics import 指标函数名

指标函数名语法格式详细作用说明使用场景
accuracy_scoreaccuracy_score(y_true, y_pred)分类准确率,正确预测的样本数占总样本数的比例,取值0-1,越接近1模型效果越好输出模型核心准确率指标
classification_reportclassification_report(y_true, y_pred, target_names=类别名称列表)生成完整分类报告,输出每个类别的精确率(Precision)、召回率(Recall)、F1分数、支持样本数,全面评估分类效果输出模型详细分类性能报告
confusion_matrixconfusion_matrix(y_true, y_pred)生成混淆矩阵,二维数组,行代表真实类别,列代表预测类别,直观展示模型的分类正确/错误情况生成混淆矩阵,用于后续热力图可视化
roc_curvefpr, tpr, thresholds = roc_curve(y_true, y_score)计算ROC曲线的坐标值,y_true为真实标签,y_score为正类的预测概率;返回fpr(假阳性率,x轴)、tpr(真阳性率,y轴)、阈值计算ROC曲线坐标,用于绘制ROC曲线
roc_auc_scoreroc_auc_score(y_true, y_score)计算ROC曲线下的面积AUC值,取值0-1,越接近1模型的分类区分能力越强,0.5为随机猜测水平输出模型AUC指标,评估模型泛化能力

2. Matplotlib 新增绘图语法

语法格式详细作用说明使用场景
plt.fill_between(x, y1, y2, alpha=透明度, color=颜色, label=标签)填充两条曲线之间的区域填充ROC曲线与随机猜测线(y=x)之间的区域,美化ROC曲线
plt.text(x, y, 文本内容, fontsize=字体大小)在图表指定坐标位置添加文本标注在ROC曲线中添加AUC数值的文本标注,直观展示指标

3. Seaborn 新增核心语法(混淆矩阵可视化专用)

通用导入格式:import seaborn as sns

语法格式详细参数说明作用说明使用场景
sns.heatmap(数据矩阵, annot=True, fmt="d", cmap=颜色映射, xticklabels=类别名, yticklabels=类别名, cbar=True)- annot=True:在热力图格子中显示数值
- fmt="d":数值格式为整数(混淆矩阵为整数)
- cmap:颜色映射方案,如"Blues""OrRd"
- xticklabels/yticklabels:坐标轴的类别名称
- cbar:是否显示右侧颜色条
绘制热力图,将混淆矩阵可视化混淆矩阵的可视化,替代纯数字的混淆矩阵,更清晰直观

逻辑回归问题详细题目

背景说明

本次任务使用 scikit-learn官方内置的威斯康星乳腺癌数据集(Breast Cancer Wisconsin Dataset),该数据集源自真实临床肿瘤研究,是全球机器学习领域用于二分类建模的标准基准数据集,在所有合规Python环境中加载的数据完全一致(特征数量、样本数量、数值分布均固定),可100%复现实验结果,适用于入门级逻辑回归分类模型的上机实践与验证。

本数据集的核心建模场景为 “基于患者乳腺肿瘤的影像学特征,预测肿瘤是良性还是恶性”,模拟临床场景中“通过肿瘤的量化特征,辅助医生完成癌症早期筛查与诊断”的实际需求——临床医生可通过这类模型,结合肿瘤的影像学特征快速判断良恶性风险,减少漏诊、误诊,为后续诊疗方案制定提供数据支撑,这也是本次逻辑回归建模任务的核心目的。

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

  1. 样本与数据规模:数据集共包含569名患者的乳腺肿瘤样本,每个样本对应1个标签(肿瘤良恶性)和30个特征(肿瘤影像学量化特征),无缺失值、无异常值,无需额外数据清洗,可直接用于建模。
  2. 特征变量(输入变量,共30个,均为连续型数值,对应肿瘤的核心影像学特征):
    所有特征均为肿瘤细胞核的量化指标,包括半径、纹理、周长、面积、光滑度、紧凑度、凹度、对称性、分形维数等核心特征,每个特征均包含均值、标准差、最大值3个维度,最终组成30个特征变量,全面反映肿瘤的形态学特征。
  3. 标签变量(输出变量,二分类离散值):
    标签值为0/1二分类编码:0代表良性肿瘤,1代表恶性肿瘤;建模核心是通过上述30个肿瘤影像学特征,精准判断肿瘤的良恶性,完成二分类预测任务。

必须完成的操作要求

  1. 从scikit-learn库中加载上述指定的官方威斯康星乳腺癌数据集
  2. 将数据集拆分为训练集与测试集,要求测试集占总数据的30%,固定随机种子为42,必须使用分层抽样方式保证类别分布一致
  3. 对训练集与测试集的特征数据完成标准化处理
  4. 调用scikit-learn库中的LogisticRegression模型,在训练集上完成模型训练,要求固定随机种子为42,最大迭代次数max_iter设置为1000
  5. 使用训练好的模型,对测试集完成类别预测与正类概率预测
  6. 输出测试集预测结果对应的准确率、完整分类报告、混淆矩阵
  7. 绘制测试集预测结果对应的ROC曲线,同时输出对应的AUC数值
  8. 绘制混淆矩阵对应的热力图,标注类别名称与数值
  9. 输出训练完成后模型的特征权重数值与偏置项数值

##上机操作流程指南

前置准备

  1. 打开Mac自带的「终端」App
  2. 激活之前创建的专属实验环境:conda activate ml_lab(环境已包含所有所需依赖库,无需重新安装)
  3. 打开VS Code(或其他你习惯的代码编辑器),新建一个名为logistic_regression_lab.py的文件

实验操作步骤(按顺序执行)

  1. logistic_regression_lab.py文件中,按顺序编写代码,先导入本次实验需要用到的所有工具库
  2. 加载任务指定的官方威斯康星乳腺癌数据集
  3. 按要求完成训练集与测试集的拆分,严格遵循分层抽样要求
  4. 完成训练集与测试集的特征数据标准化处理
  5. 定义任务指定的LogisticRegression模型,设置要求的所有参数
  6. 在训练集上完成模型训练
  7. 对测试集完成类别预测与正类概率预测
  8. 计算并输出要求的所有分类评估指标
  9. 绘制要求的ROC曲线与混淆矩阵热力图
  10. 输出训练完成后模型的特征权重数值与偏置项数值
  11. 保存文件,在终端中执行python logistic_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[定义指定LogisticRegression模型<br>设置要求的参数]
E --> F[在训练集上训练模型]
F --> G[对测试集完成类别预测+概率预测]
G --> H[计算并输出所有分类评估指标]
G --> I[绘制混淆矩阵热力图+ROC曲线]
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
65
66
67
68
69
70
71
72
73
74
75
76
# 伪代码仅说明逻辑,不能直接运行
导入 numpy
导入 matplotlib.pyplot
导入 seaborn as sns
导入 sklearn.datasets.指定分类数据集
导入 sklearn.model_selection.train_test_split
导入 sklearn.preprocessing.StandardScaler
导入 sklearn.linear_model.LogisticRegression
导入 sklearn.metrics.所有要求的分类评估指标

# 适配Mac中文显示
设置matplotlib中文字体
设置matplotlib负号正常显示

# 加载数据集
data = 指定分类数据集()
特征数据 = data.data
标签数据 = data.target
类别名称 = data.target_names

# 拆分数据集(分层抽样)
训练集特征, 测试集特征, 训练集标签, 测试集标签 = train_test_split(
特征数据, 标签数据,
test_size=要求的测试集占比,
random_state=42,
stratify=标签数据
)

# 标准化数据
scaler = StandardScaler()
训练集特征标准化 = scaler.fit_transform(训练集特征)
测试集特征标准化 = scaler.transform(测试集特征)

# 定义并训练模型
model = LogisticRegression(
max_iter=要求的迭代次数,
random_state=42
)
model.fit(训练集特征标准化, 训练集标签)

# 预测
测试集类别预测 = model.predict(测试集特征标准化)
测试集正类概率 = model.predict_proba(测试集特征标准化)[:, 1]

# 计算并输出指标
准确率 = accuracy_score(测试集标签, 测试集类别预测)
分类报告 = classification_report(测试集标签, 测试集类别预测, target_names=类别名称)
混淆矩阵 = confusion_matrix(测试集标签, 测试集类别预测)
AUC值 = roc_auc_score(测试集标签, 测试集正类概率)
打印(准确率)
打印(分类报告)
打印(混淆矩阵)
打印(AUC值)

# 绘制可视化图表
# 1. 混淆矩阵热力图
创建画布
sns.heatmap(混淆矩阵, annot=True, fmt="d", cmap="Blues", xticklabels=类别名称, yticklabels=类别名称)
设置x轴、y轴标签
设置图表标题
# 2. ROC曲线
创建画布
计算ROC曲线的fpr、tpr
绘制ROC曲线
绘制y=x随机猜测参考线
填充曲线下区域
添加AUC值文本标注
设置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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# 1. 基础配置:屏蔽警告、Mac中文适配、导入所有工具库
import warnings
warnings.filterwarnings("ignore")
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix, roc_curve, roc_auc_score

# Mac系统中文显示适配,解决乱码问题
plt.rcParams["font.sans-serif"] = ["PingFang SC", "Arial Unicode MS"]
plt.rcParams["axes.unicode_minus"] = False
# 全局图表清晰度设置
plt.rcParams["figure.dpi"] = 100

# 2. 加载替代数据集:鸢尾花二分类数据集(与题目乳腺癌数据集完全不同)
# 仅选取山鸢尾(0)和变色鸢尾(1)两个类别,构建二分类任务
iris = load_iris()
X = iris.data[iris.target != 2] # 剔除第三类,仅保留二分类数据
y = iris.target[iris.target != 2]
class_names = iris.target_names[:2] # 类别名称:['setosa', 'versicolor']
feature_names = iris.feature_names
print(f"替代数据集特征维度:{X.shape}")
print(f"替代数据集类别名称:{class_names}")

# 3. 拆分训练集与测试集:测试集占比30%,随机种子42,分层抽样
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42, stratify=y
)

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

# 5. 定义LogisticRegression模型,设置参数
model = LogisticRegression(random_state=42, max_iter=1000)

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

# 7. 对测试集完成类别预测与正类概率预测
y_test_pred = model.predict(X_test_scaled)
y_test_score = model.predict_proba(X_test_scaled)[:, 1]

# 8. 计算并输出所有分类评估指标
print("="*60)
print(f"测试集分类准确率:{accuracy_score(y_test, y_test_pred):.4f}")
print("="*60)
print("\n=== 测试集完整分类报告 ===")
print(classification_report(y_test, y_test_pred, target_names=class_names))
print("="*60)
print("\n=== 测试集混淆矩阵 ===")
cm = confusion_matrix(y_test, y_test_pred)
print(cm)
print("="*60)
print(f"测试集ROC曲线AUC值:{roc_auc_score(y_test, y_test_score):.4f}")
print("="*60)

# 9. 绘制可视化图表
# 图表1:混淆矩阵热力图
plt.figure(figsize=(8, 6))
sns.heatmap(
cm, annot=True, fmt="d", cmap="Blues",
xticklabels=class_names, yticklabels=class_names,
cbar=True, linewidths=0.5
)
plt.xlabel("预测类别", fontsize=12)
plt.ylabel("真实类别", fontsize=12)
plt.title("鸢尾花二分类任务混淆矩阵热力图", fontsize=14)
plt.tight_layout()
plt.show()

# 图表2:ROC曲线
plt.figure(figsize=(8, 6))
# 计算ROC曲线坐标
fpr, tpr, _ = roc_curve(y_test, y_test_score)
auc_value = roc_auc_score(y_test, y_test_score)
# 绘制ROC曲线
plt.plot(fpr, tpr, color="#1f77b4", linewidth=2, label=f"ROC曲线 (AUC={auc_value:.4f})")
# 绘制随机猜测参考线
plt.plot([0, 1], [0, 1], color="#ff7f0e", linewidth=2, linestyle="--", label="随机猜测 (AUC=0.5)")
# 填充曲线下区域
plt.fill_between(fpr, tpr, alpha=0.2, color="#1f77b4")
# 图表元素设置
plt.xlabel("假阳性率 (FPR)", fontsize=12)
plt.ylabel("真阳性率 (TPR)", fontsize=12)
plt.title("鸢尾花二分类任务ROC曲线", fontsize=14)
plt.legend(fontsize=12)
plt.grid(alpha=0.3)
plt.tight_layout()
plt.show()

# 10. 输出模型的特征权重与偏置项
print("\n=== 模型特征权重数值 ===")
for feature_name, weight in zip(feature_names, model.coef_[0]):
print(f"{feature_name}: {weight:.6f}")

print("\n=== 模型偏置项(截距项)数值 ===")
print(f"偏置项: {model.intercept_[0]:.6f}")