HanLP-朴素贝叶斯分类预测缺陷

简介: 文章整理自 baiziyu 的知乎专栏,感兴趣的朋友可以去关注下这位大神的专栏,很多关于自然语言处理的文章写的很不错。昨天看到他的分享的两篇关于朴素贝叶斯分类预测的文章,整理了一下分享给给大家,文章已做部分修改!朴素贝叶斯分类时,最好取对数变相乘为相加,防止预测结果溢出。

文章整理自 baiziyu 的知乎专栏,感兴趣的朋友可以去关注下这位大神的专栏,很多关于自然语言处理的文章写的很不错。昨天看到他的分享的两篇关于朴素贝叶斯分类预测的文章,整理了一下分享给给大家,文章已做部分修改!
_

朴素贝叶斯分类时,最好取对数变相乘为相加,防止预测结果溢出。可能出现的badcase就是明明训练语料X类目下没有词语t,而系统就将文本预测为X类目。解决方法就时改相乘为取对数相加。HanLP的朴素贝叶斯分类计算没有用对数相加的方法,而是直接用的概率相乘,很有可能溢出。

对上述内容做一些更正,HanLP的朴素贝叶斯是按照概率取对数相加做的。
看一下下边的代码

@Override

public double[] categorize(Document document) throws IllegalArgumentException, IllegalStateException
{
    Integer category;
    Integer feature;
    Integer occurrences;
    Double logprob;

    double[] predictionScores = new double[model.catalog.length];
    for (Map.Entry<Integer, Double> entry1 : model.logPriors.entrySet())
    {
        category = entry1.getKey();
        logprob = entry1.getValue(); //用类目的对数似然初始化概率

        //对文档中的每个特征
        for (Map.Entry<Integer, int[]> entry2 : document.tfMap.entrySet())
        {
            feature = entry2.getKey();

            if (!model.logLikelihoods.containsKey(feature))
            {
                continue; //如果在模型中找不到就跳过了
            }

            occurrences = entry2.getValue()[0]; //获取其在文档中的频次

            logprob += occurrences * model.logLikelihoods.get(feature).get(category); //将对数似然乘上频次
        }
        predictionScores[category] = logprob;
    }

    if (configProbabilityEnabled) MathUtility.normalizeExp(predictionScores);
    return predictionScores;
}

这么看来,之前遇到的下边的这个badcase就还要再分析
[1] 化验指标一变化患者就六神无主,看医生怎么讲解
核心词:患者 看医生
这里“患者”和“看医生”两个词都没在“艺术”类训练语料中出现,但是预测概率最大的反倒是“艺术”。
由于用PyHanLP没法看到预测概率的计算过程,所以还是把Python的分类预测代码改为Java代码调式看一下。今天移植了预处理,资源加载,人工干预部分的代码,明天把剩余预测部分移植为Java再来看这个badcase。这就是朴素贝叶斯的优势,分析起来非常清晰容易。不过从PyHanLP的预测输出概率值来看,不太像是取了对数相加得到的,因为都是0-1之间的数值,这一看就是概率值。

相关文章
|
6月前
|
机器学习/深度学习 人工智能 自然语言处理
机器学习之线性回归与逻辑回归【完整房价预测和鸢尾花分类代码解释】
机器学习之线性回归与逻辑回归【完整房价预测和鸢尾花分类代码解释】
|
机器学习/深度学习 传感器 算法
BES-LSSVM分类预测 | 秃鹰搜索优化最小二乘支持向量机分类预测
BES-LSSVM分类预测 | 秃鹰搜索优化最小二乘支持向量机分类预测
|
3月前
|
机器学习/深度学习 数据挖掘 Python
简单几步,教你使用scikit-learn做分类和回归预测
简单几步,教你使用scikit-learn做分类和回归预测
|
6月前
|
机器学习/深度学习 数据采集 数据可视化
数据分享|python分类预测职员离职:逻辑回归、梯度提升、随机森林、XGB、CatBoost、LGBM交叉验证可视化
数据分享|python分类预测职员离职:逻辑回归、梯度提升、随机森林、XGB、CatBoost、LGBM交叉验证可视化
|
6月前
|
机器学习/深度学习 算法
【视频】R语言逻辑回归(Logistic回归)模型分类预测病人冠心病风险|数据分享
【视频】R语言逻辑回归(Logistic回归)模型分类预测病人冠心病风险|数据分享
|
6月前
|
算法 Python
利用贝叶斯算法对简单应用实现预测分类
利用贝叶斯算法对简单应用实现预测分类
|
6月前
|
机器学习/深度学习 数据采集 算法
使用scikit-learn进行分类:模型选择与评估
【4月更文挑战第17天】本文介绍了使用scikit-learn进行分类任务,包括模型选择和评估。scikit-learn提供多种分类算法如逻辑回归、SVM、决策树等。选择模型需理解问题、预处理数据、设置基准模型、交叉验证、特征重要性分析和调参。评估模型性能有准确率、精确率、召回率、F1分数和混淆矩阵。通过训练、预测和计算指标分析模型效果。示例展示了随机森林分类器的应用。选择和评估模型需根据具体问题和数据集进行。
|
6月前
|
机器学习/深度学习
R语言逻辑回归(Logistic回归)模型分类预测病人冠心病风险
R语言逻辑回归(Logistic回归)模型分类预测病人冠心病风险
|
机器学习/深度学习 存储 自然语言处理
机器学习算法(一): 基于逻辑回归的分类预测
机器学习算法(一): 基于逻辑回归的分类预测
24037 1
机器学习算法(一): 基于逻辑回归的分类预测
|
机器学习/深度学习 算法
【机器学习】分类模型评价指标(混淆矩阵、ROC)(已修改,放心看)
【机器学习】分类模型评价指标(混淆矩阵、ROC)(已修改,放心看)
190 0