我试图建立一个模型来预测最赚钱的网球比赛,为此我将投注赔率纳入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一起工作?:)
1条答案
按热度按时间rggaifut1#
1.一个模型的预测永远不会出现在0或1这两个极端,而是介于两者之间;预测越接近极值意味着模型越可信。
1.同时存储最受欢迎者/失败者的赢/输是很浪费的,因为赢+输= 1,你只需要存储一个变量,然后推导出另一个变量。
因此,您的数据应如下所示:
1.除非您希望
betUnits
成为模型预测的一部分,否则没有必要将其包含在损失函数中,因为它不会影响训练。maxPotentialProfit
的方法是1.由于预测值永远不会是0或1,像
if bet[0] == 1 and pred[0] == 1
这样的条件就不起作用了,所以我们将输出值(比如0.7)解释为模型在最受欢迎者身上下注0.7个单位,在失败者身上下注0.3个单位。1.你可能注意到
maxPotentialProfit
和realProfit
的计算非常相似,所以我们可以把它们合并在一行中,而不是单独计算。下面是完整的代码:
1.就这样,只是一个提示:你不能在一些numpy数组上调用
myLoss
来测试,因为它需要KerasTensor作为输入,你需要建立一个Keras模型,并使用myLoss
作为损失函数来观察它的工作,但这超出了这个问题的范围。