Evalml: Schlechte Leistung beim Diamantdatensatz

Erstellt am 5. Okt. 2020  ·  3Kommentare  ·  Quelle: alteryx/evalml

Problem
Automl liefert Modelle mit negativem R2.

Repro
Datensatz hier .

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)

Datenprüfungen schlagen aufgrund von Spalten mit hohem NULL-/Einzelwert fehl. Sie können sie mit data_checks='disabled' deaktivieren. Oder, um sie anzusprechen und fortzufahren:

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)

Die Ergebnisse sind in beiden Fällen sehr ähnlich: negative R2-Werte für alle Modelle, dh die Modelle können keine aussagekräftigen Ergebnisse liefern.

Das Umschalten der Metrik auf MSE und MAE führt zu ähnlich schlechten Modellen.

Diskussion
Mein erster Verdacht ist, dass die Funktionen nicht den richtigen Typ erhalten. Wenn ich mir die von Pandas abgeleiteten Dtypes ansehe, sehe ich, dass viele als float64 aber nur wenige eindeutige Werte haben, dh sie sollten als kategorisch festgelegt werden. Ich habe das ausprobiert, aber es schien die Modellergebnisse nicht zu ändern, also gibt es mehr an der Geschichte.

bug

Alle 3 Kommentare

Hallo Team,

Ich glaube, dies hängt damit zusammen, dass ein Eingabedatensatz nach der Zielvariablen sortiert ist, und die Stichprobenmethode, die für die 3-fache Kreuzvalidierung verwendet wird. Dieser Datensatz ist nach dem Preis vom niedrigsten zum höchsten sortiert. Ich vermute, dass die Kreuzvalidierung die Datensätze der Reihe nach aufteilt, sodass die Aufteilungen an die Zielvariable gebunden sind - was bedeutet, dass die R2-Werte wirklich niedrig sind, da sie mit Zielvariablenwerten getestet werden, die nicht in den Trainingsdaten enthalten waren. Dieses Verhalten wird behoben, indem der vollständige Datensatz gemischt wird, bevor er in die Suche eingegeben wird.

  • Wie @SydneyAyx erwähnt, erhalten Sie bessere R2-Werte, wenn Sie den Datensatz mischen.
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()))

Danke @SydneyAyx @gsheni ! Tolle Detektivarbeit da, Genie :)

Ja, bestätigt. Es scheint, dass unsere Standarddatensplitter in automl derzeit nicht shuffle=True festlegen.

@SydneyAyx @gsheni Eine mischen , wie

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

Ich werde eine PR mit dem evalml-Fix erstellen.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen