spark下的贝叶斯模型

这篇博客介绍了如何在Spark上实现贝叶斯分类模型。首先,通过`pyspark`库导入必要的模块,然后使用`HashingTF`和`IDF`进行特征工程,将文本数据转化为TF-IDF向量。接着,利用`NaiveBayes`训练模型,并对测试数据进行分类预测。最后,博主展示了如何将类别标签转换为数字并应用于模型训练。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

贝叶斯模型调用函数比较简单,重点是数据格式的读取。

还是在代码中说明吧

import os

import sys

from numpy import array


from pyspark import SparkConf

from pyspark import SparkContext


#from __future__ import print_function

from operator import add



from pyspark.mllib.feature import IDF

from pyspark.mllib.feature import HashingTF

from pyspark.mllib.linalg import Vectors


from pyspark.mllib.classification import NaiveBayes, NaiveBayesModel

from pyspark.mllib.regression import LabeledPoint

//以上是导入各种库


conf = SparkConf()

conf = conf.setMaster("local")

sc = SparkContext(conf=conf)

//以下这两个程序主要是为了把类别转成数字,对别人可能无用,可以借用的部分是,这样返回一个字典。

def split(line):

        return line.split('\t')[1],line.split('\t')[0]


def relation():

        fin = sc.textFile("file:///home/tag2.txt")

        dict_tag = dict(fin.map(split).collect())//返回一个字典。

        return dict_tag

//以下程序的读训练文本和训练的类,分别放在两个文件中,训练模型,并输入测试文本(只有一行)进行分类,返回类标号

def read_train_tag():

        dict_tag = relation()

        fin = sc.textFile("file:///new_train_tag")

        train_tag = fin.map(lambda line :dict_tag[line.strip()]).collect()//将类对应到数字标号

        return train_tag

def tfidf():

        train_tag = read_train_tag()

        doc = sc.textFile("file:///home/new_train_jieba")//分好词的训练文档

        doc1 = doc.map(lambda line:line.split(" "))

        htf = HashingTF(2000)//这里是把特征定义成2000维度,假如文本比较大,可以设置成默认的维度

        tf = htf.transform(doc1)

        idf = IDF()

        model = idf.fit(tf)

        tfidf = model.transform(tf)//构建tfidf模型


        output = tfidf.collect()

        data = []

//由于tfidf返回的是个稀疏矩阵,当时费了好大劲才知道该怎么做。首先是把稀疏矩阵转换成密集矩阵,使用toArray()函数可以把一个稀疏矩阵转成数组,转成数组后倒是可以不用转成密集矩阵了。转成密集矩阵并且加上类别label就是贝叶斯模型想要的格式

        for i in range(len(output)):

                data.append(LabeledPoint(train_tag[i],Vectors.dense(output[i].toArray())))

        na_model = NaiveBayes.train(sc.parallelize(data))//要改成贝叶斯模型需要的数据格式

        test = sc.textFile("file:///test_data")//输入测试数据就可以进行测试了,当然也要把测试数据改成和训练数据一样的格式



test1 = test.map(lambda line:line.split(" "))

        test_tf = htf.transform(test1)

        test_tfidf = model.transform(test_tf).collect()

        s = na_model.predict(test_tfidf[0].toArray())

        print (s)//是一个类别,后期调研一下,怎么得到每个类别以及概率



tfidf()




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值