Por que uma grande variedade de K está diminuindo minha pontuação de validação cruzada?

11

Brincando com o Boston Housing Dataset e RandomForestRegressor(com parâmetros padrão) no scikit-learn, notei algo estranho: a pontuação média de validação cruzada diminuiu à medida que aumentava o número de dobras além de 10. Minha estratégia de validação cruzada era a seguinte:

cv_met = ShuffleSplit(n_splits=k, test_size=1/k)
scores = cross_val_score(est, X, y, cv=cv_met)

... onde num_cvsfoi variado. I definido test_sizepara 1/num_cvsespelhar o comportamento tamanho dividida trem / teste de CV k vezes. Basicamente, eu queria algo como CV k-fold, mas também precisava de aleatoriedade (daí o ShuffleSplit).

Este estudo foi repetido várias vezes, e pontuações médias e desvios padrão foram plotados.

Área do círculo ~ K na validação cruzada em dobra K

(Observe que o tamanho de ké indicado pela área do círculo; o desvio padrão está no eixo Y.)

Consistentemente, aumentar k(de 2 para 44) produziria um breve aumento na pontuação, seguido de uma diminuição constante à medida que kaumentasse ainda mais (além de ~ 10 dobras)! Se alguma coisa, eu esperaria que mais dados de treinamento levassem a um pequeno aumento na pontuação!

Atualizar

Alterar os critérios de pontuação para significar erro absoluto resulta em um comportamento que eu esperaria: a pontuação melhora com um número maior de dobras no CV com dobras K, em vez de se aproximar de 0 (como no padrão, ' r2 '). A questão permanece: por que a métrica de pontuação padrão resulta em baixo desempenho nas métricas média e de DST para um número crescente de dobras?

Brian Bien
fonte
Algum registro duplicado em suas dobras? Isso pode ser devido ao excesso de ajustes .
Quit - Anony-Mousse
1
@ Anony-Mousse Não, já que o conjunto de dados da Boston Housing não possui registros duplicados e a amostragem do ShuffleSplit não causa registros duplicados.
Brian Bien
4
Além disso, melhore sua plotagem. Use barras de erro, para mostrar média, + - stddev e min / max. Coloque k no outro eixo.
QuIT - Anony-Mousse
1
Eu não acho que mais exemplos de treinamento aumentem a chance de sobreajuste. Criei uma curva de aprendizado com esse conjunto de dados, novamente usando o ShuffleSplit (n_splits = 300 com vários tamanhos de teste) e vi uma precisão consistentemente aumentada à medida que mais exemplos de treinamento foram disponibilizados.
Brian Bien
1
desculpe, você está certo, mais é melhor e o melhor é 1. Mas você não tem esse problema se usar erro quadrado médio ou absoluto. Portanto, ele tem a ver com o termo do erro
rep_ho 07/10

Respostas:

1

O escore r ^ 2 é indefinido quando aplicado a uma única amostra (por exemplo, CV individual).

r ^ 2 não é bom para avaliação de pequenos conjuntos de testes: quando é usado para avaliar um conjunto de testes suficientemente pequeno, a pontuação pode ser muito negativa, apesar das boas previsões.

Dada uma única amostra, uma boa previsão para um determinado domínio pode parecer terrível:

from sklearn.metrics import r2_score
true = [1]
predicted = [1.01] # prediction of a single value, off by 1%
print(r2_score(true, predicted))
# 0.0

Aumente o tamanho do conjunto de testes (mantendo a precisão das previsões iguais) e, de repente, a pontuação r ^ 2 parece quase perfeita:

true = [1, 2, 3]
predicted = [1.01, 2.02, 3.03]
print(r2_score(true, predicted))
# 0.9993

Levando ao outro extremo, se o tamanho do teste for 2 amostras, e estivermos avaliando duas amostras próximas uma da outra por acaso, isso terá um impacto substancial na pontuação r ^ 2, mesmo se as previsões forem muito boas :

true = [20.2, 20.1] # actual target values from the Boston Housing dataset
predicted = [19, 21]
print(r2_score(true, predicted))
# -449.0
Brian Bien
fonte