Python 3.x H2O目标平均编码器“;帧以相同的顺序发送;错误

Python 3.x H2O目标平均编码器“;帧以相同的顺序发送;错误,python-3.x,pyspark,h2o,Python 3.x,Pyspark,H2o,我按照H2O示例在火花水中运行目标平均值编码(火花水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_t

我按照H2O示例在火花水中运行目标平均值编码(火花水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)
但当我开始使用与目标编码器相同的数据集来运行转换代码时(请参见下面的代码):

我将有错误

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
回溯(最近一次呼叫最后一次):
文件“/tmp/zeppelin_pyspark-677342258936407956.py”,第331行,在
行政主任(代码)
文件“”,第5行,在
文件“/usr/lib/envs/env-1101-ver-1619-a-4.2.9-py-3.5.3/lib/python3.5/site packages/h2o/targetencoder.py”,第97行,在转换中
断言self.\u encodingMap.map\u键['string']==self.\u列
断言错误
我在它的源代码中找到了代码
但如何解决这个问题呢?这是用于运行fit的同一个表。问题在于您正在尝试对多个分类功能进行编码。我认为这是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

谢谢大家让我们知道。这一断言是一种预防措施,因为我不确定是否有可能改变订单。其余的代码都是在考虑了这一假设的情况下编写的,所以无论如何都可以安全地使用更改的顺序,但断言被留下并遗忘了。添加了测试并删除了断言。现在,此问题已修复并合并。应在即将发布的修复版本中提供

您使用的是什么版本的H2O-3?谢谢我在spark中运行它,安装了sparking water 2.4.2和H2O 3.22.04这是由spark water中的问题引起的吗?有人报告这是一个bug吗?我也有同样的问题。任何两个分类功能都可以工作,但一旦我引入第三个,它就会以相同的错误中断,我在这里用h2o切了一张罚单。请把这只虫子投上去。但中的示例使用了两个分类功能“targetEncoder=targetEncoder(x=[“addr\u state”,“purpose”],y=“bad\u loan”,fold\u column=“cv\u fold\u te”)“有趣的是,当我测试您的示例时,在targetEncoder中使用了2个功能,除了3个功能外,它没有任何问题,它将有我在上面的线程中列出的错误消息,我遵循相同的演示并得到相同的错误。只要尝试不同的功能和数量的功能,我就能解决它。在进行编码之前,请确保没有丢失的数据。我有一个pandas数据框,并在中使用@sveitser共享的插补器[因为我有一小部分缺失值。在那之后,我可以用for循环编码14个分类变量。应该注意的是,H2O.ai中的目标编码器仍然是alpha版本。PD:我使用的是H2O 3.22.1。2@joefaver您是否可以分享有关丢失价值的问题的更多详细信息它应该可以很好地处理丢失的数据,所以让我们看看它是否是一个bug。
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