keras 体育博彩的自定义输功能

ttvkxqim  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(133)

我试图建立一个模型来预测最赚钱的网球比赛,为此我将投注赔率纳入yTrue变量,所以它看起来像这样:
yTrue = np.array([[0,1,1.38,3.05],[1,0,1.05,7.85],[1,0,1.04,10.24],[1,0,1.22,3.71],[1,0,1.06,6.69],[1,0,1.48,2.46],[0,1,1.61,2.22]])
y真[0]和y真[1]:最受欢迎的/受冷落的赢/输
y真[2]和y真[3]:获胜者/失败者的赔率
假设赌注是1000单位,那么在我们的数据集中:第一场和最后一场比赛都是失败者赢了,其他游戏都是最受欢迎的。如果我们在所有7场比赛中下注1000个单位,并且所有比赛都是好的,我们将获得4120.0个单位的利润,所以这是最大可实现的利润。假设预测是这样的:yPred = np.array([[0,1], [0,1],[1,0],[1,0],[0,1],[1,0],[1,0]]) 7个预测中有4个是正确的,因此总共将损失-210.0个单位。
在普通的Python中,loss函数可能如下所示:

import numpy as np
yTrue = np.array([[0,1,1.38,3.05],[1,0,1.05,10.24],[1,0,1.04,7.85],[1,0,1.22,3.71],[1,0,1.06,6.69],[1,0,1.48,2.46],[0,1,1.61,2.22]])
yPred = np.array([[0,1], [0,1],[1,0],[1,0],[0,1],[1,0],[1,0]])

def myLoss(yTrue, yPred):
        maxPotentialProfit = 0
        realProfit = 0
        betUnits = 1000
        for a in range(0,len(yTrue)):
                bet = yTrue[a]
                pred = yPred[a]
                favOdds = bet[2]-1
                dogOdds = bet[3]-1
                if bet[0] == 1:
                        maxPotentialProfit += favOdds*betUnits
                else:
                        maxPotentialProfit += dogOdds*betUnits

                if bet[0] == 1 and pred[0] == 1:
                        realProfit += favOdds*betUnits
                elif bet[1] == 1 and pred[1] == 1:
                        realProfit += dogOdds*betUnits
                else:
                        realProfit -=betUnits

        return maxPotentialProfit - realProfit

但现在真实的的交易:我怎样才能使它具有可微性,以便与Keras一起工作?:)

rggaifut

rggaifut1#

1.一个模型的预测永远不会出现在0或1这两个极端,而是介于两者之间;预测越接近极值意味着模型越可信。
1.同时存储最受欢迎者/失败者的赢/输是很浪费的,因为赢+输= 1,你只需要存储一个变量,然后推导出另一个变量。
因此,您的数据应如下所示:

# 1 = favorite wins, 0 = underdog wins / favorite odd / underdog odd
yTrue = np.array([[0, 1.38, 3.05], [1, 1.05, 10.24],[1, 1.04, 7.85]])

# the predicted probability that favorite wins
yPred = np.array([0.7, 0.8, 0.9])

1.除非您希望betUnits成为模型预测的一部分,否则没有必要将其包含在损失函数中,因为它不会影响训练。

  1. Keras本地计算maxPotentialProfit的方法是
import keras.backend as K

# split yTrue into 3 columns for easy handling
result = yTrue[:, 0]
favOdds = yTrue[:, 1]
dogOdds = yTrue[:, 2]

# logic: check each element in result, 
# if 1, add the corresponding element in favOdds,
# else, add the corresponding element in dogOdds.
maxPotentialProfit = K.sum(K.switch(result==1, favOdds, dogOdds))

1.由于预测值永远不会是0或1,像if bet[0] == 1 and pred[0] == 1这样的条件就不起作用了,所以我们将输出值(比如0.7)解释为模型在最受欢迎者身上下注0.7个单位,在失败者身上下注0.3个单位。

# split the prediction
favPred = yPred
dogPred = 1 - yPred

# logic: check each element in result,
# if 1, add the corresponding element of favOdds*favPred,
# else, add the corresponding element of dogOdds*dogPred
realProfit = K.sum(K.switch(result==1, favOdds*favPred, dogOdds*dogPred))

# initial cost of betting: 1 for each bet
realProfit -= yPred.shape[0] # this is keras' equivalent of len()
# However, since this value is independent of the values yPred,
# it will have no effects on the training whatsoever, so we can remove it.

return maxPotentialProfit - realProfit

1.你可能注意到maxPotentialProfitrealProfit的计算非常相似,所以我们可以把它们合并在一行中,而不是单独计算。
下面是完整的代码:

import keras.backend as K

def myLoss(yTrue, yPred):
    result = yTrue[:, 0]
    favOdds = yTrue[:, 1]
    dogOdds = yTrue[:, 2]
    favPred = yPred
    dogPred = 1 - yPred
    return K.sum(K.switch(result==1, favOdds*(1-favPred), dogOdds*(1-dogPred)))

1.就这样,只是一个提示:你不能在一些numpy数组上调用myLoss来测试,因为它需要KerasTensor作为输入,你需要建立一个Keras模型,并使用myLoss作为损失函数来观察它的工作,但这超出了这个问题的范围。

相关问题