当前位置: 首页 > news >正文

Python打卡Day20 常见的特征筛选算法

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

对于任何矩阵(如结构化数据可以变为:样本*特征的矩阵,图像数据天然就是矩阵),均可做等价的奇异值SVD分解,对于分解后的矩阵,可以选取保留前K个奇异值及其对应的奇异向量,重构原始矩阵,可以通过计算Frobenius 范数相对误差来衡量原始矩阵和重构矩阵的差异。

应用:结构化数据中,将原来的m个特征降维成k个新的特征,新特征是原始特征的线性组合,捕捉了数据的主要方差信息,降维后的数据可以直接用于机器学习模型(如分类、回归),通常能提高计算效率并减少过拟合风险。

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 scipy.linalg import svd
import numpy as np
import matplotlib.pyplot as plt# 加载数据集
data = pd.read_csv('heart.csv')# 提取特征和目标变量
X = data.drop('target', axis=1)
y = data['target']
# 设置 matplotlib 支持中文
plt.rcParams['font.sans-serif'] = ['WenQuanYi Zen Hei']
plt.rcParams['axes.unicode_minus'] = False
# 划分训练集、验证集和测试集 (60%-20%-20%)
X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.4, random_state=42)
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)# 训练逻辑回归模型(未进行特征工程)
model = LogisticRegression()
model.fit(X_train, y_train)# 在验证集上进行预测
y_pred_val = model.predict(X_val)# 计算准确率(未进行特征工程)
accuracy_before = accuracy_score(y_val, y_pred_val)
print(f"特征工程前的验证集准确率: {accuracy_before}")# 记录不同k值下的准确率
k_values = range(1, X_train.shape[1] + 1)
accuracies = []
best_k = 0
best_accuracy = 0# 使用 SVD 进行特征工程,并尝试不同的k值
for k in k_values:# 对训练集进行SVD分解U, s, Vt = svd(X_train, full_matrices=False)# 将奇异值向量转换为对角矩阵S_k = np.diag(s[:k])X_train_svd = U[:, :k] @ S_k# 对验证集进行变换X_val_centered = X_val - np.mean(X_train, axis=0)X_val_svd = X_val_centered @ Vt.T[:, :k]# 训练逻辑回归模型model_svd = LogisticRegression()model_svd.fit(X_train_svd, y_train)# 在验证集上进行预测y_pred_val_svd = model_svd.predict(X_val_svd)# 计算准确率accuracy = accuracy_score(y_val, y_pred_val_svd)accuracies.append(accuracy)# 记录最佳k值if accuracy > best_accuracy:best_accuracy = accuracybest_k = k# 输出最佳k值和对应的准确率
print(f"最佳k值: {best_k}")
print(f"最佳验证集准确率: {best_accuracy}")# 使用最佳k值在测试集上评估
U, s, Vt = svd(X_train, full_matrices=False)
S_best = np.diag(s[:best_k])
X_train_svd_best = U[:, :best_k] @ S_best# 对测试集进行变换
X_test_centered = X_test - np.mean(X_train, axis=0)
X_test_svd_best = X_test_centered @ Vt.T[:, :best_k]# 训练逻辑回归模型
model_svd_best = LogisticRegression()
model_svd_best.fit(X_train_svd_best, y_train)# 在测试集上进行预测
y_pred_test_svd = model_svd_best.predict(X_test_svd_best)# 计算准确率
accuracy_test = accuracy_score(y_test, y_pred_test_svd)
print(f"特征工程后的测试集准确率: {accuracy_test}")# 可视化不同k值下的准确率变化
plt.figure(figsize=(10, 6))
plt.plot(k_values, accuracies, marker='o')
plt.axhline(y=accuracy_before, color='r', linestyle='--', label='特征工程前的准确率')
plt.axvline(x=best_k, color='g', linestyle='--', label=f'最佳k值: {best_k}')
plt.xlabel('k (保留的奇异值数量)')
plt.ylabel('验证集准确率')
plt.title('不同k值下SVD特征工程的模型性能')
plt.legend()
plt.grid(True)
plt.show()

@浙大疏锦行

http://www.dtcms.com/a/291518.html

相关文章:

  • C 语言的指针复习笔记
  • 圆柱电池自动分选机:全流程自动化检测的革新之路
  • 大模型中的Actor-Critic机制
  • 嵌入式学习笔记--MCU阶段--DAY08总结
  • 【Java基础03】Java变量2
  • seata at使用
  • 自然语言推理技术全景图:从基准数据集到BERT革命
  • 设备虚拟化技术-IRF
  • 利用DeepSeek编写批量输出多个主机的磁盘状况的脚本
  • 携“养鲜”魔法赴中卫,容声冰箱让石头缝里的鲜甜走得更远
  • 前端之学习后端java小白(一)之SDKMAN及helloword
  • EcoVadis评估:为企业带来的多重价值与竞争优势
  • QT跨平台应用程序开发框架(11)—— Qt系统相关
  • STM32F1使用volatile关键字避免内存优化
  • 基于springboot+vue开发的图书馆座位预约系统【源码+sql+可运行】【50721
  • 在安卓开发中,多次点击启动 Service 会有什么问题?
  • 关键成功因素法(CSF)深度解析:从战略目标到数据字典
  • 后训练(Post-training)语言模型
  • NuGet02-包制作及管理
  • 本地部署Nacos开源服务平台,并简单操作实现外部访问,Windows 版本
  • Oracle数据库索引性能机制深度解析:从数据结构到企业实践的系统性知识体系
  • 【python数据结构算法篇】python数据结构
  • 数据库的介绍和安装
  • Qualcomm Linux 蓝牙指南学习--验证 Fluoride 协议栈的功能(2)
  • day59-可观测性建设-zabbix自定义监控项
  • Shell 脚本编程全面学习指南
  • AK视频下载工具:免费高效,多平台支持
  • 解决图片方向混乱问题的自动化处理方案
  • 51c大模型~合集157
  • 《基于单层软皮和高密度电阻抗层析成像的多模态信息结构》论文解读