h2o 数字列转换为枚举

h2o numeric columns are converted to enum

我有包含数字列和分类列的镶木地板文件。

我想创建一个 GBM 模型,稍后我可以在 java 程序中实施它的 mojo 进行推理。 问题是,到目前为止,我将数据中的空值归因为数字列为 0,分类列为“EMPTY”。

当我在 h2o 中执行此操作时,我可以使用 col_types 参数在 h2o import_file 中执行我的方案。

当我不使用插补时,让 h2o 自行插补 - 它会将我的数字列转换为枚举类型。

如果我尝试在没有归集的情况下强制执行导入类型,我会收到以下所有数字特征的错误:

 error = 'Unsupported type override (String -> Numeric). Column XXX will be parsed as String'

如此连续的特征不会得到正确的处理...为什么要转换为枚举? 我怎样才能避免这种转换?

H2O 应该识别 parquet 文件的数据类型并预先设置它们。保存镶木地板文件时,您可能将数字列设置为 strings/categorical。您有什么 parquet 文件将列数据类型另存为?

我在 H2O 3.30.0.1 上验证了数据类型将被 parquet 文件定义的内容识别。见下文。

使用虹膜数据集中的缺失值创建数字列 (sepal_len)

#Read a dataset
iris = h2o.import_file("http://h2o-public-test-data.s3.amazonaws.com/smalldata/iris/iris_wheader.csv")
#Convert one value to None
iris[0, 0] = None
#Make it as pandas df and save as parquet as 
df = iris.as_data_frame()
df.to_parquet('iris.parquet')
df.dtypes

Returns:

sepal_len    float64
sepal_wid    float64
petal_len    float64
petal_wid    float64
class         object
dtype: object

^列是浮点数

#Read in h2o
iris2 = h2o.import_file('iris.parquet')
iris2.head(2)

Returns:

sepal_len   sepal_wid   petal_len   petal_wid   class
nan         3.5         1.4         0.2         Iris-setosa
4.9         3           1.4         0.2.        Iris-setosa

检查数据类型是否与 parquet 的定义相同(在 pandas 中制作)

iris2.types

Returns:

{'sepal_len': 'real',
 'sepal_wid': 'real',
 'petal_len': 'real',
 'petal_wid': 'real',
 'class': 'enum'}

^H2O 帧数据类型是真实的(不是枚举)

将 pandas 数据框更改为 str 列并另存为新的镶木地板文件:

#Save the parquet as a string column
df.astype({'sepal_len':'str'}).to_parquet('irisB.parquet')
#Read file again
irisB = h2o.import_file('irisB.parquet')
irisB.types

Returns:

{'sepal_len': 'enum',
 'sepal_wid': 'real',
 'petal_len': 'real',
 'petal_wid': 'real',
 'class': 'enum'}