Aprimoramento de gradiente - previsões extremas x previsões próximas a 0,5

7

Digamos que você treine dois modelos diferentes do Gradient Boosting Classifier em dois conjuntos de dados diferentes. Você usa a validação cruzada de exclusão única e plota os histogramas de previsões que os dois modelos produzem. Os histogramas são assim: insira a descrição da imagem aqui

e isto:

insira a descrição da imagem aqui

Portanto, em um caso, as previsões (em conjuntos fora da amostra / validação) são na maioria extremas (próximas a 0 e 1) e, no outro caso, as previsões são próximas a 0,5.

O que, se houver, pode ser deduzido de cada gráfico? Como alguém poderia explicar a diferença? Pode-se dizer algo sobre o conjunto de dados / recursos / modelo?

Minha intuição é que, no primeiro caso, os recursos explicam melhor os dados para que o modelo se adapte melhor aos dados (e possivelmente os superaproveite, mas não necessariamente - o desempenho nos conjuntos de validação / teste ainda pode ser bom se o recursos realmente explicam bem os dados). No segundo caso, os recursos não explicam bem os dados e, portanto, o modelo não se ajusta muito aos dados. O desempenho dos dois modelos ainda pode ser o mesmo em termos de precisão e recall, no entanto. Isso seria correto?

rinspy
fonte

Respostas:

9

Eu preparei um script curto para mostrar o que acho que deveria ser a intuição certa.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn import ensemble
from sklearn.model_selection import train_test_split


def create_dataset(location, scale, N):
    class_zero = pd.DataFrame({
        'x': np.random.normal(location, scale, size=N),
        'y': np.random.normal(location, scale, size=N),
        'C': [0.0] * N
    })

    class_one = pd.DataFrame({
        'x': np.random.normal(-location, scale, size=N),
        'y': np.random.normal(-location, scale, size=N),
        'C': [1.0] * N
    })
    return class_one.append(class_zero, ignore_index=True)

def preditions(values):
    X_train, X_test, tgt_train, tgt_test = train_test_split(values[["x", "y"]], values["C"], test_size=0.5, random_state=9)
    clf = ensemble.GradientBoostingRegressor()
    clf.fit(X_train, tgt_train)
    y_hat = clf.predict(X_test)
    return y_hat

N = 10000
scale = 1.0
locations = [0.0, 1.0, 1.5, 2.0]

f, axarr = plt.subplots(2, len(locations))
for i in range(0, len(locations)):
    print(i)
    values = create_dataset(locations[i], scale, N)

    axarr[0, i].set_title("location: " + str(locations[i]))

    d = values[values.C==0]
    axarr[0, i].scatter(d.x, d.y, c="#0000FF", alpha=0.7, edgecolor="none")
    d = values[values.C==1]
    axarr[0, i].scatter(d.x, d.y, c="#00FF00", alpha=0.7, edgecolor="none")

    y_hats = preditions(values)
    axarr[1, i].hist(y_hats, bins=50)
    axarr[1, i].set_xlim((0, 1))

O que o script faz:

  • ele cria cenários diferentes em que as duas classes são progressivamente cada vez mais separáveis ​​- eu poderia fornecer aqui uma definição mais formal disso, mas acho que você deve ter a intuição
  • ele ajusta um regressor GBM nos dados de teste e gera os valores previstos, alimentando os valores de teste X no modelo treinado

O gráfico produzido mostra como são os dados gerados em cada cenário e mostra a distribuição dos valores previstos. A interpretação: falta de separabilidade traduz-se em previsto em ou próximo de 0,5.y

Tudo isso mostra a intuição, acho que não deve ser difícil provar isso de uma maneira mais formal, embora eu comece com uma regressão logística - que tornaria a matemática definitivamente mais fácil.

figura 1


EDIT 1

Suponho que no exemplo mais à esquerda, onde as duas classes não são separáveis, se você definir os parâmetros do modelo para superestimar os dados (por exemplo, árvores profundas, grande número de árvores e recursos, taxa de aprendizado relativamente alta), você ainda obterá o modelo para prever resultados extremos, certo? Em outras palavras, a distribuição das previsões é indicativa de quão perto o modelo acabou se ajustando aos dados?

