问题
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 会产生同样糟糕的模型。
讨论
我的第一个怀疑是这些功能没有得到正确的类型。 当我查看 Pandas 推断的 dtypes 时,我看到许多设置为float64
但只有几个唯一值,即它们应该设置为分类。 我试了一下,但它似乎没有改变模型结果,所以故事还有更多。
大家好,
我相信这与按目标变量排序的输入数据集以及用于 3 折交叉验证的采样方法有关。 该数据集按价格从低到高排序。 我怀疑交叉验证正在按顺序拆分记录,因此拆分与目标变量相关联 - 这意味着 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')
我将通过 evalml 修复获得 PR。