Python 如何覆盖Sklearn';将在管道函数中使用的TSNE?

Python 如何覆盖Sklearn';将在管道函数中使用的TSNE?,python,scikit-learn,overriding,pipeline,Python,Scikit Learn,Overriding,Pipeline,我正在尝试为TSNE创建一个自定义函数,以便可以在Sklearn make_管道函数中使用它 一般来说,对于PCA,我将执行以下操作: make_pipeline(PCA(), LinearRegression()) 然而,当我尝试这一点时: make_pipeline(TSNE(), LinearRegression()) 我会得到一个错误,说它没有transform()方法,并且不能使用fit_transform()方法。因此,现在

我正在尝试为TSNE创建一个自定义函数,以便可以在Sklearn make_管道函数中使用它

一般来说,对于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

关于修复,你是对的,但是你不应该这样做

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

TSNE 另一方面,TSNE创建低维嵌入,尝试尊重(在某个级别上)真实维度中点之间的距离。TSNE不考虑点在高维空间中的位置,只考虑点与其相邻点之间的距离。并尽量在低亮度空间中尊重这些关系。
这就是Sklearn没有该类的转换函数的原因,您不能使用TSNE转换数据:TSNE转换函数需要首先适应数据

  • 如果您想了解更多信息,请查看这篇非常好的文章:
回到你的问题上来 如果将管道用于训练/测试拆分,则TSNE对象将在测试时使用测试数据重新训练!并且没有理由认为嵌入看起来与使用训练数据的嵌入相同(同样,因为嵌入取决于训练期间给出的点)。您的ML模型的性能应该很差


如果你真的想使用TSNE,然后使用机器学习,你必须适应转换整个数据集的训练和测试:但请记住,你的机器学习功能将是无用的,因为你泄漏了测试数据

我添加了另一个名为fit()的方法,看起来它现在正在工作。我的badI在@Mike描述的每个方法中都添加了“self”,因此我最终得到了:
类TSNE_包装器(TSNE):def-transform(self,X):return-TSNE().fit(X)def-fit(self):return-TSNE().fit()