【问题标题】:How to use scipy optimize with your own function?如何将 scipy 优化与您自己的功能一起使用?
【发布时间】:2017-06-19 21:10:01
【问题描述】:

我将 3 个不同指标的分数组合成一个权重,我想使用 scipy 的优化来确定组合时权重的最佳系数(而不是平等对待它们并取平均值,这就是我以前做的)。下面代码中显示的 CV 函数处理实现交叉验证和计算反应的预测(其中反应只是“喜欢”或“不喜欢”)。

weight = A*(metric1) + B*(metric2) + C*(metric3)
prediction = CV(post, reaction, weight)

我想最大化我的accuracy,或最小化1 - accuracy,其中accuracy = accuracy_score(reaction, prediction)。我查看了 scipy 优化/最小化的文档,虽然我理解了一般想法,但我不确定如何将我的想法转化为实际代码。例如,一个令人困惑的领域是我想最小化“1-accuracy”,但准确性是由前面处理预测的部分决定的。任何帮助将不胜感激,并且一如既往,代码将非常有帮助:)

【问题讨论】:

  • (1) 从目前的形式来看,这个问题看起来更像是一个关于你的 CV 实现的问题,而不是 scipy (2) 它有点隐藏了你如何做 CV 以及如何在这里使用它,但你的优化必须永远不要在验证集上完成,只在训练集或 CV 失败的目的上完成。所以它再次高度依赖于你的简历程序。 (3) 我不确定优化准确性是否容易。如果没有更多分析,我认为它不适合连续凸选择案例(对于离散选择来说,scipy 并不多)。(4)使用这种加权形式的准确性听起来是错误的(需要阈值
  • 您想要最小化的一个值是什么(即成本),什么变量(它可能是一个数组(1d?))?该函数的所有其他参数都是argsminimize 是改变 x 的值,直到它最小化成本。

标签: python optimization scipy prediction


【解决方案1】:

您似乎想要在以下伪代码中执行类似的操作:

def loss(x, *args):
    A, B, C = x
    weight = A*metric1 + B*metric2 + C*metric3
    prediction = CV(post, reaction, weight)
    return -accuracy_score(reaction, prediction)
# equal initial weighting
x0 = [1, 1, 1]
scipy.optimize.minimize(loss, x0, args=args)

基本上,您要最小化的损失函数应该采用您正在优化的参数(这里:权重)并返回一个标量衡量它们的好坏(这里:减去准确度分数)。因此,确定取决于参数的损失所需的所有计算都应该在损失函数内。如果计算的某些部分不依赖于权重,您当然可以通过在函数之外预先计算来加快速度。

【讨论】:

    猜你喜欢
    • 2017-02-07
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 2017-07-20
    相关资源
    最近更新 更多