基于kaggle数据集--语音性别识别分类

前言

大家好!临近期末,本人需要交一份模式识别课程大作业,作业内容是:用传统的方法对kaggle语音数据集进行性别分类。那么何谓传统的方法,在查阅相关资料后,决定采用朴素贝叶斯分类器对其分类。这是小编第一次写博客,有什么不足之处还请共同探讨。

数据集介绍

Kaggle 是一个提供机器学习竞赛、托管数据库、编写和分享代码的平台,上面有一些用户分享的开放数据集,本文选取Kory Becker提供的男女声音特征分类数据集。这个数据集是基于对男女语音段进行合理的声音预处理而得到的语音特征(并不包含原始语音段)。集合中共有3168条数据,男女各1584条,每条数据可视作一个长度为21的一维数组。其中前20个数值是这条语音的20个特征值,这些特征值包括了语音信号的长度、基频、标准差、频带中值点/一分位频率/三分位频率等;最后一个数值是性别标记。原数据集中直接以字符串male和female进行标注,本文用0表示男性、1表示女性以方便后续处理。

朴素贝叶斯分类原理

朴素贝叶斯分类是一种十分简单的分类算法,叫它朴素贝叶斯分类是因为这种方法的思想真的很朴素,朴素贝叶斯的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别。
朴素贝叶斯分类的正式定义如下:
1、设x=(a1,a2,…,am)为一个待分类项,而每个a为x的一个特征属性。
2、有类别集合C=(y1,y2,…,yn)。
3、计算P(y1/x),P(y2/x),…,P(yn/x)。
4、如果P(yk/x)=max{P(y1/x),P(y2/x),…,P(yn/x)},则x属于yk
那么现在的关键就是如何计算第3步中的各个条件概率。我们可以这么做:
1、找到一个已知分类的待分类项集合,这个集合叫做训练样本集。
2、统计得到在各类别下各个特征属性的条件概率估计。即
在这里插入图片描述
3、如果各个特征属性是条件独立的,则根据贝叶斯定理有如下推导:
在这里插入图片描述
因为分母对于所有类别为常数,因为我们只要将分子最大化皆可。又因为各特征属性是条件独立的,所以有:
在这里插入图片描述

朴素贝叶斯分类流程

整个朴素贝叶斯分类分为三个阶段:
第一阶段——准备工作阶段,这个阶段的任务是为朴素贝叶斯分类做必要的准备,主要工作是根据具体情况确定特征属性,并对每个特征属性进行适当划分,然后由人工对一部分待分类项进行分类,形成训练样本集合。这一阶段的输入是所有待分类数据,输出是特征属性和训练样本。这一阶段是整个朴素贝叶斯分类中唯一需要人工完成的阶段,其质量对整个过程将有重要影响,分类器的质量很大程度上由特征属性、特征属性划分及训练样本质量决定。
第二阶段——分类器训练阶段,这个阶段的任务就是生成分类器,主要工作是计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率估计,并将结果记录。其输入是特征属性和训练样本,输出是分类器。这一阶段是机械性阶段,根据前面讨论的公式可以由程序自动计算完成。
第三阶段——应用阶段。这个阶段的任务是使用分类器对待分类项进行分类,其输入是分类器和待分类项,输出是待分类项与类别的映射关系。这一阶段也是机械性阶段,由程序完成。

本实验所采用模型

我们假设20个特征值分类为F1,F2 ,F3 …,F20,F1i1表示 特征F1 取 第i1 个 分类,则一个测试样本向量可以表示如下:
test_vector = [F1i1 , F2i2 , F3i3 … F19i19 , F20i20]
则其是男性的概率为:
P(男 | F1i1 ✕ F2i2 ✕ F3i3 … F19i19 ✕ F20i20)= P(F1i1 ✕ F2i2 ✕ F3i3 … F19i19 ✕ F20i20 | 男) * P(男) / P(F1i1 ✕ F2i2 ✕ F3i3 … F19i19 ✕ F20i20)

需要注意的是:

  1. 从实际应用角度来看,朴素贝叶斯分类法其实并不太适合于特征数量过多的分类问题,不管是二分类还是多分类。这是由于该方法本质上是概率的叠乘,每有一个特征就需要进行一次概率相乘,而这里有20个特征就需要乘上20次。而概率都是小于1的,所以在计算上颇为麻烦——会得到小于10的负20次方的小数。对这个问题可以采用每次都乘以某个略大于1的常数如sqrt(2)来补偿,或者取对数。
  2. 另外一个就是计算量,这一点可以通过不考虑全概率以及人为操作使得先验概率相同这两样手法来减少一些运算。
    第三点比较细节,在于若某个新数据在某个特征处取到了训练集所未曾取到的数据,就会得出此处的后验概率为0的结果,从而通过概率连乘导致最终的概率为0,而这显然是不正确的。解决措施也很简单,只要在每次计算时分子分母同时加1即可,而因此所造成的误差可以认为是忽略不计的。

实验过程

流程框图及程序文件

流程框图:
在这里插入图片描述
程序文件:
在这里插入图片描述

