scikit-学习改变X和Y的自定义变压器/管道

时间:2016-01-11 17:21:59

标签: python scikit-learn pipeline

我有一组N个数据点X = {x 1 ,...,x n }和一组N个目标值/类Y = { y 1 ,...,y n }。

给定y i 的特征向量是在考虑到"窗口的情况下构建的。 (缺乏更好的术语)数据点,例如我可能想要堆叠"最后4个数据点",即x i-4 ,x i-3 ,x i-2 ,x i-1 用于预测y i

显然,对于4的窗口大小,不能为前三个目标值构建这样的特征向量,我想简单地删除它们。同样,对于最后一个数据点x n

这不会有问题,除非我希望将其作为sklearn管道的一部分进行。到目前为止,我已成功为其他任务编写了一些自定义变换器,但那些(据我所知)不能改变Y矩阵。

有没有办法做到这一点,我没有意识到或者我是否坚持这样做作为管道之外的预处理? (这意味着,我无法使用GridsearchCV来找到最佳窗口大小和移位。)

我试过搜索这个,但我想出的只是this question,它处理从X矩阵中删除样本。那里接受的答案让我觉得,我想做的事情在scikit-learn中不受支持,但我想确定。

3 个答案:

答案 0 :(得分:2)

你是对的,你无法在sklearn Pipeline中调整你的目标。这并不意味着你不能进行网格搜索,但它确实意味着你可能不得不以一种手工方式来解决它。我建议编写一个函数对y进行转换和过滤,然后手动循环通过ParameterGrid创建的调整网格。如果您使用您拥有的代码编辑帖子以获得进一步的帮助,则没有意义。

答案 1 :(得分:1)

我正在努力解决类似的问题,并且发现不幸的是你无法传递变形金刚之间的y值。话虽如此,我以一种肮脏的方式绕过了这个问题。

我将y值存储为变换器的实例属性。这样,当管道调用fit_transform时,我可以在transform方法中访问它们。然后,变换方法传递一个元组(X,self.y_stored),这是下一个估计器所期望的。这意味着我必须编写包装器估算器并且它非常难看,但它有效!

答案 2 :(得分:0)

对于堆叠最后4个数据点的特定示例,您可以使用seglearn

>>> import numpy as np
>>> import seglearn
>>> x = np.arange(10)[None,:]
>>> x
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
>>> y = x
>>> new_x, new_y, _ = seglearn.transform.SegmentXY(width=4, overlap=0.75).fit_transform(x, y)
>>> new_x
array([[0, 1, 2, 3],
       [1, 2, 3, 4],
       [2, 3, 4, 5],
       [3, 4, 5, 6],
       [4, 5, 6, 7],
       [5, 6, 7, 8],
       [6, 7, 8, 9]])
>>> new_y
array([3, 4, 5, 6, 7, 8, 9])

seglearn声称是scikit-learn兼容的,因此您应该能够将SegmentXY安装在scikit-learn管道的开头。但是,我自己还没有在管道中尝试过。