数据挖掘读书笔记--第八章(中):分类:贝叶斯分类法 、基于规则分类

标签: 数据挖掘 贝叶斯分类 Python实现朴素贝叶斯 基于规则分类
47人阅读 评论(0) 收藏 举报
分类:

散记知识点

——“继续学习经典分类算法”


3. 贝叶斯分类法(Naive Bayesian)

贝叶斯分类法是统计学分类方法,基于贝叶斯定理。朴素贝叶斯分类法可以与决策树和经过挑选的神经网络分类器相媲美。用于大型数据库,贝叶斯分类法也表现出高准确率和高速度。

3.1 贝叶斯定理

设数据元组Xn个属性,给定Xn个属性值已知的条件下,X被认定为类别C的概率为P(C|X),称为后验概率也即我们要求的概率。

P(X)P(C)称为先验概率,其中P(X)可以用X出现的概率来估计。比如,在顾客集合中,年龄为35岁且收入为4万美元的概率。P(C)为类别的先验概率,可以用类C在整个数据集出现的频率来估计。

P(X|C)是在类别为C的条件下,X的后验概率。例如,已知类别为顾客X购买计算机,则X的年龄为35岁收入为4万元的概率。

根据已知数据集D,我们可以得到P(X)P(C)P(X|C),则在给定一个新的数据元组X,来判断它是否属于某类的概率为P(C|X):(例如,已知年龄为30岁收入为3万美元顾客,则他会购买计算机的概率为:)

P(C|X)=P(X|C)P(C)P(X)

即为贝叶斯公式


3.2 朴素贝叶斯分类

朴素贝叶斯分类法有个前提条件:为了简化运算,假设在给定类别C的条件下,每个属性相互独立。这一假设称为类条件独立性,大大简化的计算量,故被称为“朴素”贝叶斯分类。

朴素贝叶斯分类的主要过程如下:

  • (1) 数据集D中,每个数据元组Xn个属性A1,A2,...,An的属性值组成:X={x1,x2,...,xn}。同时,有m个类C1,C2,...,Cn

  • (2) 给定数据元组X,使用贝叶斯定理预测X属于使得P(Ci|X)最大的类Ci:

    P(Ci|X)>P(Cj|X)       1jm,   ji
    P(Ci|X)的类称为最大后验假设。则:
    P(Ci|X)=P(X|Ci)P(Ci)P(X)

  • (3) 由于P(X)=i=1mP(X|Ci)P(Ci)对所有类为常数。所以只需关心P(X|Ci)P(Ci)最大即可。

  • 如果类先验概率可知,类先验概率可用P(Ci)=|Ci,D| / |D|估计,其中|Ci,D|DCi类的训练元组个数。
  • 如果类别的先验概率未知,则通常假定这些类是等概率的,即P(C1)=P(C2)=...=P(Cm),据此简化为对P(Ci|X)最大化。

  • (4) 若数据集具有许多属性,计算P(X|Ci)开销很大,使用类条件独立的朴素假定:即在给定类别条件下,属性值相互独立:

    P(X|Ci)=k=1nP(xk|Ci)=P(x1|Ci)P(x2|Ci)...P(xn|Ci)
    其中,xk为元组X在属性Ak的值。对于属性,考察两种情况:

  • 如果Ak是离散属性,则P(xk|Ci)D中属性Ak的值为xkCi类的元组数除以DCi类的元组数。

  • 如果Ak是连续值属性,通常假定连续值服从均值为μ、标准差为σ的高斯分布:

    g(x,μ,σ)=12πσe(xμ)22σ2
    因此
    P(xk|Ci)=g(x,μCi,σCi)
    其中μCi,σCi分别是Ci类训练元组属性Ak的均值和标准差。
    这里写图片描述

  • (5) 对给定数据元组X预测它的类标号Ci:

    argmaxCiP(X|Ci)P(Ci)   1jm


3.3 Python简单实现朴素贝叶斯分类器

# -*- coding: utf-8 -*-
__author__ = "Yunfan Yang"


def data_prep(filename):
    """数据预处理,属性列表以及数据元组列表"""
    with open(filename,'r') as f:
        raw_data = f.read()    # 读取数据
    # print(raw_data)
    data_list = raw_data.split('\n')[:-1]   # 将文本数据转换为列表

    Attributes = []   # 属性和类别名称列表
    X_list = []          # 数据元组列表
    for i in range(len(data_list)):
        X = []
        if i == 0:
            Attributes = data_list[i].split(',')   # 创建属性列表
        else:
            X = data_list[i].split(',')   # 元组列表
            X_list.append(X)
    return Attributes, X_list


def get_class_value(Attributes, X_list):
    """获取类别列表"""
    classes_values = []
    for X in X_list:
        if X[-1] not in classes_values:
            classes_values.append(X[-1])
    return classes_values


