H2O Target Mean Encoder "кадры отправляются в том же порядке" ОШИБКА - PullRequest
2 голосов
/ 22 марта 2019

Я следую примеру H2O, чтобы выполнить целевое среднее кодирование в Sparking Water (Sparking Water 2.4.2 и H2O 3.22.04).Он хорошо работает во всем следующем параграфе

from h2o.targetencoder import TargetEncoder

# change label to factor
input_df_h2o['label'] = input_df_h2o['label'].asfactor()

# add fold column for Target Encoding
input_df_h2o["cv_fold_te"] = input_df_h2o.kfold_column(n_folds = 5, seed = 54321)

# find all categorical features
cat_features = [k for (k,v) in input_df_h2o.types.items() if v in ('string')]
# convert string to factor
for i in cat_features:
    input_df_h2o[i] = input_df_h2o[i].asfactor()

# target mean encode
targetEncoder = TargetEncoder(x= cat_features, y = y, fold_column = "cv_fold_te", blending_avg=True)
targetEncoder.fit(input_df_h2o)

Но когда я начинаю использовать тот же набор данных, который использовался для установки Target Encoder для запуска кода преобразования (см. Код ниже):

ext_input_df_h2o = targetEncoder.transform(frame=input_df_h2o,
                                    holdout_type="kfold", # mean is calculating on out-of-fold data only; loo means leave one out
                                    is_train_or_valid=True,
                                    noise = 0, # determines if random noise should be added to the target average
                                    seed=54321)

У меня будет ошибка вроде

Traceback (most recent call last):
  File "/tmp/zeppelin_pyspark-6773422589366407956.py", line 331, in <module>
    exec(code)
  File "<stdin>", line 5, in <module>
  File "/usr/lib/envs/env-1101-ver-1619-a-4.2.9-py-3.5.3/lib/python3.5/site-packages/h2o/targetencoder.py", line 97, in transform
    assert self._encodingMap.map_keys['string'] == self._teColumns
AssertionError

Я нашел код в его исходном коде http://docs.h2o.ai/h2o/latest-stable/h2o-py/docs/_modules/h2o/targetencoder.html enter image description here но как это исправитьвопрос?Это та же таблица, которая использовалась для запуска fit .

Ответы [ 2 ]

2 голосов
/ 11 апреля 2019

Проблема в том, что вы пытаетесь кодировать несколько категориальных функций.Я думаю, что это ошибка H2O, но вы можете решить поместить преобразователь в цикл for, который перебирает все категориальные имена.

import numpy as np
import pandas as pd
import h2o
from h2o.targetencoder import TargetEncoder
h2o.init()

df = pd.DataFrame({
    'x_0': ['a'] * 5 + ['b'] * 5,
    'x_1': ['c'] * 9 + ['d'] * 1,
    'x_2': ['a'] * 3 + ['b'] * 7,
    'y_0': [1, 1, 1, 1, 0, 1, 0, 0, 0, 0]
})

hf = h2o.H2OFrame(df)
hf['cv_fold_te'] = hf.kfold_column(n_folds=2, seed=54321)
hf['y_0'] = hf['y_0'].asfactor()
cat_features = ['x_0', 'x_1', 'x_2']

for item in cat_features:
    target_encoder = TargetEncoder(x=[item], y='y_0', fold_column = 'cv_fold_te')
    target_encoder.fit(hf)
    hf = target_encoder.transform(frame=hf, holdout_type='kfold',
                                  seed=54321, noise=0.0)
hf
0 голосов
/ 13 мая 2019

Спасибо всем, что сообщили нам об этом.Утверждение было мерой предосторожности, так как я не был уверен, может ли быть случай, когда порядок может быть изменен.Остальная часть кода была написана с учетом этого предположения и поэтому в любом случае безопасна для использования с измененным порядком, но утверждение было оставлено и забыто.Добавлен тест и удалено утверждение.Теперь эта проблема исправлена ​​и объединена.Должно быть доступно в следующей версии исправления. 0xdata.atlassian.net / browse / PUBDEV-6474

...