NaiveBayes使用pyspark进行单独训练集和数据的模型训练

时间:2016-06-17 12:59:20

标签: python classification pyspark naivebayes

所以,我正在尝试训练一个天真的贝叶斯分类器。在预处理数据方面遇到了很多麻烦,我现在已经生成了两个RDD:

  1. Traininng集:由一组稀疏向量组成;
  2. 标签:每个向量的对应的标签列表(0,1)。
  3. 我需要运行这样的东西:

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

    但“training”是一个源自运行的数据集:

    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)
    

    基于python here的文档。我的问题是,鉴于我不想从txt文件加载数据,并且我已经以映射到稀疏向量(RDD)和相应的标记列表的记录形式创建了训练集,我该怎么办?跑天真的贝叶斯?

    以下是我的代码的一部分:

    # 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())
    

    ...而标签只是1和0的列表。我知道我可能需要以某种方式以某种方式使用labelpoint,但我很困惑如何...... RDD不是一个列表,而标签是一个列表我希望有一些简单的方法来创建标记点objets [i]结合稀疏矢量[i],相应标签[i]各自的值......任何想法?

1 个答案:

答案 0 :(得分:0)

我能够通过首先收集SparseVectors RDD来解决这个问题 - 有效地将它们转换为列表。然后,我运行一个构造列表的函数 labelledpoint对象:

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)

然而,这假设RDD在整个流程管道中保持其顺序(我没有弄乱)。我也讨厌我必须收集主人的一切。有更好的想法吗?

相关问题