def calculate_prob(attribute_and_value, classes_values, Attributes, X_list):
    """计算概率(先验概率和后验概率)"""
    for key,value in attribute_and_value.items():
        index = Attributes.index(key)  # 获取属性在属性列表中的索引
        attribute_value = value
    prior_prob = {}
    posterior_prob = {}
    for label in classes_values:       # 遍历类别列表
        class_count = 0
        attribute_count = 0
        for X in X_list:               # 遍历数据集
            if X[-1] == label:
                class_count += 1
                if X[index] == attribute_value:
                    attribute_count += 1
        prior_prob[label] = class_count / len(X_list)       # 类别自身的先验概率
        posterior_prob[label] = attribute_count / class_count # 类别条件下,属性值的后验概率

    return prior_prob, posterior_prob


def Bayesian_Predict(input_X, classes_values, Attributes, X_list):
    """朴素贝叶斯分类预测"""
    pre_dict = {}
    for label in classes_values:  # 遍历类别值列表
        X_C_prob = 1
        for key,value in input_X.items():        # 遍历输入数据元组的键值对
            attribute_and_value = {}
            attribute_and_value[key]=value      # 生成属性和属性值字典
            prior_prob, posterior_prob = calculate_prob(attribute_and_value, classes_values, Attributes, X_list)   # 计算概率值
            X_C_prob *= posterior_prob[label]    # 累乘得到,类别条件下,数据元组的后验概率
        C_X_prob = X_C_prob * prior_prob[label]  # 给定数据元组条件下的类别概率
        pre_dict[label] = C_X_prob               # 键为类别值,值为后验假设概率

    # 按照从大到小排列
    predict = sorted(pre_dict.items(), reverse=True, key=lambda x:x[1])

    # 最可能的类别值
    result = predict[0][0]

    # 最可能类别值的概率
    sum = 0
    for value in predict:
        sum+=value[1]
    result_prob = predict[0][1] / sum  # 预测类别的概率

    print("\n该数据元组最可能的类别是:", result)
    print("判断为该类别的概率为:{}%".format(round(result_prob*100,1)))

if __name__=="__main__":

    filename = 'raw_data.csv'  # 读取文件,数据预处理

    Attributes, X_list = data_prep(filename)  # 对于每个X,第一个值时标号,最后一个是类别,中间都是属性值
    # print(Attributes)
    # print(X_list)
    classes_values = get_class_value(Attributes, X_list)

    # 输入的未知分类元组
    input_X = {'age':'youth', 'income':'high', 'student': 'yes', 'credit_rating':'fair'}
    # 进行分类预测
    Bayesian_Predict(input_X, classes_values, Attributes, X_list)

运行结果为:

该数据元组最可能的类别是: yes
判断为该类别的概率为:67.3%

3.4 零概率值处理

在计算的过程中,有可能会出现某个后验概率值P(xk|Ci)=0的情况。考虑这个零概率值,会使得P(X|Ci)为0,一个零概率值将消除概率累乘中涉及到Ci的所有属性值的后验概率影响。

可以使用拉普拉斯校准法避免这个问题:在计算P(xk|Ci)时,分子分母计数同时加1。
这里写图片描述


4. 基于规则分类

4.1 IF-THEN规则分类

IF-THEN规则表达式形如: IF条件THEN结论 例如,R1:IF age=youth AND student=yes THEN buys_computer=yes

规则R可以用覆盖率和准确率评估,在数据集D,设ncovers为规则R覆盖的元组数,ncorrect为R正确分类的元组数,则R的覆盖率准确率定义为:

coverage(R)=ncovers|D|accuracy(R)=ncorrectncovers


4.2 由决策树提取规则

提取方法

  • 对每条从根结点到树叶结点的路径创建一条规则。
  • 沿着给定路径上的每个分裂准则的逻辑(根结点=分枝)AND形成规则的前件(IF部分)。
  • 存放类预测的树叶结点形成规则的后件(THEN部分)。

与决策树相比, IF-THEN规则更容易理解,特别当决策树非常大时。


4.3 顺序覆盖算法的规则归纳

使用顺序覆盖算法可以直接从训练数据提取 IF-THEN规则(不需要产生决策树)。顺序覆盖算法是最广泛使用的挖掘分类规则析取集的方法。

(1) 顺序覆盖算法

算法的一般策略如下:

  • 一次学习一个规则。每学习一个规则,就删除该规则覆盖的元组,并在剩下的元组上重复该过程。
  • 在为C类学习规则时,希望规则覆盖C类所有(或很多)训练元组,并且没有(或很少)覆盖其他类的元组,以此来保证规则的高准确率。
  • 继续执行直到满足终止条件:①不在有训练元组;②返回规则质量低于设定阈值。
    这里写图片描述

(2) 规则质量度量

