我正在尝试为TSNE创建一个自定义函数,以便它可以用于Sklearn make_pipeline函数中。
一般来说,对于常设仲裁院,我要做以下几点:
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发布于 2019-01-19 10:42:33
你是对的,但你不应该这么做!
PCA
PCA通过寻找最大方差的轴来创建嵌入:给定训练集,找到方向(轴的线性组合(x、y、z等))数据变化很大的地方。拟合的主成分分析结果是k个方向(轴的k个线性组合)(它是sklearn中的.components属性)。然后,可以通过将线性组合应用到测试点来转换测试数据。
TSNE
另一方面,TSNE创建了低维嵌入,试图尊重(在一定程度上)真实维度中各点之间的距离。TSNE不考虑点在高维空间中的位置,它只看点与它的邻居之间的距离。试着在低矮的空间里尊重这些关系。
这就是为什么Sklearn没有针对该类的转换函数,您不能使用TSNE转换数据:TSNE转换函数需要首先适应数据。
回到你的问题
如果您使用带有训练/测试拆分的管道,则TSNE对象将在测试时使用测试数据进行重新培训!而且,没有理由认为嵌入看起来与与训练数据匹配的相同(同样,因为嵌入取决于训练期间给定的点数)。您的ML模型的性能应该是不好的!
如果你真的想使用TSNE,然后机器学习,你必须适应转换整个数据集的训练和测试:但是请记住,您的机器学习功能将是无用的,因为您泄露了测试数据!
https://stackoverflow.com/questions/54263591
复制相似问题