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)

null /単一値の列が多いため、データチェックは失敗します。 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に切り替えると、同様に貧弱なモデルが生成されます。

討論
私の最初の疑いは、機能が適切なタイプを取得していないことです。 パンダによって推測されたdtypeを見ると、多くがfloat64として設定されていますが、一意の値がいくつかあるだけです。つまり、カテゴリとして設定する必要があります。 私はそれを試してみましたが、モデルの結果は変わらなかったようですので、話はまだまだあります。

bug

全てのコメント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 1つの回避策は、 @ 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 評価