sklearn中的线性判别分析无法减小特征尺寸

时间:2018-10-22 07:07:14

标签: python scikit-learn

据我了解,线性判别分析(LDA)是一种减少输入特征数量的技术。 Wiki也声明相同的内容

  

线性判别分析(LDA),正则判别分析(NDA)或判别函数分析是Fisher线性判别的泛化,这是一种用于统计,模式识别和机器学习的方法,用于找到表征或表征特征的线性组合分离两个或更多类的对象或事件。所得组合可以用作线性分类器,或更常见的是,可以在以后的分类之前用于降维。

但是,当我尝试使用LinearDiscriminantAnalysis中的sklearn.discriminant_analysis时,我无法获得功能简化的数据。

from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split
import numpy as np
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

X, y = make_blobs(40000,600,2,cluster_std=20,random_state=101)
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3,random_state=101)

model = LinearDiscriminantAnalysis(n_components=100)
model.fit(X_train,y_train)

X_train_new = model.transform(X_train)
print(X_train_new.shape)
>>> (28000, 1)

我的原始数据具有600个特征,我想使用LDA将其减少到仅100个特征。但是LDA中的sklearn给了我形状(28000,1)。

为什么LDA转换后只有1个特征?我在做什么错了?

1 个答案:

答案 0 :(得分:2)

您的LDA将您的数据集仅转换为一个特征,因为LDA将转义n_components > (n_classes - 1)。 在这里,您有两个类=> 2 - 1 = 1 feature。 请参阅LDA for two classes on Wikipedia

例如,将中心数更改为200,您会看到其中的区别

Xx, yy = make_blobs(40000, 600, centers=200, cluster_std=5)
X_train, X_test, y_train, y_test = train_test_split(Xx, yy, test_size=0.3)
model = LinearDiscriminantAnalysis(n_components=100)
model.fit(X_train, y_train)
X_train_new = model.transform(X_train)
print(X_train_new.shape)
>> (28000, 100)

否则使用PCASVD

from sklearn.decomposition import TruncatedSVD
svd = TruncatedSVD(n_components=100)
X_train_new = svd.fit_transform(X_train)
svd.explained_variance_ratio_.sum() # should be > 0.90
print(X_train_new.shape)
>>> (28000, 100)