Python打卡训练营day20-奇异值SVD分解

知识点回顾:
  1. 线性代数概念回顾(可不掌握)
  2. 奇异值推导(可不掌握)
  3. 奇异值的应用
    1. 特征降维:对高维数据减小计算量、可视化
    2. 数据重构:比如重构信号、重构图像(可以实现有损压缩,k 越小压缩率越高,但图像质量损失越大)
    3. 降噪:通常噪声对应较小的奇异值。通过丢弃这些小奇异值并重构矩阵,可以达到一定程度的降噪效果。
    4. 推荐系统:在协同过滤算法中,用户-物品评分矩阵通常是稀疏且高维的。SVD (或其变种如 FunkSVD, SVD++) 可以用来分解这个矩阵,发现潜在因子 (latent factors),从而预测未评分的项。这里其实属于特征降维的部分。

作业:尝试利用svd来处理心脏病预测,看下精度变化

Python打卡训练营day20-奇异值SVD分解_第1张图片

特征降维(Dimensionality Reduction)

  • 高维数据(如图像、文本、用户行为)可能有成千上万个特征,但其中很多是冗余的。

  • 通过保留前几个最大的奇异值,可以只保留“主要信息”,而舍弃噪声或不重要的信息。

这一点与昨天的特征筛选比较类似,不过筛选的方式不同

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # Windows系统常用黑体字体
plt.rcParams['axes.unicode_minus'] = False    # 正常显示负号

df = pd.read_csv('heart.csv')
X = df.drop('target',axis=1)
y = df['target']

SVD对数值大小敏感,需要进行标准化

scaler = StandardScaler()
X_scaler = scaler.fit_transform(X)

进行奇异值分解

U,S,VT = np.linalg.svd(X_scaler,full_matrices=False)

降维处理,选择k个奇异值

k = 13
X_reduced = U[:,:k]@np.diag(S[:k])

进行训练,输出准确率

clf = RandomForestClassifier(random_state=42)
clf.fit(X_train, y_train)

y_pred = clf.predict(X_test)
acc = accuracy_score(y_test, y_pred)
print(f"模型在测试集上的准确率: {acc:.4f}")

这里我一开始选择k=6,因为昨天的特征筛选时6个效果就不错了,不过今天的奇异值降维效果不佳,k = 6时,准确率为0.7869,在k = 4时,准确率0.8525,在k = 13时准确率最高,为0.8852,此时信息是完整保留的,原因可能是降维的优势是在特征维度远大于样本时更明显,而心脏病数据集的样本数量是比特征数大很多的,原本的形状就是比较合理的

降维后的二维可视化

if k >= 2:
    X_2D = U[:, :2] @ np.diag(S[:2])
    plt.scatter(X_2D[:, 0], X_2D[:, 1], c=y, cmap='bwr', alpha=0.7)
    plt.title("SVD 降维后的二维可视化")
    plt.xlabel("主成分 1")
    plt.ylabel("主成分 2")
    plt.grid(True)
    plt.show()

Python打卡训练营day20-奇异值SVD分解_第2张图片

健康(蓝色)与患病(红色)有交错,但可以看出整体有分布趋势

你可能感兴趣的:(python打卡训练营,python,机器学习,奇异值分解,SVD)