有没有办法用scikitlearn“重新创建”数据?

2024-06-01 19:16:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我的问题是关于用python学习scikit。 假设a有3个特征aBC,其中aB能够预测C

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

有没有一种方法可以让我输入一些C值,并获得实现该C值所需的aB值?几乎是反向输入。如果有办法,怎么叫?(我已经搜索了很多信息,到现在为止,我还没有找到任何关于它的信息,如果我的问题已经存在的话,我很抱歉)


Tags: 方法信息特征scikitpredictfit办法examplemodel
1条回答
网友
1楼 · 发布于 2024-06-01 19:16:22

是的,有可能!你知道吗

但是你需要非常清楚你想要什么:A、B和C之间有什么关系-决定什么是合适的预测模型。你知道吗

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

这并不适用于所有模型,它对每个模型的工作方式都不同,并且它不是直接在sciketlearn中实现的。换句话说,你将不得不做一些手工工作,你需要知道你在做什么。特别是,您需要了解您正在使用的模型。没有顺其自然的解决办法。你知道吗

假设AB是连续特征,C是离散的0或1。在这种情况下,合适的模型应该是分类器。我们进一步假设AB对于不同的C很好地聚集在不同的blob中。在这种情况下,线性分类器可以工作。你知道吗

我将用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

相关问题 更多 >