Evalml: Mauvaise performance sur l'ensemble de données de diamant

Créé le 5 oct. 2020  ·  3Commentaires  ·  Source: alteryx/evalml

Problème
Automl donne des modèles avec un R2 négatif.

Repro
Ensemble de données ici .

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)

Les vérifications de données échoueront en raison de colonnes à valeur très nulle/à valeur unique. Vous pouvez les désactiver avec data_checks='disabled' . Ou, pour y remédier et continuer :

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)

Les résultats sont très similaires dans les deux cas : valeurs R2 négatives pour tous les modèles, c'est-à-dire que les modèles ne peuvent pas produire de résultats significatifs.

Le passage de la métrique à MSE et MAE donne des modèles tout aussi médiocres.

Discussion
Mon premier soupçon est que les fonctionnalités ne sont pas du bon type. Quand je regarde les types déduits par les pandas, je vois que beaucoup sont définis comme float64 mais n'ont que quelques valeurs uniques, c'est-à-dire qu'ils doivent être définis comme catégoriels. J'ai essayé mais cela n'a pas semblé changer les résultats du modèle, donc il y a plus à l'histoire.

bug

Tous les 3 commentaires

Salut l'équipe,

Je pense que cela est lié au fait d'avoir un ensemble de données d'entrée trié par la variable cible et à la méthode d'échantillonnage utilisée pour la validation croisée triple. Cet ensemble de données est trié par prix du plus bas au plus élevé. Je soupçonne que la validation croisée divise les enregistrements dans l'ordre, de sorte que les divisions sont liées à la variable cible - ce qui signifie que les valeurs R2 sont vraiment faibles car elles sont testées par rapport aux valeurs de variables cibles qui n'étaient pas incluses dans les données d'entraînement. Ce comportement est résolu en effectuant une lecture aléatoire sur l'ensemble de données complet avant de l'intégrer à la recherche.

  • Comme @SydneyAyx l'a mentionné, vous obtenez de meilleurs scores R2 une fois que vous mélangez l'ensemble de données.
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()))

Merci @SydneyAyx @gsheni ! Super travail de détective là-bas, génie :)

Oui, c'est confirmé. Il semble que nos séparateurs de données par défaut dans automl ne définissent pas actuellement shuffle=True .

@SydneyAyx @gsheni une solution de contournement consiste à mélanger avant d'exécuter automl comme @gsheni l'a montré ci-dessus. Une autre solution consiste à définir votre propre séparateur de données, comme ceci :

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

Je vais obtenir un PR avec le correctif evalml.

Cette page vous a été utile?
0 / 5 - 0 notes