我的问题是关于python中的scikit-learn。 假设a有3个功能 A , B 和 C , A 和 B 能够用:
预测 CexampleModel.fit(AandB, C)
exampleModel.predict(C)
我有没有办法输入一些 C 值,并获得实现所需的 A 和 B 值C 值?几乎相反地输入它。如果有办法,怎么称呼? (我已经搜索了很多这方面的信息,直到现在,我还没有发现任何相关内容,如果我的问题已经存在,很抱歉)
答案 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()