机器学习基础算法4-分类算法--朴素贝叶斯算法

目录

 

概率基础

联合概率

朴素贝叶斯-贝叶斯公式

拉普拉斯平滑

sklearn朴素贝叶斯实现API

朴素贝叶斯算法案例

朴素贝叶斯分类优缺点

•优点:

•缺点:

模型的选择与调优

混淆矩阵

精确率(Precision)与召回率(Recall)

分类模型评估API

交叉验证

超参数搜索-网格搜索

超参数搜索-网格搜索API

K-近邻网格搜索案例


   

 

概率基础

       •概率定义为一件事情发生的可能性

       •扔出一个硬币,结果头像朝上

       •某天是晴天

联合概率

包含多个条件,且所有条件同时成立的概率

记作P(A,B),P(A,B)=P(A)P(B)

条件概率:就是事件A在另外一个事件B已经发生条件下的发生概率

记作:P(A|B)

特性:P(A1,A2|B) = P(A1|B)P(A2|B)

注意:此条件概率的成立,是由于A1,A2相互独立的结果

朴素贝叶斯-贝叶斯公式

 

 

例子

拉普拉斯平滑

问题:从上面的例子我们得到娱乐概率为0,这是不合理的,如果词频列表里面

有很多出现次数都为0,很可能计算结果都为零。

解决方法:拉普拉斯平滑系数

𝑃𝐹1𝐶=𝑁𝑖+𝛼𝑁+𝛼𝑚P(F1│C)=(Ni+α)/(N+αm)                        

𝛼指定系数α指定系数一般为1m为训练文档中统计出的特征词个数

 

sklearn朴素贝叶斯实现API

MultinomialNB

sklearn.naive_bayes.MultinomialNB ( alpha = 1.0 )
朴素贝叶斯分类
alpha :拉普拉斯平滑系数

朴素贝叶斯算法案例

sklearn20 类新闻分类
20 个新闻组数据集包含 20 个主题的 18000 个新闻组帖子
 
def naviebayes():
    """
    朴素贝叶斯进行文本分类
    :return: None
    """
    news = fetch_20newsgroups(subset='all')#获取数据

    # 进行数据分割 参数(一篇文章 文章所属类别 测试集大小)
    x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25)

    # 对数据集进行特征抽取
    tf = TfidfVectorizer()

    # 以训练集当中的词的列表进行每篇文章重要性统计['a','b','c','d']
    x_train = tf.fit_transform(x_train)

    print(tf.get_feature_names())

    x_test = tf.transform(x_test)

    # 进行朴素贝叶斯算法的预测
    mlt = MultinomialNB(alpha=1.0)

    print(x_train.toarray())

    mlt.fit(x_train, y_train)

    y_predict = mlt.predict(x_test)

    print("预测的文章类别为:", y_predict)

    # 得出准确率
    print("准确率为:", mlt.score(x_test, y_test))

    # print("每个类别的精确率和召回率:", classification_report(y_test, y_predict, target_names=news.target_names))

    return None

朴素贝叶斯分类优缺点

•优点:

朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
对缺失数据不太敏感,算法也比较简单,常用于文本分类。
分类准确度高,速度快
 

缺点:

需要知道 先验概率 P(F1,F2, |C) ,因此在某些时候会由于假设的先验

模型的原因导致预测效果不佳。假设了文章中一些词语与另外一些是独立没关系,在训练集中去进行统计词这些工作,会对结果造成干扰。

模型的选择与调优

estimator.score ()
一般最常见使用的是 准确率 ,即预测结果正确的百分比
 

混淆矩阵

在分类任务下,预测结果(Predicted Condition)与正确标记(True Condition)之间存在四种不同的组合,构成混淆矩阵(适用于多分类)。

精确率(Precision)与召回率(Recall)

 

分类模型评估API

sklearn.metrics.classification_report

•sklearn.metrics.classification_report(y_truey_predtarget_names=None)

y_true:真实目标值

y_pred:估计器预测目标值

target_names:目标类别名称

return:每个类别精确率与召回率

print("每个类别的精确率和召回率:", classification_report(y_test, y_predict, target_names=news.target_names))

 

交叉验证

为了让被评估的模型更加准确可信

交叉验证:将拿到的数据,分为训练和验证集。以下图为例:将数据分

5份,其中一份作为验证集。然后经过5()的测试,每次都更换不同

的验证集。即得到5组模型的结果,取平均值作为最终结果。又称5折交叉

验证。

超参数搜索-网格搜索

通常情况下,有很多参数是需要手动指定的(如k-近邻算法中的K值),

这种叫超参数。但是手动过程繁杂,所以需要对模型预设几种超参数组

合。每组超参数都采用交叉验证来进行评估。最后选出最优参数组合建

立模型。

K

K=3

K=5

K=7

模型

模型1

模型2

模型3

超参数搜索-网格搜索API

sklearn.model_selection.GridSearchCV

GridSearchCV

sklearn.model_selection.GridSearchCV ( estimator,  param_grid = None , cv =None )
对估计器的指定参数值进行详尽搜索
estimator :估计器对象
param_grid :估计器参数 ( dict ){“ n_neighbors ”:[1,3,5]}
cv :指定几折交叉验证
fit :输入训练数据
score :准确率
结果分析:
best_score _: 在交叉验证中测试的最好结果
best_estimator _ :最好的参数 模型
cv_results _: 每次交叉验证后的测试集准确率结果和训练集 准确率 结果

K-近邻网格搜索案例

即可以将下列代码注释掉

# knn.fit(x_train, y_train)
    #
    # # 得出预测结果
    # y_predict = knn.predict(x_test)#参数测试集的特征值
    #
    # print("预测的目标签到位置为:", y_predict)
    #
    # # 得出准确率
    # print("预测的准确率:", knn.score(x_test, y_test))

导入网格模型搜索

from sklearn.model_selection import GridSearchCV
 # 构造一些参数的值进行搜索
    param = {"n_neighbors": [3, 5, 10]}

    # 进行网格搜索 param_grid构造一些参数的值,进行搜索 cv:交叉验证次数
    gc = GridSearchCV(knn, param_grid=param, cv=2)

    gc.fit(x_train, y_train)#训练数据集

    # 预测准确率
    print("在测试集上准确率:", gc.score(x_test, y_test))

    print("在交叉验证当中最好的结果:", gc.best_score_)

    print("选择最好的模型是:", gc.best_estimator_)

    print("每个超参数每次交叉验证的结果:", gc.cv_results_)

    return None

 

 

 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值