预测评分系统算法

时间:2019-07-03 20:14:44

标签: java algorithm machine-learning data-modeling scoring

我正在尝试为预测联盟编写通用评分系统。我为评分系统定义了一个模型(几乎完全完成)。计分系统基于联赛。一个联赛将拥有一个super_user定义的League_scoring系统。我不认为除了创建预定义的属性集外,还没有其他方法可以解决此问题,然后用户为该属性分配点(或者存在?)。联赛得分将决定如何为一组预测(用户预测)计算预测系列。联赛得分也可以具有一组League_questions,具有一个Question和操作员类型的答案(是/否,字符串或数字)的额外预测类型问题以及分配给该问题的多个分数。因此,如果用户预测该问题的答案,他们将获得分配的分数,例如“游戏Y中印度将获得多少检票口”。

我创建了数据模型,我刚刚复制了得分部分,因为我认为不需要其他模型来理解我的问题。

enter image description here

我提供了用于预测序列计算的代码。本质上是为给定用户预定义的预测列表。迭代每个用户的预测,将其与实际(当前/全职)结果进行比较,并更新排名(表格)。

  List<Prediction> predictionsForCurrentResultList = predictionsByUserMap.get(result.equalsFixture());
        if(predictionsForCurrentResultList != null) {
            for (Prediction prediction : predictionsForCurrentResultList) {
                logger.info("Prediction is " + prediction);
                logger.info("Result is              " + result);
                Standing tmpStanding = userStandingMap.get(prediction.getPlayerId().trim().toUpperCase());
                if(tmpStanding == null) {
                    tmpStanding = new Standing();
                    tmpStanding.setPlayerId(prediction.getPlayerId());
                }
                boolean wrongResult = true;
                if(prediction.equalsFixture().equals(result.equalsFixture())) {
                    if(prediction.equalsString().equals(result.equalsString())) {
                        tmpStanding.setCorrectScores(leagueScoring.getCorrectScorePoints());
                        wrongResult = false;
                    }
                    if(prediction.getHomeTeamScore().equals(result.getHomeTeamScore())) {
                        tmpStanding.setHomeScorePoints(leagueScoring.getHomeScorePoints());
                        tmpStanding.setPointsTotal(1);
                        tmpStanding.setPointsForRound(1);
                    }
                    if(prediction.getAwayTeamScore().equals(result.getAwayTeamScore())) {
                        tmpStanding.setPointsTotal(1);
                        tmpStanding.setAwayScorePoints(leagueScoring.getAwayScorePoints());
                        tmpStanding.setPointsForRound(1);
                    }    //2                         - 2    is 0                 =      3                         -      3    is 0
                         //3                         - 1    is 2                 =      5                         -      3    is 2
                    if(prediction.getHomeTeamScore() - result.getHomeTeamScore() == prediction.getAwayTeamScore() - result.getAwayTeamScore()) {
                        //correct result and margin is
                        tmpStanding.setPointsTotal(leagueScoring.getCorrectMarginPoints());
                        tmpStanding.setPointsForRound(1);
                        tmpStanding.setPointsTotal(2);
                        wrongResult = false;
                    } else if((prediction.getHomeTeamScore() > prediction.getAwayTeamScore() && result.getHomeTeamScore() > result.getAwayTeamScore())
                            || (prediction.getAwayTeamScore() > prediction.getHomeTeamScore() && result.getAwayTeamScore() > result.getHomeTeamScore())) {
                        wrongResult = false;
                        tmpStanding.setPointsTotal(2);
                    }
                    if(wrongResult) {
                        tmpStanding.setWrongResults(1);
                    } else if(!wrongResult && !prediction.equalsString().equals(result.equalsString())){
                        tmpStanding.setCorrectResults(1);
                    }
                    userStandingMap.put(tmpStanding.getPlayerId().trim().toUpperCase(), tmpStanding);
                }
            }
            return new ArrayList<>(userStandingMap.values());
        }
        return standings;

我真的不想进入dsl或类似的规则操作类型。我不想在评分或问题上引入限制。我正在考虑几种方法,但是上面的代码是蛮力的if / else逻辑。我宁愿使用函数回调或某种其他通用评分形式,但不受我的预定义模型的限制。也许模型需要更加灵活。本质上,我希望用户能够使用任何计分系统和用户定义的问题来定义联赛。

如何使以上代码更通用,以允许基于上述模型的任何计分系统?还是调整模型以允许使用更通用的算法?

0 个答案:

没有答案