python tsne.transform 不存在?

NoL*_*Man 7 python machine-learning

我正在尝试使用 tsne 转换两个数据集:x_train 和 x_test。我假设这样做的方法是将 tsne 拟合到 x_train,然后转换 x_test 和 x_train。但是,我无法转换任何数据集。

tsne = TSNE(random_state = 420, n_components=2, verbose=1, perplexity=5, n_iter=350).fit(x_train)

我假设 tsne 已安装到 x_train。

但是,当我这样做时:

x_train_tse = tsne.transform(x_subset)

我得到:

AttributeError: 'TSNE' object has no attribute 'transform'

任何帮助将不胜感激。(我知道我可以做fit_transform,但我不会在 x_test 上得到同样的错误吗?)

Dav*_* ND 12

sklearn的文档来看,TSNE 根本没有任何转换方法。

在此处输入图片说明

此外,TSNE 是一种用于维度减少/可视化的无监督方法,因此它实际上不适用于 TRAIN 和 TEST。您只需获取所有数据并使用 fit_transform 进行转换并绘制它。

编辑 - 实际上不可能学习转换并将其重用于不同的数据(即训练和测试),因为 T-sne 不会在较低维空间上学习映射函数,而是在子空间上运行迭代过程以在某些数据上找到最小化损失/距离的平衡。

因此,如果您想对训练和测试数据集进行预处理和降维,那么要走的路是 PCA/SVD 或自动编码器。T-Sne 只会帮助您完成无人监督的任务 :)


小智 8

检查openTSNE。它拥有您所需要的一切。

例如,您还可以使用 pickle.dump 保存训练后的模型。


Joh*_*rry 6

正如接受的答案所说,没有单独的转换方法,并且它可能无法在训练/测试设置中工作。

但是,您仍然可以使用 TSNE,而不会泄露信息。

训练时间

计算训练集上每条记录的 TSNE,并将其用作分类算法中的特征。

测试时间

附加您的训练和测试数据并对 TSNE 进行 fit_transform。现在继续处理您的测试集,使用 TSNE 作为这些记录的功能。

这是否会导致信息泄露?不。

推理时间

新记录以图像或表格行等形式到达。
将新行添加到训练表中,计算 TSNE(即新样本相对于训练样本在空间中的位置)。执行任何其他处理并针对该行运行您的预测。

效果很好。有时,由于 Kaggle 等原因,我们过于担心训练/测试分离。但主要的是你的方法是否可以在推理时复制,并具有与实际使用相同的预期精度。在这种情况下,是的,可以!

唯一的缺点是您需要在推理时提供训练数据库,并且根据大小,预处理可能会很昂贵。