Vamos supor que temos uma árvore de decisão de árvore super profunda. Nesse cenário, veríamos o pico da distribuição dos valores de previsão em 0 e 1. Também veríamos um baixo erro de treinamento. Podemos tornar o erro de treinamento arbitrariamente pequeno, podemos ter essa árvore profunda super ajustada ao ponto em que cada folha da árvore corresponde a um ponto de dados no conjunto de trens e cada ponto de dados no conjunto de trens corresponde a uma folha na árvore. Seria o fraco desempenho no conjunto de teste de um modelo muito preciso no conjunto de treinamento um sinal claro de sobreajuste. Observe que, no meu gráfico, apresento as previsões no conjunto de testes, elas são muito mais informativas.

Uma observação adicional: vamos trabalhar com o exemplo mais à esquerda. Vamos treinar o modelo em todos os pontos de dados da classe A na metade superior do círculo e em todos os pontos de dados da classe B na metade inferior do círculo. Teríamos um modelo muito preciso, com uma distribuição dos valores de previsão chegando a 0 e 1. As previsões no conjunto de testes (todos os pontos da classe A no semicírculo inferior e os pontos da classe B no semicírculo superior) também seriam chegando a 0 e 1 - mas eles seriam totalmente incorretos. Essa é uma estratégia de treinamento "antagônica" desagradável. No entanto, em resumo: a distribuição é semelhante ao grau de separabilidade, mas não é realmente o que importa.

IcannotFixThis
fonte
Suponho que no exemplo mais à esquerda, onde as duas classes não são separáveis, se você definir os parâmetros do modelo para superestimar os dados (por exemplo, árvores profundas, grande número de árvores e recursos, taxa de aprendizado relativamente alta), você ainda obterá o modelo para prever resultados extremos, certo? Em outras palavras, a distribuição das previsões é indicativa de quão perto o modelo acabou se ajustando aos dados?
Rinspy 15/05
1

Primeiro, sugiro usar um conjunto de dados em vez de dois para explorar as previsões de probabilidade de saída. O motivo é simples: se alterarmos os dados, ninguém sabe o que vai acontecer. Como demonstrado na resposta do @ IcannotFixThis, o mesmo modelo exato terá uma saída de probabilidade diferente, se os dados mudarem de sobrepostos para mais separáveis.


Se insistirmos em falar sobre dois conjuntos de dados diferentes, a partir das informações limitadas, podemos apenas dizer que é possível que "previsões extremas" signifiquem que o modelo está se ajustando demais / que os dados sejam "simples" demais para o modelo

Haitao Du
fonte
1

As previsões geralmente dependem do seu modelo. As árvores de decisão em geral produzem resultados bastante "calibrados" que quase podem ser interpretados como uma probabilidade. Alguns como o SVM, por exemplo, não. Mas isso também depende muito do ajuste excessivo / insuficiente. Ou sobre o número de recursos (não, não precisa ser "melhor" necessariamente). Na verdade, se essa é uma classe, a primeira provavelmente está super ajustada.

Mas as primeiras coisas primeiro: onde está sua outra classe? Conforme suas previsões, você deve sempre plotar as duas classes (com cores diferentes). Pelas previsões de uma classe, você não pode dizer muito.

Se você deseja medir o desempenho e tirar conclusões sobre o quanto é aprendido com os recursos, use uma pontuação como ROC AUC, onde a ordem dos eventos é importante e não a distribuição. Se você pretende trabalhar com distribuições, consulte os métodos de calibração de probabilidade (ou leia quais classificadores produzem boas calibrações de qualquer maneira). Eles não são perfeitos, mas visam transformar as previsões em probabilidades (e, portanto, atribuir um significado à saída).

Mayou36
fonte
0

O primeiro cenário pode ser devido ao excesso de ajuste dos dados de treinamento. O desempenho dentro e fora da amostra também depende da métrica de avaliação que você está usando (ou é aplicável ao problema). Além de comparar as métricas, tente verificar as matrizes de confusão também para verificar as classificações incorretas.

Usar métricas como logloss e introduzir parâmetros de regularização pode ser outra opção (confira XGBoost - permite adicionar parâmetros de regularização alfa e beta).

Siddharth Raina
fonte