Evalml: Baixo desempenho no conjunto de dados de diamante

Criado em 5 out. 2020  ·  3Comentários  ·  Fonte: alteryx/evalml

Problema
Automl produz modelos com R2 negativo.

Repro
Conjunto de dados aqui .

import evalml
import pandas as pd
import numpy as np
df = pd.read_csv('stones_encoded_small.csv')
y = df.pop('total_sales_price')
automl = evalml.automl.AutoMLSearch(problem_type='regression')
automl.search(df, y)

As verificações de dados falharão devido a colunas altamente nulas / valor único. Você pode desativá-los com data_checks='disabled' . Ou, para abordá-los e continuar:

cols_to_drop = ['culet_condition', 'fancy_color_dominant_color', 'fancy_color_intensity', 'fancy_color_overtone', 'fancy_color_secondary_color', 'fluor_color', 'image_file_url', 'diamond_id', 'currency_code', 'currency_symbol', 'fancy_color_dominant_color', 'fancy_color_intensity', 'fancy_color_overtone', 'fancy_color_secondary_color', 'has_sarineloupe']
df.drop(columns=cols_to_drop, inplace=True)
automl = evalml.automl.AutoMLSearch(problem_type='regression')
automl.search(df, y)

Os resultados são muito semelhantes de qualquer maneira: valores R2 negativos para todos os modelos, ou seja, os modelos não podem produzir resultados significativos.

Mudar a métrica para MSE e MAE produz modelos igualmente pobres.

Discussão
Minha primeira suspeita é que os recursos não estão obtendo o tipo certo. Quando eu olho para os dtypes inferidos por pandas, vejo que muitos são definidos como float64 mas têm apenas alguns valores únicos, ou seja, eles devem ser definidos como categóricos. Eu tentei, mas não pareceu mudar os resultados do modelo, então há mais na história.

bug

Todos 3 comentários

Oi equipe,

Acredito que isso esteja relacionado a ter um conjunto de dados de entrada classificado pela variável de destino e o método de amostragem usado para a validação cruzada de 3 vezes Este conjunto de dados é classificado por preço do menor para o maior. Suspeito que a validação cruzada está dividindo os registros em ordem, portanto, as divisões estão vinculadas à variável de destino - o que significa que os valores de R2 são realmente baixos porque estão sendo testados em relação aos valores da variável de destino que não foram incluídos nos dados de treinamento. Esse comportamento é resolvido aleatoriamente em todo o conjunto de dados antes de inseri-lo na pesquisa.

  • Como @SydneyAyx mencionou, você obtém melhores pontuações de R2 depois de embaralhar o conjunto de dados.
import evalml
import pandas as pd
import numpy as np
from evalml.data_checks import EmptyDataChecks

df = pd.read_csv('stones_encoded_small.csv')

# shuffles data
df = df.sample(frac=1)

y = df.pop('total_sales_price')
automl = evalml.automl.AutoMLSearch(problem_type='regression')
automl.search(df, y, data_checks=EmptyDataChecks()))

Obrigado @SydneyAyx @gsheni ! Ótimo trabalho de detetive lá, gênio :)

Sim, confirmado. Parece que nossos divisores de dados padrão em automl atualmente não configuram shuffle=True .

@SydneyAyx @gsheni uma solução alternativa é embaralhar antes de executar o automl como @gsheni mostrado acima. Outra solução alternativa é definir seu próprio divisor de dados, da seguinte forma:

import evalml
import pandas as pd
import numpy as np
import sklearn.model_selection
df = pd.read_csv('stones_encoded_small.csv')
y = df.pop('total_sales_price')

data_splitter = sklearn.model_selection.KFold(n_splits=3, random_state=0, shuffle=True)
automl = evalml.automl.AutoMLSearch(problem_type='regression', data_split=data_splitter)
automl.search(df, y, data_checks='disabled')

Vou fazer um RP com a correção do evalml.

Esta página foi útil?
0 / 5 - 0 avaliações