数据集处理

  1. 本实验在MATLAB操作平台上实现,而获取的数据集是CSV文件(voice.xls),需要通过转换将此数据集变为mat文件,即读入MATLAB成为一个3168*21的矩阵,使用xls2mat.m程序可以完成此功能,得到voive_data.mat文件,得到的数据是量化后的(因为此程序会调用量化程序mydiscretization.m),量化的概念和作用见下文。仔细观察数据会发现其中有不少数值为0项,这是原始数据的缺项,我直接采用均值加以弥补,在不确定的时候优先考虑均值总不失为一种稳妥的处理方法。注意,对缺项数据的补写应当最优先处理。
  2. 一般而言,在不考虑测试集时训练集、验证集常采用7:3或8:2的数量划分,考虑到测试集时一般划分为6:2:2。原始数据集的划分还是很有讲究的,周志华教授在他著名的科普大作《机器学习》中对此有很详细的讨论。本数据集公有3168条数据,为了让男性声音样本和女性声音样本随机地分布到训练和测试数据集,这里使用随机算法随机选取2000条作为训练数据集,其余的1168条作为测试数据集。

量化

贝叶斯分类器比较难以处理非整数特征的数据,所以需要对数据进行量化。贝叶斯分类器是基于条件概率而进行分类的,所以最重要的一点是数据处理不能改变其分布律,因此一定要进行线性量化。而在这里事实上对结果有影响的是每个特征的相对数值而非绝对大小,故仅量化相对量即可。也就是说,以某一特征在所有实验数据(如上文所说,共计3168条)中的最大、最小值分别作为量化之后的最大、最小值,而不用去管小于最小值的所谓“基础量”。 量化阶也是一个需要考虑的参数。量化阶越大,量化越粗糙,计算量越小;量化阶越小,量化越细致,计算量越大,本文中量化阶取 20,故每个特征的最大值量化后为20,最小值量化后为1。具体过程如下:
原始数据voice.xls:
在这里插入图片描述
量化后的数据voive_data.mat:
在这里插入图片描述
以上两个图,共20个特征,第十个特征原始数据中最大值为0.8045(图1所示),则量化后的最大值为20(图2所示),以此类推。每个特征在1~20量化阶取值。

训练

通过文件training.m得到TrainingSets.mat,生成表格:
在这里插入图片描述
Feature:训练集(男女各1100)中20个特征值
Feature_prob:每一个特征值所对应每一个量化阶的概率。列表示20个特征,行表示20个量化阶。
Feature_prob具体数值(比如:第一个特征对应的第一阶概率为0.0027,对应的第三阶概率为0.0018,以此类推):
在这里插入图片描述

测试

通过文件validation.m得到ValidationSets.mat,生成表格:
在这里插入图片描述
Results为对应结果,第一列为男性的概率,第二列为女性的概率,比较之后得到最终结果如第三列所示(0:男性 1:女性),具体如下:
在这里插入图片描述
同时可得出总的成功率:
在这里插入图片描述
即:
男性判断正确的概率:0.9711
女性判断正确的概率:0.8554
总的正确率 :0.9132

核心代码

数据训练步骤的核心代码如下:

for j=1:20
    for i=1:stepnum
        TrainingSets(1).feature_prob(i,j) = ...
            (myhowmany(i,TrainingSets(1).feature(:,j))+1)/(M_train_num+1);
        TrainingSets(2).feature_prob(i,j) = ...
            (myhowmany(i,TrainingSets(2).feature(:,j))+1)/(F_train_num+1);
    end
end

得到了每一个特征在量化范围内的每一个可能取值的概率。
数据验证步骤的核心代码如下:

for i=1:2
    for j=1:ValidationSets(i).number              % for each voice
        data = ValidationSets(i).feature(j,:);
        for k=1:20
            % probability of being male voice
            ValidationSets(i).results(j,1)=...
                TrainingSets(1).feature_prob(data(k),k)*ValidationSets(i).results(j,1);
            % probability of being female voice
            ValidationSets(i).results(j,2)=...
                TrainingSets(2).feature_prob(data(k),k)*ValidationSets(i).results(j,2);
        end
        if ValidationSets(i).results(j,1) > ValidationSets(i).results(j,2)
            % this is male voice
            ValidationSets(i).results(j,3) = 0;
        else
            % this is female voice
            ValidationSets(i).results(j,3) = 1;
        end
    end
end

得到了每一条待验证的数据分别为男声和女声的概率,通过比较大小即可得出最终判断。

注意点

  1. 从实际应用角度来看,朴素贝叶斯分类法其实并不太适合于特征数量过多的分类问题,不管是二分类还是多分类。这是由于该方法本质上是概率的叠乘,每有一个特征就需要进行一次概率相乘,而这里有20个特征就需要乘上20次。而概率都是小于1的,所以在计算上颇为麻烦——会得到小于10的负20次方的小数。对这个问题可以采用每次都乘以某个略大于1的常数如sqrt(2)来补偿,或者取对数。
  2. 计算量。这一点可以通过不考虑全概率以及人为操作使得先验概率相同这两样手法来减少一些运算。
  3. 若某个新数据在某个特征处取到了训练集所未曾取到的数据,就会得出此处的后验概率为0的结果,从而通过概率连乘导致最终的概率为0,而这显然是不正确的。解决措施也很简单,只要在每次计算时分子分母同时加1即可,而因此所造成的误差可以认为是忽略不计的。.

后记

本文是根据原博主和自己写的大作业改编而来,功能和内容没有原博主的丰富,感兴趣的朋友也可参照原博主和我的解释,更容易消化。原博主的两个程序myisinterger.m和myrowcheck.m我没有用到,所以没有提及。
我已将代码已上传至网络,链接:https://pan.baidu.com/s/1I8bHfqsj2yqHDKcFIQ_byw
提取码:5vih。
原文链接:https://blog.youkuaiyun.com/ctyqy2015301200079/article/details/83346310

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值