如何覆盖将在管道功能中使用的Sklearn的TSNE?

时间:2019-01-19 02:27:11

标签: python scikit-learn override pipeline

我正在尝试为TSNE创建自定义函数,以便可以在Sklearn make_pipeline函数中使用它。

通常,对于PCA,我会执行以下操作:

make_pipeline(PCA(),
              LinearRegression())

但是,当我尝试这样做时:

make_pipeline(TSNE(),
              LinearRegression())

我会得到一个错误,说它没有transform()方法,并且它不能使用fit_transform()方法。因此,现在我正在尝试使用以下方法创建自定义的transform()方法:

class TSNE_wrapper(TSNE):
  def transform(X):
    return TSNE().fit_transform(X)

但是我遇到了这个错误:

transform() takes 1 positional argument but 2 were given

1 个答案:

答案 0 :(得分:1)

您对这个修复程序是正确的,但是您不应该这样做!

PCA

PCA通过找到使方差最大的轴来创建嵌入: 给定训练集,您会发现方向(数据(x,y,z等的线性组合))变化很大。拟合PCA的结果是k个方向(轴的k个线性组合)(这是sklearn中的.components属性)。然后,您可以通过将线性组合应用于测试点来转换测试数据。

TSNE

另一方面, TSNE创建低维嵌入,试图嵌入(在一定级别上)真实维中点之间的距离。 TSNE不会考虑点在高维空间中的位置,而只会查看该点与其相邻点之间的距离。并尝试在低调的空间中尊重这些关系。
这就是为什么Sklearn没有该类的转换函数,无法使用TSNE转换数据的原因:TSNE转换函数需要首先适合数据。

回到您的问题

如果您将管道用于训练/测试分组,则TSNE对象将在测试时使用测试数据进行训练!而且没有理由使嵌入看起来与装有训练数据的嵌入相同(同样,因为嵌入取决于训练过程中给出的点)。您的ML模型的性能应该很差!

如果您真的想使用TSNE然后进行机器学习,则必须适应转换整个数据集训练和测试:但是请记住,由于您泄漏了测试数据,因此机器学习功能将毫无用处!