Todos os desafios
Fácil 0 resolvidos 0% de aceitação

Funções de perda: MSE, MAE e entropia cruzada

Meça o quanto as previsões de um modelo estão erradas com o erro quadrático médio, o erro absoluto médio ou a entropia cruzada binária.

O que você vai aprender

  • Medir o erro de previsão de três formas
  • Limitar probabilidades para evitar log(0)
  • Escolher uma perda para regressão ou classificação

Problema

Ver original (inglês)

Uma função de perda transforma os erros de um modelo em um único número a ser minimizado. Implemente compute_loss(kind, predictions, targets) para três perdas comuns, onde n é o número de previsões:

  • "mse" (erro quadrático médio): média de (p - t)²
  • "mae" (erro absoluto médio): média de |p - t|
  • "binary_cross_entropy": -média de [t × ln(p) + (1 - t) × ln(1 - p)]. Primeiro limite cada previsão p ao intervalo [0.0000001, 0.9999999] para que o logaritmo nunca seja ln(0).

Entrada

kind: "mse", "mae" ou "binary_cross_entropy".

predictions: As previsões do modelo.

targets: Os valores corretos (mesmo tamanho). Na entropia cruzada, são 0 ou 1 e as previsões ficam entre 0 e 1.

Saída

Retorne a perda como número decimal.

Restrições

1 ≤ tamanho ≤ 1.000

-1.000 ≤ cada valor ≤ 1.000 (0 ≤ p ≤ 1 e t ∈ {0, 1} para a entropia cruzada)

Exemplos

Exemplo 1
Entrada:
kind = "mse"
targets = [3.0, -0.5, 2.0]
predictions = [2.5, 0.0, 2.0]

Saída esperada:
expected = 0.166667
Entrada:
std::string kind = "mse";
std::vector<double> targets = {3.0, -0.5, 2.0};
std::vector<double> predictions = {2.5, 0.0, 2.0};

Saída esperada:
double expected = 0.166667;
Entrada:
string kind = "mse";
double[] targets = new double[] {3.0, -0.5, 2.0};
double[] predictions = new double[] {2.5, 0.0, 2.0};

Saída esperada:
double expected = 0.166667;

Explicação

Erros ao quadrado: 0.5² = 0.25, 0.5² = 0.25 e 0² = 0. A média é 0.5 / 3 ≈ 0.166667.

Exemplo 2
Entrada:
kind = "binary_cross_entropy"
targets = [1.0, 0.0]
predictions = [0.9, 0.2]

Saída esperada:
expected = 0.164252
Entrada:
std::string kind = "binary_cross_entropy";
std::vector<double> targets = {1.0, 0.0};
std::vector<double> predictions = {0.9, 0.2};

Saída esperada:
double expected = 0.164252;
Entrada:
string kind = "binary_cross_entropy";
double[] targets = new double[] {1.0, 0.0};
double[] predictions = new double[] {0.9, 0.2};

Saída esperada:
double expected = 0.164252;

Explicação

-(ln(0.9) + ln(1 - 0.2)) / 2 = -(-0.105361 - 0.223144) / 2 ≈ 0.164252. Previsões corretas e confiantes dão uma perda pequena.

Como abordar

Tente sozinho primeiro e depois abra uma dica de cada vez.

Dica 1

Cada loss compara predições e alvos elemento por elemento e depois faz a média dos erros por exemplo.

Dica 2

Para cross-entropy, limite as predições longe de 0 e 1 antes de calcular logaritmos.

Dica 3

Lembre que valor absoluto e quadrado são diferentes, e a cross-entropy usa o alvo como peso em cada termo do log.

Complexidade esperada

tempo O(n), espaço extra O(1)

Referências

Este desafio foi adaptado para o CodeUtility. Siga o enunciado e as restrições acima.

Aprenda com outros

Soluções da comunidade

Ainda não há soluções publicadas. Resolva este desafio para compartilhar a primeira.