是的,有可能!
但是你需要非常清楚你想要什么: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()