zoukankan      html  css  js  c++  java
  • 机器学习4《朴素贝叶斯》

    朴素贝叶斯 '朴素' 是指条件之间互斥  (神经网络算法好一些)
    常用在文档分类
    API:
    from sklearn.naive_bayes import MultinomialNB

    朴素贝叶斯分类优缺点
    优点:
    .朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。对缺失数据不太敏感,算法也比较简单,常用于文本分类。分类准确度高,速度快,
    缺点:
    .由于使用了样本属性独立性的假设,所以如果样本属性有关联时其效果不好


    在我们剖析贝叶斯公式之前我们需要了解一下概率论里面的条件概率,乘法公式,全概率公式
    条件概率
    商品房 经济适用房 总计
    富裕户 1300 500 1800
    贫困户 200 3000 3200
    总计 1500 3500 5000

    有如下问题:
    1) 任意选中一套房,发现是经济适用房且被贫困户购买的概率 ---- 》 概率P(3000/500)
    2) 任意选中一套房发现是经济试用房,求他被贫困户购买的概率 ------》 P(贫困户 经济) = 3000/3500
    第一种情况为两者同时发生我们记作P(AB) 可以发现中两种情况发生的概率是不同的
    所以事件A发生时发生事件B我们把这种情况记作 P(B A) 该概率的样本空间为 ΩB 而概率P(A) 与P(AB) 立足与样本空间Ω

    条件概率公式得出:P(B A) , P(A) 与P(AB) 的关系为 P(B A) = P(AB) / P(A)

    由条件概率得出的公式 则有乘法公式 P(B A)* P(A) = P(AB)
    整理一下就有 P(A1,A2,A3...An) = P(A1)P(A2A1)P(A3A1A2A3)...P(AnA1...An-1)

    设有一 矿工被困井下,他可以等可能性地选择三个通道之一逃生, 若矿工通过第一个通道逃生成功的可能性为3/2,
    第二个通道逃生成功的可能性为4/5,第三个通道逃生成功
    的可能性为1/6问此矿工逃生成功的可能性是多少?
    设A={矿工逃生成功};B;={矿工选择第i个逃生通道},i=1,2,3.则
    P(A) = P(B1)P(AB1)+P(B2)P(AB2)+P(B3)P(AB3)
    若已知矿工逃生,那么他选择第一个通道逃生的可能性多大?
    此问题就是求 P(B1A) = P(AB1)P(A)
    整理一下可得贝叶斯公式
    贝叶斯公式本质就是已知结果求原因

    由此可见我们的贝叶斯公式的理论基础多么强大,贝叶斯公式为我们的分类 打下了良好的基础
    但是朴素贝叶斯算法,没有超参数可以调,所以如果我们需要保证预测的准确性,就需要保证训练集的误差小 训练集要准备充分


    精准率(precision)与召回率(recall):
    精准率:预测结果为正例样本为真实正例的比例 (查的准)
    召回率:真实为正例的样本中预测结果为正例的比例 (差的全,对正样本的区分能力)
    F1-score:反应了模型的稳健性 F1 = 2*precision*recall/(precision + recall)
    API: sklearn.metrics.classification_report(y_true, y_pred, target_names=None)
    y_true: 真实目标值
    y_pred: 估计器预测目标值
    target_names: 目标类别名称
    return:每个类别精确率和召回率
    def psb():
        new = fetch_20newsgroups(subset='all')  # 形成数据集
        # print(new.target, new.DESCR)
        '''
        X: 特征值
            X_train : 特征值训练集 
            X_test  : 目标值测试集
        Y:目标值
            Y_train : 目标值训练集
            Y_test  : 目标值测试集
        '''
    
        X = new.data
        Y = new.target
        X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.25)  # 划分数据集
    
        tf = TfidfVectorizer()    # 特征抽取
        tf.fit(X)
    
        X_train = tf.transform(X_train)
    
        X_test = tf.transform(X_test)
    
        print('X_train', X_train)
    
    
        bys = MultinomialNB(alpha=1.0)   # alpha   拉普拉斯平滑
        bys.fit(X_train, Y_train)
    
        a = bys.score(X_test, Y_test)
        Y_pre = bys.predict(X_test)
        print(a)
        print('精准率与召回率:',classification_report(y_true=Y_test,y_pred=Y_pre, target_names=new.target_names))
    贝叶斯
    交叉验证与网络搜索
    sklearn.model_selection.GridSearchCV(estimator, param_grid=None, cv=None)
    ·estimator 估计器对象
    ·param_grid: 估计器参数(dict){"n_neighbors":[1, 2, 3, 5]}----k临近
    ·cv :指定几折交叉验证

    ·fit: 输入训练数据
    ·score:正确率
    ·结果分析:
    ·best_score: 在交叉验证中验证的最好结果
    ·best_estimator_:最好的参数模型
    ·cv_results_: 每集交叉验证后测试集准确率结果和训练集准确率的结果
  • 相关阅读:
    Spring MVC返回多重的Json数据
    Eclipse Maven项目中修改JDK版本
    Maven的使用笔记
    Windows下Redis主从配置出现Writing to master:Unknow error
    Java开发必会的Linux命令(转)
    使用maven引入slf4j、logback时发生冲突
    使用SSM框架搭建JavaWeb,使用Junit测试时遇到CannotGetJdbcConnetionException
    HTTP基础
    express 热启动 静态文件部署 跨域解决 调试
    github+git提交 基础用法
  • 原文地址:https://www.cnblogs.com/BookMiki/p/10555871.html
Copyright © 2011-2022 走看看