单纯地考虑规则准确率和覆盖率有的时候并不可靠。
假设学习类c的规则,当前规则为RIF  condition  THEN  class=c,考虑一个新的规则RIF  condition   THEN  class=c,比较前后两个规则谁比较好,则可以使用以下度量:

  • ① 熵:考虑 condition覆盖的数据元组集合DpiDCi类的概率。则熵越小,condition越好,规则就越好。
  • ② 信息增益:在机器学习中,用于学习规则的元组为正元组,其余元组为负元组,设pos(neg)pos(neg)为被RR覆盖的正(负)元组数。在一阶归纳学习器FOIL中,估计扩展condition的信息增益:
    FOILGain=pos×(log2pospos+neglog2pospos+neg)
    它偏向于具有高准确率且覆盖许多正元组的规则。
  • ③ 统计显著性检验:确定规则的效果是否并非出于偶然性,而是预示属性值与类之间的真实相关性。该检验将规则付该元组的观测类分布与规则随机预测产生的期望类分布进行比较,评估这两个分布之间的观测差是否是随机的,使用似然率统计量:
    LikelihoodRatio=2i=1mfilog(fiei)
    其中,m为类数,fi是满足规则的元组中类i的观测频率。ei是规则随机预测时类i的期望频率。该统计量服从自由度为m1χ2分布。似然率越高,规则正确预测数与“随机猜测”的差距越明显。似然率有助于识别具有显著覆盖率的规则。

(3) 规则剪枝

为防止过拟合,对规则R剪枝,如果在独立的元组集上评估,R剪枝后具有更好的质量。与决策树一样,这些元组集称为剪枝集。给定规则R,FOIL剪枝策略:

FOIL_Prune(R)=posnegpos+neg

这个值将随着R在剪枝集上的准确率增加而增加。因此,如果R剪枝后FOILPrune值较高,则对R剪枝。

查看评论

基于规则的分类

使用IF-THEN规则分类一个IF-THEN规则:IF 条件 THEN 结论 例子: R:IF age=youth AND student=yes THEN buys_computer=yes ...
  • ritchiewang
  • ritchiewang
  • 2015-06-05 15:50:55
  • 716

贝叶斯法分类和最大似然

Bayes贝叶斯 一、Bayes小故事        贝叶斯(约1701-1761) Thomas Bayes,英国数学家。约1701年出生于伦敦,做过神甫。1742年成为英国皇家学会会员。1761年...
  • qq_20823641
  • qq_20823641
  • 2016-05-10 10:55:25
  • 5784

第八章 基于规则的分类

1、使用IF-THEN规则分类 规则是表示信息或少量知识的好方法。基于规则的分类器使用一组IF—THEN规则进行分类。一个IF—THEN规则是一个如下的表达式: IF条件THEN结论 规则R1是一个例...
  • DQ_DM
  • DQ_DM
  • 2014-08-02 09:59:31
  • 2799

数据挖掘——各种分类算法的优缺点

决策树 一种启发式算法,核心是在决策树各个节点上应用信息增益等准则来选取特征,进而递归地构造决策树。 优点: 1. 计算复杂度不高,易于理解和解释,可以理解决策树所表达的意义; 2. 数据预处理阶段比...
  • shuke1991
  • shuke1991
  • 2016-07-28 16:59:33
  • 8766

数据挖掘算法之分类分析(一)贝叶斯分类器

贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类 对于分类问题,其实谁都不会陌生,每个人生活中无时不刻的在进行着分类。例如,走在大马路上看到女孩子,你会下意识的将她分为...
  • qq1010885678
  • qq1010885678
  • 2015-04-17 09:29:34
  • 2387

数据挖掘:概念与技术(第三版)之第八章的学习记录

本章讲解分类的一些基本概念什么是分类 首先我们要知道的是,分类是一种重要的数据分析形式,它提取和刻画重要数据类的模型。这个模型被称之为分类器(classifer)。通过分类器,我们可以预测分类的类标...
  • u014593570
  • u014593570
  • 2017-07-17 14:48:59
  • 1137

数据挖掘算法之深入朴素贝叶斯分类

写在前面的话:   我现在大四,毕业设计是做一个基于大数据的用户画像研究分析。所以开始学习数据挖掘的相关技术。这是我学习的一个新技术领域,学习难度比我以往学过的所有技术都难。虽然现在在一家公司实习,但...
  • tanggao1314
  • tanggao1314
  • 2017-03-26 22:04:44
  • 5814

数据挖掘:基于朴素贝叶斯分类算法的文本分类实践

如果你想对一个陌生的文本进行分类处理,例如新闻、游戏或是编程相关。那么贝叶斯分类算法应该正是你所要找的了。贝叶斯分类算法是统计学中的一种分类方法,它利用概率论中的贝叶斯公式进行扩展。下面我们就针对朴素...
  • u013761665
  • u013761665
  • 2015-09-17 22:59:12
  • 2316

Flynn分类法

Flynn分类法,是基于指令流和数据流的数量对计算机进行分类的方法。 一系列修改那些流经数据处理单元的数据(数据流)的命令,可以被认为是一个指令流。 以下是四种不同的情况: 单指令流单数据流...
  • skywalker_leo
  • skywalker_leo
  • 2012-12-28 09:47:19
  • 3239

电影评论分类——朴素贝叶斯

Before We Classify 给定一个电影的评论(文本信息),我们想要知道这个评论的语气是积极(+1)的还是消极的(-1)。本文利用 naive bayes分类模型来解决这个问题。朴素贝叶斯的...
  • zm714981790
  • zm714981790
  • 2016-05-02 10:49:09
  • 782
    个人资料
    持之以恒
    等级:
    访问量: 592
    积分: 168
    排名: 104万+
    文章存档
    最新评论