【问题标题】:How to perform prediction with LDA (linear discriminant) in scikit-learn?如何在 scikit-learn 中使用 LDA(线性判别)进行预测?
【发布时间】:2015-09-15 11:02:07
【问题描述】:

我一直在测试 PCA 和 LDA 在分类我想要自动识别的 3 种不同类型的图像标签方面的效果。在我的代码中,X 是我的数据矩阵,其中每一行是图像中的像素,y 是一维数组,说明每一行的分类。

import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.decomposition import PCA
from sklearn.lda import LDA

pca = PCA(n_components=2)
X_r = pca.fit(X).transform(X)

plt.figure(figsize = (35, 20))
plt.scatter(X_r[:, 0], X_r[:, 1], c=y, s=200)

lda = LDA(n_components=2)
X_lda = lda.fit(X, y).transform(X)
plt.figure(figsize = (35, 20))
plt.scatter(X_lda[:, 0], X_lda[:, 1], c=y, s=200)

使用 LDA,我最终得到了 3 个清晰可辨的集群,它们之间只有轻微的重叠。现在,如果我有一个要分类的新图像,一旦将其转换为一维数组,我如何预测它应该落入哪个簇,如果它离中心太远,我怎么能说分类是“不确定的” “?我也很好奇“.transform(X)”函数对我的数据做了什么。

【问题讨论】:

    标签: python machine-learning scikit-learn pca linear-discriminant


    【解决方案1】:

    使用一些数据X 训练 LDA 模型后,您可能想要投影一些其他数据 Z。在这种情况下,您应该做的是:

    lda = LDA(n_components=2) #creating a LDA object
    lda = lda.fit(X, y) #learning the projection matrix
    X_lda = lda.transform(X) #using the model to project X 
    # .... getting Z as test data....
    Z = lda.transform(Z) #using the model to project Z
    z_labels = lda.predict(Z) #gives you the predicted label for each sample
    z_prob = lda.predict_proba(Z) #the probability of each sample to belong to each class
    

    请注意,“拟合”用于拟合模型,而不是拟合数据

    所以transform 用于构建表示(在本例中为投影),predict 用于预测每个样本的标签。 (这用于从 sklearn 中的BaseEstimator 继承的所有类。

    您可以阅读documentation 了解更多选项和属性。

    此外,sklearn 的 API 允许您使用 pca.fit_transform(X) 而不是 pca.fit(X).transform(X)。当您在代码中的这一点之后对模型本身不感兴趣时​​,请使用此版本。

    几个cmets: 由于 PCA 是 Unsupervised approach,因此 LDA 是一种更好的方法来执行您当前正在执行的这种“视觉”分类。

    此外,如果您对分类感兴趣,可以考虑使用不同类型的分类器,不一定是 LDA,尽管它是一种很好的可视化方法。

    【讨论】:

    • 非常感谢您的帮助!概率预测很棒。你对 PCA 和 LDA 的看法也是对的——当我用这两种方法进行绘图时,PCA 并没有真正聚类好,但是 LDA 方法产生了 3 个几乎没有重叠的漂亮聚类:)
    • @JackSimpson No Prob :) 很高兴它对你有所帮助
    • 我运行代码并得到以下错误:“ValueError: X has 2 features per sample; expecting 256”(这是我有多少列)。因此,我删除了“Z = lda.transform(X)”并对原始数据本身进行了标签和概率预测,而没有对其进行转换,它似乎可以工作。我得到了每个类的预测列表(1、2 或 3),对于概率,我得到了一个数组,每行有 3 个值,这必须意味着它属于 3 种标签类型中的任何一种的概率。它看起来像这样:[9.81963930e-01 1.80360699e-02 4.09434909e-14]
    • 这些概率看起来合理吗?它们看起来都很小,我正在寻找最大的价值,对吗?
    • 噢!大量的大脑放屁,啊,我已经习惯了将少量的 - 标志联系起来,我没有检查之后发生了什么。谢谢你把我拉起来。顺便说一句,我在我的测试数据集上使用了你的转换步骤,并使用了 SVM,准确率高达 94.5%!
    猜你喜欢
    • 2019-05-21
    • 2014-06-10
    • 2018-03-21
    • 1970-01-01
    • 2013-05-31
    • 2015-08-01
    • 2022-09-27
    • 2018-07-31
    • 2017-05-09
    相关资源
    最近更新 更多