我试图预测金属线圈的质量。我有宽10米,长1到6公里的金属线圈。作为培训数据,我每10米测量600个参数,最终质量控制分数-好/坏(整个线圈)。坏的意思是至少有一个地方有线圈坏了,没有数据确切地在哪里。我有大约10000卷的数据。
假设我们想要训练这个数据的逻辑回归(有2个因素)。
X = [[0, 0],
...
[0, 0],
[1, 1], # coil is actually broken here, but we don't know it yet.
[0, 0],
...
[0, 0]]
Y = ?????
我不能把所有的“坏”都放在Y中并运行分类器,因为对于分类器我会感到困惑。我不能把所有的“好”和一个“坏”放在你的位置,因为我不知道哪里是坏的位置。
我想到的解决方案是,我可以定义损失函数为和((Y-min(F(x1,x2)))^2)(由属于一个线圈的所有F计算的最小值)而不是和((Y-F(x1,x2))^2)。在这种情况下,我可能会得到正确的训练,指出不好的地方。我需要梯度,它不可能在所有点上都计算,最小值在所有地方都不可微,但是我可以用弱梯度代替(使用在每个地方线圈中最小的函数值)。
我或多或少知道如何自己实现它,问题是在python中使用scikit learn最简单的方法是什么。理想情况下,它应该与几种学习方法(许多基于损失函数和梯度的方法)相同(或易于适应),是否可以为这种方式工作的学习方法制作一些包装器?
更新:查看gradient_boosting.py-有一个内部抽象类LossFunction,可以计算损耗和梯度,looks perspective。看来没有共同的解决办法。
最佳答案
你在这里考虑的是在机器学习社区中被称为超集学习,这意味着,你有{(x,y,i)}形式的训练集而不是典型的监督设置,你有{({x,u 1,…,x,N},y,1)}这样你就知道集合中至少有一个元素具有y,1属性。这不是一个非常常见的设置,但现有的,有一些研究可用,谷歌的论文在该领域。
就你自己的损失功能而言-scikit学习是不可能的。ScKIT的学习是关于简单性的,它为您提供了一组非常灵活的随时可用的工具。它不是一个研究工具,你的问题是研究。你能用什么代替?我建议您使用任何符号差异化解决方案,例如autograd它使您能够通过python代码进行差异化,只需在其上应用scipy.optimize.minimize就可以了!任何自定义丢失功能都可以正常工作。
另一方面,最小算子是不可微的,因此模型可能很难搞清楚发生了什么。相反,你可以尝试做sum((Y - prod_x F(x_1, x_2) )^2)
,因为乘法是很好的可微的,你仍然会得到类似的效果-如果至少有一个元素被预测为0,它将从其余的元素中删除任何“1”答案。你甚至可以更进一步使它在数值上更稳定,并且:
if Y==0 then loss = sum_x log(F(x_1, x_2 ) )
if Y==1 then loss = sum_x log(1-F(x_1, x_2))
也就是说
Y * sum_x log(1-F(x_1, x_2)) + (1-Y) * sum_x log( F(x_1, x_2) )
你可以注意到交叉熵代价的相似性,这非常有意义,因为你的问题确实是一个分类。现在你有了完美的概率损失-你附加了每个段是“坏”或“好”的概率,所以整个对象坏的概率要么高(如果Y==0),要么低(如果Y==1)。