我是否应该对整个数据集执行线性判别分析以降低维数?

时间:2016-10-28 09:11:41

标签: python scikit-learn lda dimensionality-reduction

我不明白如何使用LDA来减少维数。

我有一个75x65矩阵,有64个功能,1列用于类索引。可以找到此矩阵here

我正在尝试使用LDA来降低维度,使用sklearn中的this function

def classify(featureMatrix):
    X, y = featureMatrix[:, :63], featureMatrix[: ,64]
    X_train, X_test, y_train, y_test = train_test_split(X,  y, test_size=0.20)
    lda = LinearDiscriminantAnalysis(n_components=2)
    rf = RandomForestClassifier(n_estimators=10, criterion="gini", max_depth=20)

    X_train = lda.fit_transform(X_train, y_train)
    X_test = lda.transform(X_test)

    rf.fit(X_train, y_train)
    print rf.score(X_test, y_test)

然而,我的分类评分通常较低(20-30%)。问题似乎是我转换测试数据时。

例如,当我在降维后绘制X_train时,我有:

enter image description here

哪个班级分离良好。

但是当我转换测试集并绘制X_test时,我有这个:

enter image description here

其中没有明显的模式,与我们在训练数据集中看到的情况相差甚远。

我假设这可能是一个小数据集的结果(只有75个样本平均分布在5个类中),但遗憾的是这些数据很难收集。

在尝试将训练/测试集中的数据集分开并将其与另一个分类器分类之前,我从不同的地方读过人们在所有数据集上使用LDA(这样我可以实现不到10%的误差),但是我还听到很多人说我应该使用我在代码中提到的方式。如果我只使用LDA来降低维数,哪种方法是正确的?

1 个答案:

答案 0 :(得分:0)

基于这个壮观的repository/book,您应该将LDA放在训练数据集上,然后使用之前较小的拟合来转换训练和测试数据集。