【问题标题】:How to override Sklearn's TSNE to be used in a Pipeline function?如何覆盖 Sklearn 的 TSNE 以在管道功能中使用?
【发布时间】:2019-06-13 06:52:02
【问题描述】:

我正在尝试为 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

【问题讨论】:

  • 我添加了另一个名为 fit() 的方法,看起来它现在可以工作了。我的坏
  • 我在@Mike 描述的每个方法中都添加了“self”,所以我最终得到:class TSNE_wrapper(TSNE): def transform(self, X): return TSNE().fit_transform(X) def fit(self): return TSNE().fit()

标签: python scikit-learn overriding pipeline


【解决方案1】:

你是对的,但你不应该这样做!

主成分分析

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

TSNE

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

回到你的问题

如果您使用带有训练/测试拆分的管道,TSNE 对象将在测试时使用测试数据重新训练!并且没有任何理由认为嵌入看起来与适合训练数据的嵌入相同(同样,因为嵌入取决于训练期间给出的点)。您的 ML 模型的性能应该很差!

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 2016-08-20
    • 2018-02-16
    • 2014-11-07
    • 2018-05-03
    • 1970-01-01
    相关资源
    最近更新 更多