Evalml: 在钻石数据集上表现不佳

创建于 2020-10-05  ·  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 会产生同样糟糕的模型。

讨论
我的第一个怀疑是这些功能没有得到正确的类型。 当我查看 Pandas 推断的 dtypes 时,我看到许多设置为float64但只有几个唯一值,即它们应该设置为分类。 我试了一下,但它似乎没有改变模型结果,所以故事还有更多。

所有3条评论

大家好,

我相信这与按目标变量排序的输入数据集以及用于 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')

我将通过 evalml 修复获得 PR。

此页面是否有帮助?
0 / 5 - 0 等级