Evalml: Rendimiento deficiente en el conjunto de datos de diamantes

Creado en 5 oct. 2020  ·  3Comentarios  ·  Fuente: alteryx/evalml

Problema
Automl produce modelos con R2 negativo.

Repro
Conjunto de datos aquí .

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)

Las comprobaciones de datos fallarán debido a columnas de valor único o muy nulas. Puede desactivarlos con data_checks='disabled' . O, para abordarlos y 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)

Los resultados son muy similares en ambos sentidos: valores R2 negativos para todos los modelos, es decir, los modelos no pueden producir resultados significativos.

Cambiar la métrica a MSE y MAE produce modelos igualmente pobres.

Discusión
Mi primera sospecha es que las funciones no son del tipo correcto. Cuando miro los dtypes inferidos por pandas, veo que muchos están configurados como float64 pero solo tienen unos pocos valores únicos, es decir, deben configurarse como categóricos. Le di una oportunidad, pero no pareció cambiar los resultados del modelo, así que hay más en la historia.

bug

Todos 3 comentarios

Hola, equipo,

Creo que esto está relacionado con tener un conjunto de datos de entrada ordenados por la variable objetivo y el método de muestreo utilizado para la validación cruzada triple. Este conjunto de datos está ordenado por precio de menor a mayor. Sospecho que la validación cruzada está dividiendo los registros en orden, por lo que las divisiones están vinculadas a la variable de destino, lo que significa que los valores de R2 son realmente bajos porque se están probando con los valores de la variable de destino que no se incluyeron en los datos de entrenamiento. Este comportamiento se resuelve barajando el conjunto de datos completo antes de introducirlo en la búsqueda.

  • Como mencionó @SydneyAyx , obtienes mejores puntajes de R2 una vez que barajas el conjunto de datos.
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()))

¡Gracias @SydneyAyx @gsheni ! Gran trabajo de detective allí, genio :)

Si, confirmado. Parece que nuestros divisores de datos predeterminados en automl no configuran actualmente shuffle=True .

@SydneyAyx @gsheni una solución es mezclar antes de ejecutar automl como @gsheni mostró arriba. Otra solución es configurar su propio divisor de datos, así:

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')

Conseguiré un PR con la solución evalml.

¿Fue útil esta página
0 / 5 - 0 calificaciones