2017-09-20 76 views
2

我正在處理一個巨大的H2OFrame(約150GB,約2億行),我需要稍微操作一下。更具體地說:我必須使用框架的ip列來查找每個IP的位置/城市名稱,並將此信息添加到每個框架的行中。在H2OFrame的每一行添加額外數據

由於幀的巨大尺寸,將幀轉換爲普通的python對象並在本地操作它不是一個選項。所以我希望我能做的就是使用我的H2O集羣創建一個新的H2OFrame city_names使用原始幀的ip列,然後合併這兩個幀。

我的問題類似於提出的問題here,我從這個問題的答案中得出的結論是,H2O中沒有辦法對每個幀的行進行復雜的操作。這是真的嗎? H2OFrameapply函數畢竟只接受一個沒有自定義方法的lambda。

我想到的一個選擇是使用Spark/Sparkling Water進行這種數據操作,然後將火花幀轉換爲H2OFrame來完成機器學習操作。但是,如果可能的話,我寧願避免這種情況,只使用H2O,這不僅僅是由於這種轉換造成的開銷。

所以我想它歸結爲這樣:有沒有什麼辦法可以使用H2O進行這種操作?如果沒有另外的選擇來做到這一點,而不必改變我的集羣架構(即不必將我的H2O集羣變成波光粼粼的水集羣?)

回答

1

是的,當使用H2OFrame應用時,您無法通過函數而不是lambda表示接受。因爲如果你嘗試通過例如tryit功能,您會收到以下錯誤顯示的限制:

H2OValueError: Argument `fun` (= <function tryit at 0x108d66410>) does not satisfy the condition fun.__name__ == "<lambda>" 

正如你已經知道蘇打水是執行所有的數據在火花第一改寫(munging)的另一種選擇,然後把你的數據爲H2O爲ML。

如果您想堅持使用H2O,那麼您的選擇是循環訪問數據框以按照您的方式處理元素。根據您的數據,以下選項可能會耗費很少時間,但它不會要求您移動環境。

  • 通過僅選擇您的「ip」列創建一個新的H2O框架,並使用NA添加位置,城市和其他空列。
  • 遍歷所有的IP值,並根據「知識產權」,找到位置/城市,並添加位置,城市和其他列值的現有列
  • 最後cbind原裝H2OFrame
  • 檢查「IP新h2oFrame 「和」ip0「列進行適當的100%匹配合並,然後刪除重複的」ip0「列中的一個。
  • 刪除其他額外H2OFrame以節省內存
1

如果您的IP - >市算法是一個查找表,您可以創建一個數據幀,然後使用h2o.merge。舉例來說,this video(從大約59分鐘開始)顯示瞭如何將天氣數據合併到航空公司數據中。

對於IP地址,我想你可能想要首先截斷到前兩個或三個部分。

如果您沒有查找表,它是變得更加有趣的是,是否更快地將一個複雜的算法轉換爲查找樹,並執行h2o.merge,或堅持批量下載大量數據,在本地運行客戶端,上傳一批答案,最後做h2o.cbind

順便說一句,酷和時髦的方法將樣品100萬的IP地址,查找客戶端上的正確答案,以製作一個訓練數據集,然後使用H20來建立一個機器學習模型。然後,您可以使用h2o.predict()在您的實際數據中創建新的城市列。 (儘管你會希望至少將ip地址分成4列)(我的預感是一個深度隨機森林,效果最好......但我肯定會試驗一下。)

相關問題