Day 4: 逻辑回归(用Sklearn实现乳腺癌分类)
✨ 逻辑回归实战指南:用Scikit-learn攻克乳腺癌分类 ✨ —— 从数学原理到医疗诊断的全链路解析
Ⅰ. 逻辑回归核心原理(医学诊断视角)
1. Sigmoid函数:肿瘤概率转换器
P(y=1|x) = \frac{1}{1+e^{-(w^Tx + b)}}
- 输出范围(0,1),完美适配二分类(恶性/良性)
- 决策边界:当P≥0.5时判定为恶性
2. 损失函数:对数损失(Log Loss)
L = -\frac{1}{N}\sum_{i=1}^N [y_i\log(p_i) + (1-y_i)\log(1-p_i)]
- 惩罚错误分类的同时保留概率信息

Ⅱ. 乳腺癌数据集实战全流程
1. 数据加载与探索
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
X, y = cancer.data, cancer.target
print(f"特征数: {X.shape[1]}") # 输出30个医学特征
print(f"类别分布: {np.bincount(y)}") # 恶性212例,良性357例
2. 关键特征解读(医学意义)
| 特征名称 | 临床意义 | |—————————|—————————| | mean radius | 细胞核平均半径 | | worst concave points | 最大凹陷点数量 | | mean texture | 细胞核纹理标准差 |
Ⅲ. 代码实战:5分钟构建诊断模型
1. 数据预处理
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
# 划分数据集并标准化
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y)
scaler = StandardScaler().fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
2. 模型训练与评估
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
# 创建模型(增加L2正则化防止过拟合)
model = LogisticRegression(penalty='l2', C=1.0, max_iter=1000)
model.fit(X_train_scaled, y_train)
# 预测与评估
y_pred = model.predict(X_test_scaled)
print(classification_report(y_test, y_pred, target_names=cancer.target_names))
输出示例:
precision recall f1-score support
malignant 0.98 0.93 0.95 43
benign 0.95 0.98 0.97 61
accuracy 0.96 104
macro avg 0.96 0.96 0.96 104
weighted avg 0.96 0.96 0.96 104
Ⅳ. 模型深度解析
1. 系数重要性排名(Top5)
coef_df = pd.DataFrame({
'feature': cancer.feature_names,
'weight': model.coef_[0]
}).sort_values('weight', key=abs, ascending=False).head(5)
print(coef_df)
| 特征名称 | 权重绝对值 | |—————————|————| | worst concave points | 0.83 | | mean concave points | 0.75 | | worst perimeter | 0.68 | | mean radius | 0.65 | | worst area | 0.61 |
- 解读:细胞凹陷点数量和尺寸特征对恶性判断影响最大
2. 决策边界可视化(PCA降维)
from sklearn.decomposition import PCA
# 降维到2D可视化
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_train_scaled)
plt.scatter(X_pca[:,0], X_pca[:,1], c=y_train, cmap='coolwarm', alpha=0.6)
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.title('决策边界投影')
plt.show()

