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.
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.