2016-04-19 5 views
5

मेरे पास एक डेटासेट है और मैं उस पर बेवकूफ बेय लागू करना चाहता हूं। मैं के-फ़ोल्ड तकनीक का उपयोग कर सत्यापन करूँगा। मेरे डेटा में दो वर्ग हैं और उन्होंने आदेश दिया है कि यदि मेरे डेटा सेट में 100 पंक्तियां हैं, तो पहले 50 एक वर्ग के हैं और अगले 50 दूसरे वर्ग के हैं। इसलिए, मैं पहले डेटा को घुमा देना चाहता हूं और फिर यादृच्छिक रूप से के-फ़ोल्ड बना देता हूं। समस्या यह है कि जब मैं आरडीडी पर यादृच्छिक स्प्लिट करने की कोशिश कर रहा हूं, तो यह विभिन्न आकारों के आरडीडी बना रहा है।के-फ़ोल्ड सत्यापन के लिए आरडीडी स्प्लिट: pyspark

documentDF = sqlContext.createDataFrame([ 
    (0,"This is a cat".lower().split(" "),), 
    (0,"This is a dog".lower().split(" "),), 
    (0,"This is a pig".lower().split(" "),), 
    (0,"This is a mouse".lower().split(" "),), 
    (0,"This is a donkey".lower().split(" "),), 
    (0,"This is a monkey".lower().split(" "),), 
    (0,"This is a horse".lower().split(" "),), 
    (0,"This is a goat".lower().split(" "),), 
    (0,"This is a tiger".lower().split(" "),), 
    (0,"This is a lion".lower().split(" "),), 
    (1,"A mouse and a pig are friends".lower().split(" "),), 
    (1,"A pig and a dog are friends".lower().split(" "),), 
    (1,"A mouse and a cat are friends".lower().split(" "),), 
    (1,"A lion and a tiger are friends".lower().split(" "),), 
    (1,"A lion and a goat are friends".lower().split(" "),), 
    (1,"A monkey and a goat are friends".lower().split(" "),), 
    (1,"A monkey and a donkey are friends".lower().split(" "),), 
    (1,"A horse and a donkey are friends".lower().split(" "),), 
    (1,"A horse and a tiger are friends".lower().split(" "),), 
    (1,"A cat and a dog are friends".lower().split(" "),) 
], ["label","text"]) 

from pyspark.mllib.classification import NaiveBayes, NaiveBayesModel 
from pyspark.mllib.linalg import Vectors 
from pyspark.ml.feature import CountVectorizer 
from pyspark.mllib.regression import LabeledPoint 

def mapper_vector(x): 
    row = x.text 
    return LabeledPoint(x.label,row) 

splitSize = [0.2]*5 
print("splitSize"+str(splitSize)) 
print(sum(splitSize)) 
vect = documentDF.map(lambda x: mapper_vector(x)) 
splits = vect.randomSplit(splitSize, seed=0) 

print("***********SPLITS**************") 
for i in range(len(splits)): 
    print("split"+str(i)+":"+str(len(splits[i].collect()))) 

इस कोड को आउटपुट:

splitSize[0.2, 0.2, 0.2, 0.2, 0.2] 
1.0 
***********SPLITS************** 
split0:1 
split1:5 
split2:3 
split3:5 
split4:6 

documentDF 20 पंक्तियों थी, मैं 5 अलग अनन्य नमूने इस डेटासेट जो एक ही आकार है से चाहता था मेरे कोड और डेटासेट का एक उदाहरण इस प्रकार है। हालांकि, यह देखा जा सकता है कि सभी विभाजनों के अलग-अलग आकार होते हैं। मैं क्या गलत कर रहा हूं?

संपादित करें: शून्य323 के अनुसार मैं कुछ भी गलत नहीं कर रहा हूं। फिर, यदि मैं एमएल क्रॉसविलिएटर का उपयोग किए बिना अंतिम परिणाम (जैसा वर्णन किया गया) प्राप्त करना चाहता हूं, तो मुझे क्या बदलने की ज़रूरत है? इसके अलावा, संख्याएं अलग क्यों हैं? यदि प्रत्येक विभाजन में बराबर भार होता है, तो क्या वे पंक्तियों की समान संख्या नहीं रखते हैं? साथ ही, डेटा को यादृच्छिक करने का कोई और तरीका है?

उत्तर

3

आप कुछ भी गलत नहीं कर रहे हैं। randomSplit डेटा वितरण के संबंध में बस कठोर गारंटी प्रदान नहीं करता है। यह BernoulliCellSampler का उपयोग कर रहा है (How does Sparks RDD.randomSplit actually split the RDD देखें) और सटीक भिन्नताएं चलाने के लिए अलग-अलग हो सकती हैं। यह एक सामान्य व्यवहार है और किसी वास्तविक आकार डेटा सेट पर पूरी तरह से स्वीकार्य होना चाहिए जहां अंतर सांख्यिकीय रूप से महत्वहीन होना चाहिए।

एक तरफ स्पार्क एमएल पहले से ही CrossValidator प्रदान करता है जिसका उपयोग एमएल पाइपलाइनों के साथ किया जा सकता है (उदाहरण के लिए How to cross validate RandomForest model? देखें)।

+0

तो, यदि मैं एमएल क्रॉसविलिएटर का उपयोग किये बिना अंतिम परिणाम प्राप्त करना चाहता हूं, तो मुझे क्या बदलने की ज़रूरत है? इसके अलावा, संख्याएं अलग क्यों हैं? यदि प्रत्येक विभाजन में बराबर भार होता है, तो क्या वे पंक्तियों की समान संख्या नहीं रखते हैं? आपने कहा, सटीक अंश चलाने के लिए अलग-अलग भिन्न हो सकते हैं, लेकिन जब भी मैं कोड चलाता हूं तो मुझे वही भिन्नता मिल रही है। डेटा को यादृच्छिक करने का कोई और तरीका है? – harshit

+0

आपको वही अंश मिलते हैं क्योंकि आप निश्चित आरएनजी बीज का उपयोग करते हैं। आपके द्वारा प्राप्त किए गए फ्रैक्चर सटीक नहीं हो सकते हैं क्योंकि ये यादृच्छिक नमूने हैं और सांख्यिकीय गुणों को खतरे में डाले बिना समानांतर में सटीक मान प्राप्त करना मुश्किल है। – zero323

+0

स्पार्क का क्रॉसविलिएटर हालांकि स्तरीकृत नहीं है। –

संबंधित मुद्दे