苗栗县网站建设_网站建设公司_导航菜单_seo优化
2025/12/30 6:20:03 网站建设 项目流程

@浙大疏锦行
作业:

import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score from sklearn.preprocessing import StandardScaler # 真实数据需标准化(SVD对尺度敏感) # 设置随机种子以便结果可重复 np.random.seed(42) # ----------------------1. 加载并预处理心脏病数据集---------------------- # 读取心脏病数据集(使用指定路径,r字符串避免转义) df = pd.read_csv(r"D:\PYTHONSTUDY\python60-days-challenge-master\heart.csv") # 分离特征(X)和目标变量(y):共303个样本,13个医学特征,目标为疾病状态(0=健康,1=患病) X = df.drop("target", axis=1).values y = df["target"].values # 标准化特征(SVD对数据尺度敏感,避免某一特征主导分解结果) scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # ----------------------2. 划分训练集和测试集---------------------- X_train, X_test, y_train, y_test = train_test_split( X_scaled, y, test_size=0.2, random_state=42 ) print(f"训练集形状: {X_train.shape}") # 输出:(242, 13)(242个样本,13个特征) print(f"测试集形状: {X_test.shape}") # 输出:(61, 13)(61个样本,13个特征) # ----------------------3. 对训练集进行SVD分解(降维核心)---------------------- U_train, sigma_train, Vt_train = np.linalg.svd(X_train, full_matrices=False) print(f"Vt_train 矩阵形状: {Vt_train.shape}") # 输出:(13, 13)(13个特征的正交基) # 选择保留的奇异值数量k:基于前期分析,k=7可保留73.5%数据信息 k = 7 Vt_k = Vt_train[:k, :] # 保留前k行(前7个主成分的基向量) print(f"保留 k={k} 后的 Vt_k 矩阵形状: {Vt_k.shape}") # 输出:(7, 13) # ----------------------4. 用训练集的SVD结果对训练/测试集降维---------------------- # 训练集降维:(242,13) @ (13,7) → (242,7) X_train_reduced = X_train @ Vt_k.T print(f"降维后训练集形状: {X_train_reduced.shape}") # 输出:(242, 7) # 测试集降维(必须用训练集的Vt_k,保证降维规则一致):(61,13) @ (13,7) → (61,7) X_test_reduced = X_test @ Vt_k.T print(f"降维后测试集形状: {X_test_reduced.shape}") # 输出:(61, 7) # ----------------------5. 训练逻辑回归模型并评估---------------------- model = LogisticRegression(random_state=42, max_iter=200) # 增加迭代次数适配真实数据 model.fit(X_train_reduced, y_train) # 测试集预测与准确率计算 y_pred = model.predict(X_test_reduced) accuracy = accuracy_score(y_test, y_pred) print(f"测试集准确率: {accuracy:.4f}") # 真实数据通常准确率在80%-90%区间 # ----------------------6. 计算训练集近似误差(评估降维效果)---------------------- X_train_approx = U_train[:, :k] @ np.diag(sigma_train[:k]) @ Vt_k error = np.linalg.norm(X_train - X_train_approx, "fro") / np.linalg.norm(X_train, "fro") print(f"训练集近似误差 (Frobenius 范数相对误差): {error:.4f}") # 约0.51(保留73.5%信息)

从结果来看,本次基于心脏病数据集的 SVD 降维与模型训练效果表现优异:先是将 13 维的原始医学特征压缩至 7 维,在实现约 46% 维度压缩的同时保留了 73.53% 的核心数据信息,对应的重构相对误差(约 51.45%)处于合理范围,降维兼顾了效率与信息完整性;而基于降维特征训练的逻辑回归模型,在测试集上达到了 88.52% 的准确率,这一成绩在心脏病预测任务中属于优秀水平,说明降维后的特征仍有效保留了区分健康 / 患病状态的关键信息,整体实现了 “维度简化” 与 “模型性能” 的良好平衡。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询