朴素贝叶斯(ML)

简介 该代码实现了一个通用的朴素贝叶斯,很久之前的代码,但是一直没有写出来,放上代码与数据集,需要的朋友自取

一:数据集

二:代码

1. normal-bayes.py
### normal-bayes.py

import numpy as np
import pandas as pd

###  返回不重复的单词集合
def ListToSet(dataList):

    ### 定义一个set集合
    dataSet = set([])
    for data in dataList:
        dataSet = dataSet | set(data)   ### 生成集合

    return list(dataSet)   ### 返回一个不重复的列表


### 进行词集向量化,标记位置
def wordToVector(datavector, dataTrain):
    wordVector = [0]*len(datavector)  ### 初始化一个长度相同的向量

    for data in dataTrain:
        if data in datavector:    ### 存在词集中
            wordVector[datavector.index(data)] = 1 ### 向量中致1
        else:print("Error word Vector")

    return wordVector


##  data 是一个数据列表集
def trainBayes(dataList):

    featureData = []
    labelData = []

    dataListLen = len(dataList)

    ###  分割出 特征 和 标签值
    for data in dataList:
        featureData.append(data[:-1])
        labelData.append(data[-1:])

    ### 计算出不重复的特征
    labelSet = ListToSet(labelData)

    dictLabel = {}   ### 存储不同的label中的所有的词集 集合
    prePredict = {}   ### 用于计算先验概率
    ### 进行分类
    for label in labelSet:
        ### 创建一个{label:[]}符合结构
        dictLabel[label] = []
        prePredict[label] = list()
        count = 0.0
        for data in dataList:
            dataLabel = data[-1]
            if dataLabel == label:
                count+=1
                dictLabel[label].append(data[:-1]) ### 存储特征值

        ### 计算先验概率
        prePredict[label].append(count/dataListLen)


    wordDict = {}  ### 每一个制作词集
    wordVector = {}  ###  向量集
    for label in labelSet:
        wordDict[label] = ListToSet(dictLabel[label])   ### 制作一个词集
        wordVector[label] = list()
        for dataTrain in dictLabel[label]:    ### 在词集中进行单词的统计
            wordVector[label].append(wordToVector(wordDict[label], dataTrain))  ### 加入

    ### 计算每一个具体标签的概率
    predict = {}
    for label in labelSet:
        p1num = np.ones(len(wordVector[label][0]))   ### 设置大小
        p1demo = 1.0    ### 分母的值
        for vector in wordVector[label]:
            p1num += vector
            p1demo += sum(vector)

        ### 开始计算概率
        p1PredictVal = np.log(p1num/p1demo)
        predict[label] = p1PredictVal



    return prePredict, predict, wordDict


### 用于判别类型
def classfy(testVector, prePredict, predict, key):
    preDecision = {}

    preVal = sum(testVector * predict[key]) + np.log(prePredict[key])

    return preVal


# ### 用于判别类型
# def classfy(testVector, prePredict, predict):
#
#
#     preDecision = {}
#     for key in predict.keys():
#         preDecision[key] = sum(testVector * predict[key]) + np.log(prePredict)
#
#     ### 进行排序操作
#     preDecisionSorted = sorted(preDecision.items(), key=lambda x:x[1], reverse=True)
#
#     return preDecisionSorted[0][0]   ### 返回第一个值,也就是排序后最可能的标签值

def dataTest(trainData, testData):
    print("test")
    ### 训练的数据集处理
    prePredict, predict, wordDict = trainBayes(trainData)  ###  wordDict是词集

    count = 0.0
    testDataLen = len(testData)

    ### 对测试数据集处理
    for data in testData:
        testDataVal = data[:-1]
        testDataLabel = data[-1]
        preVal = -float("inf")
        returnKey = ""
        for key in wordDict:         ### 进行词集向量化
            # testDataSet = ListToSet()
            testVector = wordToVector(wordDict[key], testDataVal)   ### 获取测试数据集的向量化
            ###  进行测试
            returnPreVal = classfy(testVector, prePredict, predict, key)

            if returnPreVal > preVal:
                preVal = returnPreVal
                returnKey = key
        if returnKey != testDataLabel:
            count += 1

    ### 计算错误率
    errorRate = count / testDataLen

    return errorRate



if __name__ == '__main__':

    trainData = pd.read_csv("trainFile.data").values
    testData = pd.read_csv("testFile.data").values

    error = dataTest(trainData,testData)
    print(error)


2. normal-bayes-2.py

## normal-bayes-2.py

import numpy as np
import pandas as pd

###  返回不重复的单词集合
def ListToSet(dataList):
    """
    :param dataList: 列表词集,类型 []
    :return:    列表词集, 不重复的词集
    """
    ### 定义一个set集合
    dataSet = set([])
    for data in dataList:
        dataSet = dataSet | set(data)   ### 生成集合

    return list(dataSet)   ### 返回一个不重复的列表


