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.
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.
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.