Ⅴ. 医疗场景优化策略
1. 处理类别不平衡
# 调整class_weight参数
model = LogisticRegression(class_weight='balanced', C=0.8)
2. 关键指标选择
- 召回率(Recall):对恶性病例的检出率(宁可错杀不可放过)
- 特异性(Specificity):避免良性病例被误诊为恶性
3. 置信概率阈值调整
# 获取预测概率
y_proba = model.predict_proba(X_test_scaled)[:,1]
# 将阈值从0.5调整到0.4(提高恶性检出率)
y_pred_adj = (y_proba >= 0.4).astype(int)
Ⅵ. 扩展挑战
- 尝试用RFE(递归特征消除)筛选Top10重要特征
- 使用GridSearchCV优化正则化强度C和惩罚类型
- 对比随机森林在相同数据集上的表现差异
# 网格搜索示例
from sklearn.model_selection import GridSearchCV
param_grid = {
'C': [0.1, 1, 10],
'penalty': ['l1', 'l2'],
'solver': ['liblinear']
}
grid_search = GridSearchCV(LogisticRegression(), param_grid, cv=5)
grid_search.fit(X_train_scaled, y_train)
print(f"最佳参数: {grid_search.best_params_}")
💡 临床部署须知:
- 需要与医生合作验证特征解释的医学合理性
- 模型决策需结合患者其他临床信息
- 定期用新数据重新训练模型防止性能衰减
📊 PCA可视化文本重塑版 —— 用ASCII艺术与数学解析展现高维数据的降维之美
Ⅰ. PCA投影文本模拟图
乳腺癌数据集PCA降维示意图 (ASCII Art版)
良性样本(o) 恶性样本(x)
|
|
o o | x x
o o o | x x x
o o o | x x
o o |x x
----------------+----------------
o o |x x
o o o | x x
o o o | x x x
o o | x x
|
图例解析:
+中心点:两个主成分的均值中心|虚线:第一主成分轴的方向o/x分布:良性/恶性肿瘤样本在二维空间的投影- 右上方区域:高恶性概率区(细胞尺寸大且形状不规则)
Ⅱ. 数学原理可视化
1. 主成分计算过程
\begin{aligned}
\text{协方差矩阵} &:\quad C = \frac{1}{n}X^TX \\
\text{特征分解} &:\quad C = V\Lambda V^T \\
\text{投影矩阵} &:\quad W = V[:, :2] \\
\text{降维数据} &:\quad Z = XW
\end{aligned}
2. 乳腺癌数据集关键参数
原始维度: 30 → 降维后: 2
累计方差解释率: 63.7% (PC1:44.2% + PC2:19.5%)
最大方差方向特征:
- PC1: 细胞尺寸相关特征(radius, perimeter, area)
- PC2: 细胞形态相关特征(concavity, concave points)
Ⅲ. 动态投影过程模拟
# 逐步投影演示代码
import numpy as np
from sklearn.decomposition import PCA
# 原始数据标准化
X_centered = X_train_scaled - np.mean(X_train_scaled, axis=0)
# 手动计算主成分
cov_matrix = np.cov(X_centered, rowvar=False)
eigen_values, eigen_vectors = np.linalg.eigh(cov_matrix)
sorted_index = np.argsort(eigen_values)[::-1]
W = eigen_vectors[:, sorted_index[:2]]
# 动态显示前5个样本的投影
print("样本投影轨迹:")
for i in range(5):
original = X_centered[i]
projected = original @ W
print(f"样本{i}: [{original[0]:.1f},..] → [{projected[0]:.1f}, {projected[1]:.1f}]")
输出示例:
样本0: [2.1,..] → [3.2, -0.5] (恶性)
样本1: [-0.3,..] → [-1.8, 0.2] (良性)
样本2: [1.8,..] → [2.7, 1.1] (恶性)
Ⅳ. 特征重要性热力图(文本版)
主成分1(PC1)特征载荷Top5:
1. mean radius: ████████ 0.42
2. mean perimeter: ███████ 0.40
3. mean area: ███████ 0.39
4. worst radius: ██████ 0.38
5. worst perimeter: █████ 0.37
主成分2(PC2)特征载荷Top5:
1. worst concave points: ███████ 0.35
2. mean concave points: ██████ 0.33
3. worst concavity: █████ 0.31
4. mean concavity: ████ 0.29
5. symmetry error: ███ 0.25
- █ 的长度表示特征对主成分的贡献度
Ⅴ. 决策边界文本模拟
逻辑回归决策边界在PC空间的投影
|
| B B
| B B
M M | 决策边界
M M M |-------/-------
M | /
|/
+-------------
B: 良性样本区域M: 恶性样本区域/斜线表示分类边界的位置
Ⅵ. 实际代码生成可视化
虽然无法直接显示图片,但可以通过以下代码在本地生成可视化:
import matplotlib.pyplot as plt
import seaborn as sns
# 创建PCA可视化
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_train_scaled)
plt.figure(figsize=(10,6))
sns.scatterplot(x=X_pca[:,0], y=X_pca[:,1], hue=y_train,
palette=['#FF6666', '#66B2FF'], edgecolor='k')
plt.xlabel(f"PC1 ({pca.explained_variance_ratio_[0]:.1%})")
plt.ylabel(f"PC2 ({pca.explained_variance_ratio_[1]:.1%})")
plt.title("乳腺癌数据集PCA投影")
plt.legend(title='Diagnosis', labels=['Malignant', 'Benign'])
plt.grid(alpha=0.3)
plt.show()
生成图形特征:
- 红色点:恶性肿瘤样本
- 蓝色点:良性肿瘤样本
- X轴:反映细胞大小的主成分
- Y轴:反映细胞形状的主成分
- 对角线方向:两类样本的最佳分离方向
🎯 深度理解技巧:
- 观察PC1的正方向:对应大尺寸细胞特征(恶性肿瘤典型标志)
- PC2的正方向:对应不规则细胞形态(凹陷点越多越可能恶性)
- 重叠区域:需要结合其他特征进行判断的疑难病例
通过这种文本+代码的方式,即使在没有图形界面的环境中,也能清晰理解数据的分布规律!