python - M2E की H2o में गणना: त्रुटि: बशर्ते स्तंभ प्रकार POSIXct अज्ञात है
r loops (2)
मेरे उत्तर दिए गए प्रश्न के बाद: आर या पायथन - परीक्षण डेटा को लूप करें - अगले 24 घंटों में पूर्वानुमान सत्यापन (प्रत्येक दिन 96 मान)
मैं H2o पैकेज का उपयोग करके अगले दिन की भविष्यवाणी करना चाहता हूं। आप ऊपर दिए गए लिंक में मेरे डेटासेट के लिए विस्तृत विवरण पा सकते हैं ।
H2o में डेटा का आयाम अलग है।
इसलिए, भविष्यवाणी करने के बाद, मैं एमएपीई की गणना करना चाहता हूं
मुझे प्रशिक्षण और परीक्षण डेटा को H2o प्रारूप में बदलना होगा
train_h2o <- as.h2o(train_data)
test_h2o <- as.h2o(test_data)
mape_calc <- function(sub_df) {
pred <- predict.glm(glm_model, sub_df)
actual <- sub_df$Ptot
mape <- 100 * mean(abs((actual - pred)/actual))
new_df <- data.frame(date = sub_df$date[[1]], mape = mape)
return(new_df)
}
# LIST OF ONE-ROW DATAFRAMES
df_list <- by(test_data, test_data$date, map_calc)
# FINAL DATAFRAME
final_df <- do.call(rbind, df_list)
ऊपरी कोड " गैर- एच 2 ओ" दिन-आगे के लिए भविष्यवाणी सत्यापन के लिए अच्छी तरह से काम करता है और यह हर दिन एमएपीई की गणना करता है।
मैंने H2o के पूर्वानुमानित मॉडल को सामान्य प्रारूप में बदलने की कोशिश की, लेकिन इसके अनुसार: https://stackoverflow.com/a/39221269/9341589 , यह संभव नहीं है।
H2O में एक भविष्यवाणी करने के लिए:
उदाहरण के लिए, मान लें कि हम एक रैंडम फ़ॉरेस्ट मॉडल बनाना चाहते हैं
y <- "RealPtot" #target
x <- names(train_h2o) %>% setdiff(y) #features
rforest.model <- h2o.randomForest(y=y, x=x, training_frame = train_h2o, ntrees = 2000, mtries = 3, max_depth = 4, seed = 1122)
फिर हम नीचे दिखाए गए अनुसार पूर्ण डेटासेट के लिए भविष्यवाणी प्राप्त कर सकते हैं।
predict.rforest <- as.data.frame(h2o.predict(rforest.model, test_h2o)
लेकिन मेरे मामले में मैं mape_calc का उपयोग करके एक-दिवसीय भविष्यवाणी प्राप्त करने की कोशिश कर रहा हूं
नोट: आर या अजगर में किसी भी विचार की सराहना की जाएगी।
UPDATE2 (प्रतिलिपि प्रस्तुत करने योग्य उदाहरण ): ** @Darren कुक चरणों का पालन करें:
मैंने एक सरल उदाहरण प्रदान किया - बोस्टन हाउसिंग डेटासेट।
library(tidyverse)
library(h2o)
h2o.init(ip="localhost",port=54322,max_mem_size = "128g")
data(Boston, package = "MASS")
names(Boston)
[1] "crim" "zn" "indus" "chas" "nox" "rm" "age" "dis" "rad" "tax" "ptratio"
[12] "black" "lstat" "medv"
set.seed(4984)
#Added 15 minute Time and date interval
Boston$date<- seq(as.POSIXct("01-09-2017 03:00", format = "%d-%m-%Y %H:%M",tz=""), by = "15 min", length = 506)
#select first 333 values to be trained and the rest to be test data
train = Boston[1:333,]
test = Boston[334:506,]
#Dropped the date and time
train_data_finialized <- subset(train, select=-c(date))
test_data_finialized <- test
#Converted the dataset to h2o object.
train_h2o<- as.h2o(train_data_finialized)
#test_h2o<- as.h2o(test)
#Select the target and feature variables for h2o model
y <- "medv" #target
x <- names(train_data_finialized) %>% setdiff(y) #feature variables
# Number of CV folds (to generate level-one data for stacking)
nfolds <- 5
#Replaced RF model by GBM because GBM run faster
# Train & Cross-validate a GBM
my_gbm <- h2o.gbm(x = x,
y = y,
training_frame = train_h2o,
nfolds = nfolds,
fold_assignment = "Modulo",
keep_cross_validation_predictions = TRUE,
seed = 1)
mape_calc <- function(sub_df) {
p <- h2o.predict(my_gbm, as.h2o(sub_df))
pred <- as.vector(p)
actual <- sub_df$medv
mape <- 100 * mean(abs((actual - pred)/actual))
new_df <- data.frame(date = sub_df$date[[1]], mape = mape)
return(new_df)
}
# LIST OF ONE-ROW DATAFRAMES
df_list <- by(test_data_finialized, test_data_finialized$date, mape_calc)
final_df <- do.call(rbind, df_list)
यह त्रुटि मुझे अभी मिल रही है:
त्रुटि .h2o.doSafeREST (h2oRestApiVersion = h2oRestApiVersion, urlSuffix = पृष्ठ:
त्रुटि संदेश:
बशर्ते स्तंभ प्रकार POSIXct अज्ञात है। अमान्य तर्क के कारण पार्स के साथ आगे नहीं बढ़ सकते।
H2O, R (चाहे H2O स्थानीय सर्वर पर हो या दूर के डेटा केंद्र में हो) के लिए एक अलग प्रक्रिया में चल रही है। H2O डेटा और H2O मॉडल को उस H2O प्रक्रिया में रखा जाता है, और R द्वारा नहीं देखा जा सकता है।
क्या
dH <- as.h2o(dR)
करता है एक R डेटा फ्रेम,
dR
, को H2O के मेमोरी स्पेस में कॉपी करता है।
dH
तब एक R वैरिएबल है जो H2O डेटा फ्रेम का वर्णन करता है।
यानी यह एक सूचक, या एक हैंडल है;
यह स्वयं डेटा नहीं है।
dR <- as.data.frame(dH)
क्या करता है, H2O प्रक्रिया की मेमोरी से डेटा को R प्रक्रिया की मेमोरी में कॉपी करता है।
(
as.vector(dH)
(
as.vector(dH)
वही करता है जब
as.vector(dH)
किसी एकल स्तंभ का वर्णन करता है)
तो, अपने
mape_calc()
को संशोधित करने का सबसे सरल तरीका, यह मानते हुए कि
sub_df
एक आर डेटा फ्रेम है, पहली दो पंक्तियों को निम्नानुसार बदलना है:
mape_calc <- function(sub_df) {
p <- h2o.predict(rforest.model, as.h2o(sub_df))
pred <- as.vector(p)
actual <- sub_df$Ptot
mape <- 100 * mean(abs((actual - pred)/actual))
new_df <- data.frame(date = sub_df$date[[1]], mape = mape)
return(new_df)
}
यानी H2O पर
sub_df
अपलोड करें, और उसे
h2o.predict()
।
फिर जो भविष्यवाणी की गई थी उसे डाउनलोड करने के लिए
as.vector()
का उपयोग करें।
यह आपके मूल कोड के सापेक्ष था। तो इसका मूल संस्करण रखें:
# LIST OF ONE-ROW DATAFRAMES
df_list <- by(test_data, test_data$date, map_calc)
यानी सीधे
test_h2o
पर
by()
उपयोग न करें।
संपादित प्रश्न के आधार पर अद्यतन :
मैंने आपके उदाहरण कोड में दो बदलाव किए हैं।
सबसे पहले, मैंने
sub_df
से डेट कॉलम हटा दिया।
वह वही था जो त्रुटि संदेश दे रहा था।
दूसरा परिवर्तन सिर्फ रिटर्न प्रकार को सरल बनाने के लिए था; महत्वपूर्ण नहीं है, लेकिन आपने पहले दिनांकित दिनांक कॉलम को समाप्त कर दिया है।
mape_calc <- function(sub_df) {
sub_df_minus_date <- subset(sub_df, select=-c(date))
p <- h2o.predict(my_gbm, as.h2o(sub_df_minus_date))
pred <- as.vector(p)
actual <- sub_df$medv
mape <- 100 * mean(abs((actual - pred)/actual))
data.frame(mape = mape)
}
h2o.predict()
:
h2o.predict()
पूर्वानुमानों को बनाने के लिए डेटा के बैच पर काम करते समय सबसे अधिक कुशल होता है।
लूप के अंदर
h2o.predict()
एक कोड गंध है।
लूप के बाहर एक बार
h2o.predict(rforest.model, test_h2o)
कॉल करने के लिए बेहतर होगा, फिर आर में भविष्यवाणियों को डाउनलोड करें, और उन्हें test_data पर
cbind
करें, और फिर उस संयुक्त डेटा का उपयोग करें।
अद्यतन यहाँ इस तरह से काम करने के लिए आपका उदाहरण बदल गया है: (मैंने परीक्षण विशेषताओं में एक अतिरिक्त कॉलम के रूप में भविष्यवाणी को जोड़ा है; इसे करने के अन्य तरीके हैं, निश्चित रूप से)
test_h2o <- as.h2o(subset(test_data_finialized, select=-c(date)))
p <- h2o.predict(my_gbm, test_h2o)
test_data_finialized$pred = as.vector(p)
mape_calc2 <- function(sub_df) {
actual <- sub_df$medv
mape <- 100 * mean(abs((actual - sub_df$pred)/actual))
data.frame(mape = mape)
}
df_list <- by(test_data_finialized, test_data_finialized$date, mape_calc2)
आपको ध्यान देना चाहिए कि यह बहुत तेज चलता है।
ADDITIONAL UPDATE
:
by()
आपके 2 तर्क के समान मानों को समूहीकृत करके और उन्हें एक साथ संसाधित करके काम करता है।
जैसा कि आपके सभी टाइमस्टैम्प अलग हैं, आप एक समय में एक पंक्ति संसाधित कर रहे हैं।
xts
लाइब्रेरी में देखें, और जैसे टाइमस्टैम्प को समूहीकृत करने के लिए
apply.daily()
।
लेकिन तारीख तक प्रोसेस करने के सरल मामले के लिए, एक साधारण हैक है।
अपने
by()
लाइन को इसमें बदलें:
df_list <- by(test_data_finialized, as.Date(test_data_finialized$date), mape_calc2)
के रूप में। का उपयोग करते
as.Date()
समय बंद होगा।
इसलिए एक ही दिन की सभी पंक्तियाँ अब समान दिखती हैं और एक साथ संसाधित होती हैं।
ASIDE 2: यदि आपके कुख्यात .com/help/mcve बनाते हैं तो आपको बेहतर प्रतिक्रियाएं मिलेंगी। तब लोग आपके कोड को चला सकते हैं, और वे अपने उत्तरों का परीक्षण कर सकते हैं। अपने डेटा के बजाय साधारण डेटा सेट का उपयोग करना भी बेहतर होता है, जैसे हर कोई है। (आप पहले 4 क्षेत्रों में से किसी पर भी प्रतिगमन कर सकते हैं, परितारिका का उपयोग हमेशा प्रजातियों की भविष्यवाणी करने के बारे में नहीं होता है।)
ASIDE
3
: आप H2O के अंदर पूरी तरह से MAPE कर सकते हैं, क्योंकि
abs()
और
mean()
फ़ंक्शंस सीधे H2O डेटा फ़्रेम पर काम करेंगे (जैसा कि अन्य बहुत सारी चीज़ें करते हैं - H2O मैनुअल देखें):
https://.com/a/43103229/841830
(मैं इसे डुप्लिकेट के रूप में चिह्नित नहीं कर रहा हूं, क्योंकि आपका प्रश्न H2O डेटा फ़्रेम के साथ उपयोग करने के लिए कैसे
by()
अनुकूलित
by()
गया था, न कि कुशलतापूर्वक MAPE की गणना कैसे करें!)
ऐसा लगता है कि आप R और H2O डेटा प्रकारों को मिला रहे हैं। याद रखें कि H2O का R केवल एक R API है और देशी R के समान नहीं है। इसका मतलब है कि आप R फ़ंक्शन को लागू नहीं कर सकते हैं जो H2OFrame में R डेटाफ़्रेम की अपेक्षा करता है। और इसी तरह आप H2O फंक्शन को R डेटाफ्रेम पर लागू नहीं कर सकते हैं जब यह H2OFrame की अपेक्षा करता है।
जैसा कि आप आर डॉक्स से देख सकते हैं
by
यह एक ऐसा फ़ंक्शन है जो "एक आर ऑब्जेक्ट, आमतौर पर एक डेटा फ्रेम, संभवतः एक मैट्रिक्स" की अपेक्षा करता है ताकि आप एच 2 ओ फ्रेम में पास न हो सकें।
इसी प्रकार आप
date = H2OFrame
को
data.frame()
पास कर रहे हैं।
हालाँकि आप एक H2OFrame को R डेटाफ़्रेम में बदलने के लिए
as.data.frame()
का उपयोग कर सकते हैं और फिर पूरी तरह से R में अपनी गणनाओं के बारे में जा सकते हैं।