我正在尝试为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
答案 0 :(得分:1)
您对这个修复程序是正确的,但是您不应该这样做!
PCA通过找到使方差最大的轴来创建嵌入: 给定训练集,您会发现方向(数据(x,y,z等的线性组合))变化很大。拟合PCA的结果是k个方向(轴的k个线性组合)(这是sklearn中的.components属性)。然后,您可以通过将线性组合应用于测试点来转换测试数据。
如果您将管道用于训练/测试分组,则TSNE对象将在测试时使用测试数据进行训练!而且没有理由使嵌入看起来与装有训练数据的嵌入相同(同样,因为嵌入取决于训练过程中给出的点)。您的ML模型的性能应该很差!
如果您真的想使用TSNE然后进行机器学习,则必须适应转换整个数据集训练和测试:但是请记住,由于您泄漏了测试数据,因此机器学习功能将毫无用处!