参考: 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)
待续未完...