朴素贝叶斯分类实例:检测SNS社区中不真实账号

下面讨论一个使用朴素贝叶斯分类解决实际问题的例子,为了简单起见,对例子中的数据做了适当的简化。

这个问题是这样的,对于SNS社区来说,不真实账号(使用虚假身份或用户的小号)是一个普遍存在的问题,作为SNS社区的运营商,希望可以检测出这些不真实账号,从而在一些运营分析报告中避免这些账号的干扰,亦可以加强对SNS社区的了解与监管。

如果通过纯人工检测,需要耗费大量的人力,效率也十分低下,如能引入自动检测机制,必将大大提升工作效率。这个问题说白了,就是要将社区中所有账号在真实账号和不真实账号两个类别上进行分类,下面我们一步一步实现这个过程。

首先设C=0表示真实账号,C=1表示不真实账号。

1、确定特征属性及划分

这一步要找出可以帮助我们区分真实账号与不真实账号的特征属性,在实际应用中,特征属性的数量是很多的,划分也会比较细致,但这里为了简单起见,我们用少量的特征属性以及较粗的划分,并对数据做了修改。

我们选择三个特征属性:a1:日志数量/注册天数,a2:好友数量/注册天数,a3:是否使用真实头像。在SNS社区中这三项都是可以直接从数据库里得到或计算出来的。

下面给出划分:a1:{a<=0.05, 0.05<a<0.2, a>=0.2},a1:{a<=0.1, 0.1<a<0.8, a>=0.8},a3:{a=0(不是),a=1(是)}。

2、获取训练样本

这里使用运维人员曾经人工检测过的1万个账号作为训练样本。

3、计算训练样本中每个类别的频率

用训练样本中真实账号和不真实账号数量分别除以一万,得到:

P(C=0)=8900/100000=0.89

P(C=1)=110/100000=0.11

4、计算每个类别条件下各个特征属性划分的频率

$$P(a_1<=0.05|C=0)=0.3$$

$$P(0.05<a_1<0.2|C=0)=0.5$$

$$P(a_1>0.2|C=0)=0.2$$

$$P(a_1<0.05|C=1)=0.8$$

$$P(0.05<a_1<0.2|C=1)=0.1$$

$$P(a_1>0.2|C=1)=0.1$$

$$P(a_2<=0.1|C=0)=0.1$$

$$P(0.1<a_2<0.8|C=0)=0.7$$

$$P(0.1<a_2>0.8|C=0)=0.2$$

$$P(a_2<=0.1|C=1)=0.7$$

$$P(0.1<a_2<=0.8|C=1)=0.2$$

$$P(a_2>0.2|C=1)=0.1$$

$$P(a_3=0|C=0)=0.2$$

$$P(a_3=1|C=0)=0.8$$

$$P(a_3=0|C=1)=0.9$$

$$P(a_3=1|C=1)=0.1$$

5、使用分类器进行鉴别

下面我们使用上面训练得到的分类器鉴别一个账号,这个账号使用非真实头像,日志数量与注册天数的比率为0.1,好友数与注册天数的比率为0.2。

$$P(C=0)P(x|C=0)=P(C=0)P(0.05<a_1<0.2|C=0)P(0.1<a_2<0.8|C=0)P(a_3=0|C=0)=0.890.50.7*0.2=0.0623$$

$$P(C=1)P(x|C=1)=P(C=1)P(0.05<a_1<0.2|C=1)P(0.1<a_2<0.8|C=1)P(a_3=0|C=1)=0.110.10.2*0.9=0.00198$$

可以看到,虽然这个用户没有使用真实头像,但是通过分类器的鉴别,更倾向于将此账号归入真实账号类别。这个例子也展示了当特征属性充分多时,朴素贝叶斯分类对个别属性的抗干扰性。


书籍推荐