机器学习系列之朴素贝叶斯算法(监督学习-分类问题)

'''
@description :一级分类:监督学习,二级分类:分类(离散问题),三级分类:贝叶斯算法
    算法优点:
        a 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率
        b 对缺失的数据不太敏感,算法也比较简
        c 分类问题准确度高、速度快
    算法缺点:
        a 由于使用了样本属性独立性的假设,所以如果样本属性有关联时其效果不好
    应用场景:常用于文本分类问题
@author wolf
@time   2018-05-02
'''

from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report


def naivebases():
    # 1 读取数据,加载sscikitLearn官方数据集

    '''
    数据集官方地址:http://sklearn.apachecn.org/cn/0.19.0/datasets/twenty_newsgroups.html
    数据集背景:20类别,18846篇文章
    数据集类别:news.target_names,news.target
    查看文章内容:
        orign_data = list(news.data)
        for x in range(10):
            print(orign_data[x])
            print("*" * 100)
    type(news.data) 是list不是ndarray
    '''

    news = fetch_20newsgroups(subset='all')

    # 2 数据集分割:训练集、测试集

    '''
    通用标准:测试集占比25%
    type(x_train) 是list不是ndarray
    '''

    x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25)

    # 3 特征工程:数据集特征抽取
    '''
    使用tf-idf算法:
        a 提取文章内容中分词(通用规则按空格,英文文章不需要处理,中文需要借助开源工具jieba按中文语义拆分中文分词)
        b 计算分词在文章中重要性(大部分语气词词频很高,但不能代表文档的属性)
        c tf-idf = tf(term frequnce分词在文章中词频) * idf(inverse document frequnce)
         idf = log(总文档数/该分词出现的文档数) log:对数据函数
        d 返回所有分词(特征)相对于文章的重要性矩阵 tf.get_feature_names(),返回结果默认是sparse矩阵:
            x_train.toarray()
        e type(x_train) <class 'scipy.sparse.csr.csr_matrix'>,scipy基于numpy,最终数据结构ndarray
          x_train.shape:(14134, 149647)
    '''
    tf = TfidfVectorizer()

    # 训练集
    x_train = tf.fit_transform(x_train)

    # 测试集
    x_test = tf.transform(x_test)

    # 4 朴素贝叶斯算法
    '''
    算法思想:根据目标(测试集)分词-特征(根据tf-idf算法计算出重要性的分词并在分词中刷选重要的分词,默认是刷选出的
        全部重要分词)在数据集(训练集、测试集)
        计算文章归属类别的概率(贝叶斯概率),最终选中概率最大类别。为了保证计算出的概率不为0,概率计算中增加拉普拉
        斯平滑系数
    数学原理:
        联合概率:P(A&B) = P(A) * P(B)
        条件概率:P(A|C, B|C) = P(A|C) * P(B|C)
        贝叶斯公式:P(C|F1,F2...) = P(F1,F2...|C) * P(C) / P(F1,F2...)
            Ni = P(F1,F2...|C) * P(C) 指定分类特征分词概率
            P(C) 总文章数指定类别的概率
            P(W) = P(F1,F2...) 指定特征分词概率
        拉普拉斯平滑系数: (Ni + a) / (m * a) a常为1、 m常为总特征分词数
    
    '''

    # 朴素贝叶斯模型
    mlt = MultinomialNB(alpha=1.0)
    mlt.fit(x_train, y_train)

    # 预测测试集类别
    y_predict = mlt.predict(x_test)
    print("预测的文章类别为:", y_predict)

    # 模型评估
    '''
    TP、FP、TN、FN构成混淆矩阵
    准确率(accuracy) = (TP+TN) / ALL
    精确率(precision) = TP / (TP + FP)
    召回率(recall) = TP / (TP + FN)
    F1-score = 2 * precision * recall / (precision + recall)表示模型的稳定性 
    '''
    print("准确率:", mlt.score(x_test, y_test))

    rp = classification_report(y_test, y_predict, target_names=news.target_names)
    print(rp)


if __name__ == "__main__":
    naivebases()
发布了30 篇原创文章 · 获赞 9 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/wolfjson/article/details/81391188