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



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

  1. trainng set:由一组稀疏向量组成;
  2. 标签:a 对应每个向量的标签列表(0,1)。

我需要运行这样的东西:

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

但"训练"是从运行中得出的数据集:

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的文档。我的问题是,鉴于我不想从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的列表。我知道我可能需要以某种方式使用标签点,但是我对... rdds不是列表时感到困惑,而标签是一个列表,希望能像提出一种创建标签上的objets objets [i]一样简单的东西。组合稀疏 - 向量[i],相应标签[i]相应的值...任何想法?

我能够通过首先收集跨度向量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在整个过程管道中保持其顺序(我不搞砸)。我也讨厌必须收集主人上的所有内容的部分。有更好的想法吗?

最新更新