मेरे पास एक डेटासेट है और मैं उस पर बेवकूफ बेय लागू करना चाहता हूं। मैं के-फ़ोल्ड तकनीक का उपयोग कर सत्यापन करूँगा। मेरे डेटा में दो वर्ग हैं और उन्होंने आदेश दिया है कि यदि मेरे डेटा सेट में 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 के अनुसार मैं कुछ भी गलत नहीं कर रहा हूं। फिर, यदि मैं एमएल क्रॉसविलिएटर का उपयोग किए बिना अंतिम परिणाम (जैसा वर्णन किया गया) प्राप्त करना चाहता हूं, तो मुझे क्या बदलने की ज़रूरत है? इसके अलावा, संख्याएं अलग क्यों हैं? यदि प्रत्येक विभाजन में बराबर भार होता है, तो क्या वे पंक्तियों की समान संख्या नहीं रखते हैं? साथ ही, डेटा को यादृच्छिक करने का कोई और तरीका है?
तो, यदि मैं एमएल क्रॉसविलिएटर का उपयोग किये बिना अंतिम परिणाम प्राप्त करना चाहता हूं, तो मुझे क्या बदलने की ज़रूरत है? इसके अलावा, संख्याएं अलग क्यों हैं? यदि प्रत्येक विभाजन में बराबर भार होता है, तो क्या वे पंक्तियों की समान संख्या नहीं रखते हैं? आपने कहा, सटीक अंश चलाने के लिए अलग-अलग भिन्न हो सकते हैं, लेकिन जब भी मैं कोड चलाता हूं तो मुझे वही भिन्नता मिल रही है। डेटा को यादृच्छिक करने का कोई और तरीका है? – harshit
आपको वही अंश मिलते हैं क्योंकि आप निश्चित आरएनजी बीज का उपयोग करते हैं। आपके द्वारा प्राप्त किए गए फ्रैक्चर सटीक नहीं हो सकते हैं क्योंकि ये यादृच्छिक नमूने हैं और सांख्यिकीय गुणों को खतरे में डाले बिना समानांतर में सटीक मान प्राप्त करना मुश्किल है। – zero323
स्पार्क का क्रॉसविलिएटर हालांकि स्तरीकृत नहीं है। –