机器学习 -- 朴素贝叶斯分类器

场景

朴素贝叶斯分类器是一种基于贝叶斯定理的简单概率分类器,广泛应用于各种机器学习场景。朴素贝叶斯分类器利用贝叶斯定理来预测一个数据点的类别。贝叶斯定理提供了一种计算条件概率的方法,即在已知某些信息的情况下,事件发生的概率。“朴素”一词源于该算法对特征之间相互独立的假设。在现实世界中,这种假设可能并不总是成立,但朴素贝叶斯在实践中仍然表现良好。对于给定的训练数据集,算法首先基于类别计算特征的概率分布。然后,使用这些概率来预测新数据点的类别。

适用场景和用途

·文本分类:例如垃圾邮件识别、新闻文章分类。朴素贝叶斯特别适用于处理文本数据,因为它能够处理大量的特征(如单词)。

·情感分析:在社交媒体分析、产品评论等领域中识别正面或负面情感。

·推荐系统:基于用户的兴趣和偏好预测用户可能喜欢的产品或服务。

·医疗诊断:基于症状预测疾病。

·天气预测:例如根据历史天气数据预测下雨概率。

案例

假设我们有两个类别:0 和 1。类别 0 可以代表“负面评论”,类别 1 可以代表“正面评论”。
准备数据集:

# 示例数据集
data = [
    "This product is great",
    "I am very happy with this purchase",
    "Terrible, I hate it",
    "Worst experience ever",
    "I love this product",
    "Not what I expected",
    "Highly recommended",
    "Very disappointed",
    "Will buy it again",
    "Do not recommend"
]

# 对应的类别标签
labels = [1, 1, 0, 0, 1, 0, 1, 0, 1, 0]

这里我们通过两种方式,第一种是python提供好的一个API,第二个我们自己根据公式来写一个简单的分类器,比对一下效果。

API


def python_test(data,labels,vectorizer):
        # 将数据集转化为向量
        X = vectorizer.fit_transform(data)
        # 划分数据集和训练集
        X_train, X_test, y_train, y_test = train_test_split(X, labels, test_size=0.2, random_state=42)
        # 创建并训练朴素贝叶斯模型
        model = MultinomialNB()
        model.fit(X_train, y_train)
        return model

if __name__ == '__main__':
    vectorizer = CountVectorizer()
    data,labels = loadData()
    model =  python_test(data,labels,vectorizer)

    test_data = ["Really happy with this product", "It was a bad purchase"]
    test_X = vectorizer.transform(test_data)
    predictions = model.predict(test_X)
    print(predictions)

结果是[0,1]
在这里我们可以看到是把数据先转成向量,然后划分数据集和训练集,然后训练这些数据,最后给出结果,就其原理,实际上是,将词拆开之后,对每一个词计算概率,然后对给出的这个词,看看它的概率是好评大,还是差评大。我们可以写一下这个过程。

算法

加载数据集
# 加载数据集
def loadDataSet():
    postingList = [['you', 'are', 'a', 'pig'],
                   ['you', 'are', 'a', 'smart', 'boy']]
    classVec = [1, 0]  # 1代表侮辱性文档,0代表非侮辱性文档
    return postingList, classVec

这里我们有两个数据集,1代表侮辱性文档,0代表非侮辱性的文档。

创建词汇表
def createVocabList(dataSet):
    vocabSet = set([])  
    for document in dataSet:
        vocabSet = vocabSet | set(document)  
    return list(vocabSet)

这里我们创建了词汇表 将所有的单词都放入这个词汇表中去了

将文档转换为词向量
def setOfWords2Vec(vocabList, inputSet):
    returnVec = [0] * len(vocabList)
    for word in inputSet:
        if word in vocabList:
            returnVec[vocabList.index(word)] = 1
        else:
            print("the word: %s is not in my Vocabulary!" % word)
    return returnVec

这里很简单,就是拿到这个语句在词汇表中的索引集,非常简单

训练朴素贝叶斯分类器
def trainNB0(trainMatrix, trainCategory):
    numTrainDocs = len(trainMatrix)
    numWords = len(trainMatrix[0])
    pAbusive = sum(trainCategory) / float(numTrainDocs)
    p0Num = ones(numWords)
    p1Num = ones(numWords)
    p0Denom = 2.0
    p1Denom = 2.0
    for i in range(numTrainDocs):
        if trainCategory[i] == 1:
            p1Num += trainMatrix[i]
            p1Denom += sum(trainMatrix[i])
        else:
            p0Num += trainMatrix[i]
            p0Denom += sum(trainMatrix[i])
    p1Vect = log(p1Num / p1Denom)
    p0Vect = log(p0Num / p0Denom)
    return p0Vect, p1Vect, pAbusive

这里事实上就是计算 好坏文档的概率,然后再计算 每一个词在好文档,坏文档中出现的概率

对新文档进行分类

传入一个新文档,对文档进行分类。

def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
    p1 = sum(vec2Classify * p1Vec) + log(pClass1)
    p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
    return 1 if p1 > p0 else 0

其实就是比较概率谁大而已

测试
if __name__ == '__main__':
    # 加载数据 postingList是总文档,classVec是类别表示是否是侮辱性文档
    postingList, classVec = loadDataSet()
    # 简历独立的词汇表
    print(postingList)
    print(classVec)
    list = createVocabList(postingList)
    print(list)
    trainMatrix= []
    for posting in postingList:
        trainMatrix.append(setOfWords2Vec(list,posting))
    print(trainMatrix)
    p0Vect,p1Vect,pAbusive = trainNB0(trainMatrix,classVec)
    print(p0Vect)
    testEntry = ['FUCK','LOVE']
    thisDoc = array(setOfWords2Vec(list, testEntry))
    result = classifyNB(thisDoc, p0Vect, p1Vect, pAbusive)
    print(result)

结束

朴素贝叶斯分类器基本使用和原理结束

你可能感兴趣的:(python,AI,机器学习,人工智能)