beyes_svm_lda文本分类

博客介绍了贝叶斯和SVM算法。贝叶斯基于先验和条件概率得后验概率,先验概率选择不当或特征相关会影响分类。使用不同先验概率的贝叶斯对数据训练预测,效果有差异。SVM用于二分类,通过核可转为非线性分类器,还可控制λ调整模型偏差和方差。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考: https://blog.youkuaiyun.com/u013710265/article/details/72780520

- 贝叶斯

简要来说,贝叶斯是在先验概率和条件概率的基础上,得到后验概率。而先验概率可能是选择了多项式,伯努利或者高斯等,由于先验概率的选择,可能会导致选择不恰当而模型分类不准确,另外贝叶斯的条件概率建立在特征之间的相互独立上,如果特征之间高度相关,则使用贝叶斯不是一个好的选择。

生成数据,使用高斯贝叶斯进行训练并预测

import numpy as np
x1=140+np.random.random_sample([1,50])*20
x2=160+np.random.random_sample([1,250])*10
x3=170+np.random.random_sample([1,200])*20

xx1=140+np.random.random_sample([1,150])*20
xx2=160+np.random.random_sample([1,750])*10
xx3=170+np.random.random_sample([1,600])*20

X=x1.tolist()[0]+x2.tolist()[0]+x3.tolist()[0]+xx1.tolist()[0]+xx2.tolist()[0]+xx3.tolist()[0]
XX=[[one]for one in X]
X=np.array(XX)

print(X.shape)
y1=np.array([1,0,0])
y1_fuzhu=np.zeros((50,1))
yy1=y1+y1_fuzhu
y2=np.array([0,1,0])
y2_fuzhu=np.zeros((250,1))
yy2=y2+y2_fuzhu
y3=np.array([0,0,1])
y3_fuzhu=np.zeros((200,1))
yy3=y3+y3_fuzhu

#y=yy1.tolist()+yy2.tolist()+yy3.tolist()
y=[0]*50+[1]*250+[2]*200+[0]*150+[1]*750+[2]*600
y=np.array(y)

直接使用参考链接中的代码,即可得到96左右的准确率,但是当将数据喂入伯努利和多项式的先验概率的贝叶斯时,效果非常差。

多项式分布:

import string
import random
def generate_doc(album="a ",label="0"):

    all_abc = string.ascii_lowercase
    abc_index = np.random.randint(25, size=10)

    sentence_a = album * 90 + " ".join([all_abc[one] for one in abc_index])
    x = sentence_a.split()
    random.shuffle(x)
    x.append(label)
    return " ".join(x)
sentence=generate_doc()
all_sentence=[]
for i in range(0,5000):
    all_sentence.append(generate_doc("a ","0"))
for i in range(0, 5000):
        all_sentence.append(generate_doc("b ", "1"))
for i in range(0,5000):
    all_sentence.append(generate_doc("c ","2"))
for i in range(0,5000):
    all_sentence.append(generate_doc("d ","3"))
#print(all_sentence)
random.shuffle(all_sentence)
#print(all_sentence)
X=[]
y=[]
import string
abc=[one for one in string.ascii_lowercase]
dict_abc=zip(abc,range(0,len(abc)))
dict_abc=dict(dict_abc)

for one in all_sentence:
    X.append([dict_abc[small_one] for small_one in one[0:-1].split()])
    y.append(int(one[-1]))

X=np.array(X)
y=np.array(y)

构建数据集,虽然绝大多数的字符都相同,但是最后分类结果特别差,不知道是什么原因。但是针对于sklearn.datasets中自带的fetch_20newsgroups中的数据(https://blog.youkuaiyun.com/cymy001/article/details/79052366),可以达到83%的准确率。(切记传入的训练数据必须为数值型)

伯努利分布

使用在二分类中,使用第二块代码构造数据,只不过只生成两个类别,修改加入的噪声,发现该分布的假设可以得到很高的准确率。尝试在二分类的文本中进行使用。

-------------------------------------

svm

svm为二分类,主要思想史间隔距离最大化,只需要少数重要的特征点作为支撑就可以进行预测,其输出结果是1或者-1。由于核的存在,可以将svm从线性分类器转为非线性分类器。对于特征较少而样本较多的情况,可以采用高斯核的方法(参数RBF),将数据映射到高维空间,从而让数据线性可分,对于特征多,跟样本量差不多大的情况,可以选择LR或者线性核的svm。

参考: https://blog.youkuaiyun.com/qy724728631/article/details/82622535

https://blog.youkuaiyun.com/ybdesire/article/details/53915093

另外通过控制λ的大小,来改变模型偏差和方差上的表现。如果lambda偏大,即正则项的系数偏大,会造成一个低方差,高的偏差,如果系数偏小,会导致正则不怎么起作用,造成过拟合现象,产生高方差。参考(https://www.cnblogs.com/ooon/p/5711516.html)

待续未完...

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值