首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何覆盖Sklearn的TSNE以用于管道功能?

如何覆盖Sklearn的TSNE以用于管道功能?
EN

Stack Overflow用户
提问于 2019-01-19 02:27:10
回答 1查看 1.4K关注 0票数 4

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

一般来说,对于常设仲裁院,我要做以下几点:

代码语言:javascript
复制
make_pipeline(PCA(),
              LinearRegression())

然而,当我尝试这样做时:

代码语言:javascript
复制
make_pipeline(TSNE(),
              LinearRegression())

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

代码语言:javascript
复制
class TSNE_wrapper(TSNE):
  def transform(X):
    return TSNE().fit_transform(X)

但我发现了一个错误:

代码语言:javascript
复制
transform() takes 1 positional argument but 2 were given
EN

回答 1

Stack Overflow用户

发布于 2019-01-19 10:42:33

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

PCA

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

TSNE

另一方面,TSNE创建了低维嵌入,试图尊重(在一定程度上)真实维度中各点之间的距离。TSNE不考虑点在高维空间中的位置,它只看点与它的邻居之间的距离。试着在低矮的空间里尊重这些关系。

这就是为什么Sklearn没有针对该类的转换函数,您不能使用TSNE转换数据:TSNE转换函数需要首先适应数据。

  • 如果您需要更多信息:http://mlexplained.com/2018/09/14/paper-dissected-visualizing-data-using-t-sne-explained/,请查看这篇非常好的文章

回到你的问题

如果您使用带有训练/测试拆分的管道,则TSNE对象将在测试时使用测试数据进行重新培训!而且,没有理由认为嵌入看起来与与训练数据匹配的相同(同样,因为嵌入取决于训练期间给定的点数)。您的ML模型的性能应该是不好的!

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54263591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档