Evalml: Низкая производительность на наборе алмазных данных

Созданный на 5 окт. 2020  ·  3Комментарии  ·  Источник: alteryx/evalml

Проблема
Automl дает модели с отрицательным R2.

Репро
Набор данных здесь .

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)

Проверка данных не удастся из-за большого количества столбцов с нулевым или однозначным значением. Вы можете отключить их с помощью data_checks='disabled' . Или, чтобы обратиться к ним и продолжить:

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)

Результаты очень похожи в любом случае: отрицательные значения R2 для всех моделей, т. Е. Модели не могут дать значимых результатов.

Переключение метрики на MSE и MAE дает такие же плохие модели.

Обсуждение
Мое первое подозрение заключается в том, что функции не получают нужного типа. Когда я смотрю на dtypes, выведенные pandas, я вижу, что многие из них установлены как float64 но имеют только несколько уникальных значений, т.е. они должны быть установлены как категориальные. Я попробовал это, но, похоже, это не повлияло на результаты модели, так что это еще не все.

Все 3 Комментарий

Привет, команда,

Я считаю, что это связано с сортировкой набора входных данных по целевой переменной и методом выборки, используемым для трехкратной перекрестной проверки. Этот набор данных отсортирован по цене от наименьшей к наибольшей. Я подозреваю, что перекрестная проверка разбивает записи по порядку, поэтому разбиения привязаны к целевой переменной - это означает, что значения R2 действительно низкие, потому что они проверяются на значениях целевых переменных, которые не были включены в данные обучения. Это поведение устраняется путем перетасовки всего набора данных перед подачей его в поиск.

  • Как упоминал @SydneyAyx , вы получите более высокие баллы R2 после перетасовки набора данных.
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()))

Спасибо @SydneyAyx @gsheni ! Отличная детективная работа, гений :)

Да, подтверждено. Похоже, что наши разделители данных по умолчанию в automl в настоящее время не устанавливают shuffle=True .

@SydneyAyx @gsheni один способ обхода - перетасовать перед запуском automl, как @gsheni показано выше. Другой обходной путь - установить собственный разделитель данных, например:

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

Я получу PR с исправлением evalml.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги