有没有办法用scikit-learn“重新创建”数据?

时间:2017-08-02 00:59:27

标签: python machine-learning scipy scikit-learn prediction

我的问题是关于python中的scikit-learn。 假设a有3个功能 A B C A B 能够用:

预测 C
exampleModel.fit(AandB, C) 
exampleModel.predict(C) 

我有没有办法输入一些 C 值,并获得实现所需的 A B 值C 值?几乎相反地输入它。如果有办法,怎么称呼? (我已经搜索了很多这方面的信息,直到现在,我还没有发现任何相关内容,如果我的问题已经存在,很抱歉)

1 个答案:

答案 0 :(得分:1)

是的,这是可能的!

但你需要非常明确你想要的: A B C 相关 - 决定什么是适当的预测模型。

你还需要意识到,不可能是一个完美的"重建。 A B 通常比 C 更丰富。除非它们非常受限制(例如 A B 之间的高度相关性),否则从AB到C时会丢失一些信息。此信息无法恢复。

这不适用于所有模型,它对每个模型的工作方式都不同,并且不会直接在scikit-learn中实现。换句话说,你将不得不做一些手工工作,你需要知道你在做什么。特别是,您需要了解您正在使用的模型。没有任何可靠的解决方案。

我们假设 A B 是连续的特征,而 C 是离散的0或1.在这种情况下,适当的模型将是一个分类器。让我们进一步假设 A B 群集在不同的blob中适用于不同的 C 。在这种情况下,线性分类器可以工作。

我将提供Linear Discriminant Analysis的示例。它通过将类中心线性投影到最具辨别力的方向来工作。一般来说,我们需要反转这一预测,但我们很幸运,因为LDA暴露了原来的班级中心。要从给定的 C 中获取原始要素的表示,我们只需要找到正确的类中心。

import numpy as np
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt

np.random.seed(7)


def inverse_lda(lda, C):
    c = np.flatnonzero(model.classes_ == C)
    return model.means_[c]


AB, C = make_blobs(n_samples=333, n_features=2, centers=2)  # toy data
A, B = AB.T

plt.scatter(A, B, c=C, alpha=0.5)
plt.xlabel('A')
plt.ylabel('B')

model = LDA(store_covariance=True).fit(AB, C)

# reconstruct A and B for C=[0, 1]
ABout = inverse_lda(model, C=[0, 1])

plt.plot(ABout[0, 0], ABout[0, 1], 'o', label='C=0')
plt.plot(ABout[1, 0], ABout[1, 1], 'o', label='C=1')
plt.legend()

enter image description here