将Pandas数据框高效转换为H2O框架

21

我有一个Pandas数据框,其编码为latin-1,以;分隔。数据框非常大,大小为350000 x 3800。我最初想使用sklearn,但是我的数据框缺失值(NAN value),因此我无法使用sklearn的随机森林或GBM。因此,我不得不使用 H2O的分布式随机森林来训练数据集。主要问题是在执行 h2o.H2OFrame(data)时,数据框无法高效转换。我检查了文档中提供编码选项的可能性,但没有发现相关内容。

有人对此有什么想法吗?任何线索都可以帮助我。我还想知道是否有其他类似于H2O的库可以非常有效地处理NAN值?我知道我们可以填补缺失的列,但是在我的数据集中不应该这样做,因为我的列来自不同传感器的值,如果值不存在则意味着传感器不存在。我只能使用Python。


Xgboost 可以完美地处理缺失值。 - CrazyElf
你可以尝试从这里安装xgboost:http://www.lfd.uci.edu/~gohlke/pythonlibs/#xgboost,对我来说它完美地运行。 - CrazyElf
对于 Linux 我无能为力,我在这方面不是很高级,抱歉 :) - CrazyElf
“主要问题是当我执行'h2o.H2OFrame(data)'时,数据框未能高效转换。”这句话的意思是什么?我不确定问题出在哪里,有错误吗? - Erin LeDell
我上面的评论中有笔误:as.H2OFrame() 应该是 h2o.H2OFrame() - Erin LeDell
显示剩余6条评论
2个回答

36
import h2o
import pandas as pd

df = pd.DataFrame({'col1': [1,1,2], 'col2': ['César Chávez Day', 'César Chávez Day', 'César Chávez Day']})
hf = h2o.H2OFrame(df)

由于数据集中存在大量 NAN,导致您面临的问题,应该首先解决这个问题。有两种方法可以解决。

  1. 使用单个、显然超出范围的值替换 NAN。 例如,如果一个特征在 0-1 之间变化,则将该特征中的所有 NAN 替换为 -1。

  2. 使用类 Imputer 来处理 NAN 值。这将用该特征的均值、中位数或众数替换 NAN


@ Anand CU。我正在做同样的事情,但是我认为由于数据框的大尺寸,类型转换不够高效。 - ayaan
@ayaan 你的数据集中有太多的NAN吗?数据集中有多少百分比的值是NAN? - Anand C U
我的数据框中大约有40%的值是NAN。 - ayaan
@ayaan 一个选项是将 nan 替换为单个、显然超出范围的值。例如,如果一个特征在 0-1 之间变化,则将该特征的所有 nan 替换为 -1。然后您可能也可以使用 sklearn 的算法。 - Anand C U
@ayaan 或者你也可以使用类Imputer来处理NAN值。 - Anand C U
显示剩余3条评论

7
如果您的数据中存在大量缺失值且想要提高转换效率,我建议您明确指定列类型和NA字符串,而不是让H2O进行解释。您可以将要解释为NA的字符串列表和一个指定列类型的字典传递给H2OFrame()方法。
这将让您能够为不出现的传感器创建自定义标签,而不是使用通用的“不可用”(在pandas中使用自定义字符串填充NaN值)。
import h2o    

col_dtypes = {'col1_name':col1_type, 'col2_name':col2_type}
na_list = ['NA', 'none', 'nan', 'etc']

hf = h2o.H2OFrame(df, column_types=col_dtypes, na_strings=na_list)

更多信息请参考:http://docs.h2o.ai/h2o/latest-stable/h2o-py/docs/_modules/h2o/frame.html#H2OFrame 编辑:@ErinLeDell建议直接使用h2o.import_file()并指定列数据类型和NA字符串,这样可以获得最大的加速。

谢谢,我会尝试这个并告诉你结果。 - ayaan
如果一个Pandas数据框已经指定了类型,为什么H2O还需要显式传递类型? - ldmtwo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接