技术问询:威斯康星癌症数据集上PCA与LDA后逻辑回归的准确率对比
比较PCA与LDA处理后威斯康星癌症数据集上逻辑回归的准确率
嘿,很高兴你已经在PCA降维+逻辑回归的组合上取得了不错的结果!咱们一步步来实现LDA流程,然后直接和你的PCA方案做准确率对比。先明确下:LDA和PCA虽然都是降维方法,但LDA是有监督的——它会利用样本的类别标签信息,专门找能最大化类别分离度的特征方向,特别适配你这种二分类的癌症数据集。
LDA的核心步骤(对应你提到的均值向量、散度矩阵)
- 计算每个类别(恶性/良性)中所有特征的均值向量
- 计算类内散度矩阵(Sw):把每个类别内样本的散度矩阵相加,衡量同一类别样本的离散程度
- 计算类间散度矩阵(Sb):基于类别均值和全局均值的差异,衡量不同类别之间的分离程度
- 求解矩阵
Sw⁻¹Sb的特征值和特征向量,挑选前k个最大特征值对应的特征向量(划重点:二分类问题中,LDA最多只能降到1维,因为Sb的秩最多是「类别数-1」,这里就是2-1=1,没法像PCA那样选10维) - 用特征向量矩阵对原始数据做投影,得到降维后的数据集
- 在降维数据上训练逻辑回归,评估准确率
代码实现与对比
下面用Python+sklearn来完整实现,直接和你用的PCA方案做对比:
1. 导入依赖库
import numpy as np from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA from sklearn.decomposition import PCA from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score, classification_report
2. 数据预处理(标准化+划分数据集)
# 加载威斯康星癌症数据集 data = load_breast_cancer() X, y = data.data, data.target # 标准化:LDA和PCA都对特征尺度敏感,必须先做标准化 scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # 划分训练集/测试集(固定random_state保证对比公平) X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
3. LDA+逻辑回归
# 初始化LDA,二分类问题n_components只能设为1 lda = LDA(n_components=1) X_train_lda = lda.fit_transform(X_train, y_train) # LDA需要传入标签y做监督学习 X_test_lda = lda.transform(X_test) # 训练逻辑回归 lr_lda = LogisticRegression() lr_lda.fit(X_train_lda, y_train) # 评估结果 y_pred_lda = lr_lda.predict(X_test_lda) print("=== LDA+逻辑回归 结果 ===") print(f"准确率: {accuracy_score(y_test, y_pred_lda):.4f}") print("\n分类报告:\n", classification_report(y_test, y_pred_lda))
4. PCA(10主成分)+逻辑回归(你的原有方案)
# 初始化PCA,用你提到的10个主成分 pca = PCA(n_components=10) X_train_pca = pca.fit_transform(X_train) # PCA是无监督,不需要传y X_test_pca = pca.transform(X_test) # 训练逻辑回归 lr_pca = LogisticRegression() lr_pca.fit(X_train_pca, y_train) # 评估结果 y_pred_pca = lr_pca.predict(X_test_pca) print("\n=== PCA(10主成分)+逻辑回归 结果 ===") print(f"准确率: {accuracy_score(y_test, y_pred_pca):.4f}") print("\n分类报告:\n", classification_report(y_test, y_pred_pca))
关键注意点
- 二分类任务中LDA最多只能降到1维,这是数学限制——因为类间散度矩阵的秩等于类别数减一,所以没法像PCA那样保留多个主成分
- LDA利用了类别标签,理论上在分类任务中降维效率更高,往往用更少的维度就能达到和PCA相近甚至更好的准确率
- 两者都必须先做标准化,否则特征尺度差异会严重影响散度矩阵/主成分的计算结果
运行上面的代码后,你就能直接对比两种方案的准确率、精确率和召回率了。一般来说,在这个癌症数据集上,LDA+逻辑回归的表现会和PCA持平甚至略优,毕竟它是为分类任务量身设计的降维方法。
内容的提问来源于stack exchange,提问作者odemane
相关产品推荐
相关产品推荐