### 进行词集向量化,标记位置
def wordToVector(datavector, dataTrain):
    """
    :param datavector:    词集,类型: []
    :param dataTrain:     词集,类型: []
    :return:        向量集,标记位置的向量集
    """
    wordVector = [0]*len(datavector)  ### 初始化一个长度相同的向量

    for data in dataTrain:
        if data in datavector:    ### 存在词集中
            wordVector[datavector.index(data)] = 1 ### 向量中致1
        else:
            print("Error word Vector")

    return wordVector


##  data 是一个数据列表集
def trainBayes(dataList):
    """
    :param dataList: 参数要求是一个[[],[]] 类型的数组,包含特征和标签值,并且 标签值为最后一列
    :return: 返回值类型是字典中嵌套列表 {label: [] }
        prePredict:类型:{label: [] } ,含义:先验概率,也就是每一个标签在所有样本中的概率
        predict:类型:{label: [] } ,含义:条件概率,具体类别中,生成的不重复的词集合的概率
        wordDict: 类型: {label: [] } , 含义:具体类别的词集合
    """
    labelData = []

    dataListLen = len(dataList)

    ###  分割出 特征 和 标签值
    for data in dataList:
        labelData.append(data[-1:])

    ### 计算出不重复的标签
    labelSet = ListToSet(labelData)

    dictLabel = {}   ### 存储不同的label中的所有的词集 集合
    prePredict = {}   ### 用于计算先验概率
    ### 进行分类
    for label in labelSet:
        ### 创建一个{label:[]}符合结构
        dictLabel[label] = []
        prePredict[label] = list()
        count = 0.0
        for data in dataList:
            dataLabel = data[-1]
            if dataLabel == label:
                count+=1
                dictLabel[label].append(data[:-1]) ### 存储特征值

        ### 计算先验概率
        prePredict[label].append(count/dataListLen)


    wordDict = {}  ### 每一个制作词集
    wordVector = {}  ###  向量集
    for label in labelSet:
        wordDict[label] = ListToSet(dictLabel[label])   ### 制作一个词集
        wordVector[label] = list()
        for dataTrain in dictLabel[label]:    ### 在词集中进行单词的统计
            wordVector[label].append(wordToVector(wordDict[label], dataTrain))  ### 加入

    ### 计算每一个具体标签的概率
    predict = {}
    for label in labelSet:
        p1num = np.ones(len(wordVector[label][0]))   ### 设置大小
        p1demo = 1.0    ### 分母的值
        for vector in wordVector[label]:
            p1num += vector
            p1demo += sum(vector)

        ### 开始计算概率
        p1PredictVal = np.log(p1num/p1demo)
        predict[label] = p1PredictVal



    return prePredict, predict, wordDict


### 用于判别类型
def classfy(testVector, prePredict, predict, key):
    """

    :param testVector: 类型:[], 测试词集
    :param prePredict: 类型:{key:[]} 先验概率
    :param predict:    类型:{key:[]} 条件概率
    :param key:        类型:str  标签值
    :return:           该标签下的概率值
    """
    preDecision = {}

    preVal = sum(testVector * predict[key]) + np.log(prePredict[key])

    return preVal


# ### 用于判别类型
# def classfy(testVector, prePredict, predict):
#
#
#     preDecision = {}
#     for key in predict.keys():
#         preDecision[key] = sum(testVector * predict[key]) + np.log(prePredict)
#
#     ### 进行排序操作
#     preDecisionSorted = sorted(preDecision.items(), key=lambda x:x[1], reverse=True)
#
#     return preDecisionSorted[0][0]   ### 返回第一个值,也就是排序后最可能的标签值

def dataTest(trainData, testData):
    """
    :param trainData:  训练数据集 ,类型:[[],[],...], 包含特征和标签,且最后一列为标签值
    :param testData:   测试数据集, 类型:[[],[],...], 包含特征和标签,且最后一列为标签值
    :return:       错误率
    """
    ### 训练的数据集处理
    prePredict, predict, wordDict = trainBayes(trainData)  ###  wordDict是词集

    count = 0.0
    testDataLen = len(testData)

    ### 对测试数据集处理
    for data in testData:
        testDataVal = data[:-1]
        testDataLabel = data[-1]
        preVal = -float("inf")
        returnKey = ""
        for key in wordDict:         ### 进行词集向量化
            testDataSet = ListToSet(testDataVal)   ### 将测试词集进行去重
            testVector = wordToVector(wordDict[key], testDataSet)   ### 获取测试数据集的向量化
            ###  进行测试
            returnPreVal = classfy(testVector, prePredict, predict, key)

            if returnPreVal > preVal:
                preVal = returnPreVal
                returnKey = key
        if returnKey != testDataLabel:
            count += 1

    ### 计算错误率
    errorRate = count / testDataLen

    return errorRate



if __name__ == '__main__':

    trainData = pd.read_csv("trainFile.data").values
    testData = pd.read_csv("testFile.data").values

    error = dataTest(trainData,testData)
    print(error)
    # print("****************************************************************")
    # error = dataTest(testData, trainData)
    # print(error)


"""
normal-bayes.py    测试数据集没有进行去重操作,错误率达到了 54% 左右

normal-bayes-2.py  测试数据集进行了去重处理, 错误率  30% 左右, 降低了 24% 错误率

"""







朴素贝叶斯参考博客(机器学习实战)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值