2016-06-17 4 views
0

Also versuche ich einen naiven Bayes Clasifier zu trainieren. Ging in eine Menge Ärger der Datenvorverarbeitung und ich habe jetzt zwei RDDs hergestellt:NaiveBayes Modelltraining mit separatem Trainingssatz und Daten unter Verwendung von pyspark

  1. Bedienungskraft eingestellt: zusammengesetzt aus einem Satz von Sparse-Vektoren;
  2. Etiketten: a entsprechende Liste der Etiketten (0,1) für jeden Vektor.

brauche ich so etwas wie dies auszuführen:

# Train a naive Bayes model. 
model = NaiveBayes.train(training, 1.0) 

aber "Training" ist ein Datensatz vom Laufen abgeleitet:

def parseLine(line): 
    parts = line.split(',') 
    label = float(parts[0]) 
    features = Vectors.dense([float(x) for x in parts[1].split(' ')]) 
    return LabeledPoint(label, features) 

data = sc.textFile('data/mllib/sample_naive_bayes_data.txt').map(parseLine) 

auf der Grundlage der Dokumentation für Python here. Meine Frage ist, dass ich nicht die Daten aus einer TXT-Datei laden will und dass ich bereits den Trainingssatz in Form von Records erstellt habe, die auf Sparse-Vektoren (RDD) und eine entsprechende etikettierte Liste abgebildet sind, wie kann ich das tun naiv-bayes laufen?

Hier ist ein Teil meiner Code:

# Function 
def featurize(tokens_kv, dictionary): 
    """ 
    :param tokens_kv: list of tuples of the form (word, tf-idf score) 
    :param dictionary: list of n words 
    :return: sparse_vector of size n 
    """ 

    # MUST sort tokens_kv by key 
    tokens_kv = collections.OrderedDict(sorted(tokens_kv.items())) 

    vector_size = len(dictionary) 
    non_zero_indexes = [] 
    index_tfidf_values = [] 

    for key, value in tokens_kv.iteritems(): 
     index = 0 
     for word in dictionary: 
      if key == word: 
       non_zero_indexes.append(index) 
       index_tfidf_values.append(value) 
      index += 1 

    print non_zero_indexes 
    print index_tfidf_values 

    return SparseVector(vector_size, non_zero_indexes, index_tfidf_values) 

# Feature Extraction 
Training_Set_Vectors = (TFsIDFs_Vector_Weights_RDDs 
         .map(lambda (tokens): featurize(tokens, Dictionary_BV.value)) 
         .cache()) 

... und Etiketten ist nur eine Liste von 1 und 0. Ich verstehe, dass ich irgendwie beschrifteten Punkt irgendwie verwenden muss, aber ich bin verwechselt a, wie ... RDDs sind keine Liste, während Etiketten eine Liste ist, hoffe auf etwas, das so einfach ist, wie man einen Weg zum Erstellen von etikettierten Punktobjekten findet. Kombinieren sparse-vectors [i], entsprechende-labels [i] jeweilige Werte ... irgendwelche Ideen?

Antwort

0

Ich konnte dies lösen, indem ich zuerst die SparseVectors RDDs sammelte und sie effektiv in eine Liste umwandelte. Dann laufe ich eine Funktion, die eine Liste von labelledpoint Objekten konstruiert:

def final_form_4_training(SVs, labels): 
    """ 
    :param SVs: List of Sparse vectors. 
    :param labels: List of labels 
    :return: list of labeledpoint objects 
    """ 

    to_train = [] 
    for i in range(len(labels)): 
     to_train.append(LabeledPoint(labels[i], SVs[i])) 
    return to_train 

# Feature Extraction 
Training_Set_Vectors = (TFsIDFs_Vector_Weights_RDDs 
         .map(lambda (tokens): featurize(tokens, Dictionary_BV.value)) 
         .collect()) 

raw_input("Generate the LabeledPoint parameter... ") 
labelled_training_set = sc.parallelize(final_form_4_training(Training_Set_Vectors, training_labels)) 

raw_input("Train the model... ") 
model = NaiveBayes.train(labelled_training_set, 1.0) 

Dies setzt allerdings voraus, dass die RDDs ihre Reihenfolge beibehalten (mit dem ich nicht mit bin Messing) während der gesamten Prozesses Pipeline. Ich hasse auch den Teil, wo ich alles auf dem Master sammeln musste. Irgendwelche besseren Ideen?

Verwandte Themen