有监督的分类算法
MultinomialNB算法,则:
A是类别,B是特征
p(类别i/特征)=p(类别i) * p(特征/类别i) / Σ( p(特征/类别i) * p(类别i) )
p(特征/类别i)= ( p(特征1/类别i) * p(特征2/类别i) * … * p(特征n/类别i) ),注意:特征间相互独立,累积
# 切分训练集和数据集
def randsplit(dataset,test_size=0.2):
'''
函数功能:随机切分训练集和测试集
参数说明:
dataset:输入的数据集
test_size:训练集占比
返回:切分好的训练集和测试集
'''
N,M=dataset.shape
ix=list(range(N))
random.shuffle(ix)
s=int(N * test_size)
testset=dataset.iloc[ix[0:s],:]
trainset=dataset.iloc[ix[s:],:]
testset.index=range(s)
trainset.index=range(N-s)
return trainset,testset
# 构建高斯朴素贝叶斯分类器
def GaussianNB_Classify(trainset,testset):
'''
函数功能:构建高斯朴素贝叶斯分类器
参数说明:
trainset:输入训练集,最后一列是标签(假设M个特征,标签类别有C个)
testset:输入测试集,最后一列是标签(假设M个特征)
返回:测试集的标签预测
'''
#第一部分:计算每个标签类别的均值、方差
mean=[] #存放标签每个类别对应每个特征的均值
var=[] #存放标签每个类别对应每个特征的方差
y_pre_set=[] #存放测试集的预测标签
x_train=trainset.iloc[:,:-1]
y_train=trainset.iloc[:,-1]
labels=y_train.value_counts().index
for label in labels:
sub_x_train=x_train[y_train==label]
m=sub_x_train.mean() #它的shape=(1,M)
mean.append(m)
v=((sub_x_train-m)**2).sum()/sub_x_train.shape[0] #它的shape=(1,M)
var.append(v)
mean_df=pd.DataFrame(mean,index=labels) #转化为df格式,它的shape=(C,M)
var_df=pd.DataFrame(var,index=labels) #转化为df格式,它的shape=(C,M)
#第二部:计算未知样本取值不同标签类别的概率,然后预测其标签
for i in range(testset.shape[0]):
i_sample=testset.iloc[i,:-1].tolist() #取测试集第i个样本的特征值
i_sample=np.array(i_sample) #它的shape=(1,M)
i_m_prob=np.exp(-1*((i_sample-mean_df)**2)/(2*var_df)) / np.sqrt(2*np.pi*var_df) #广播,它的shape=(C,M)
i_prob=1
for m in range(trainset.shape[1]-1):
i_prob *=i_m_prob.iloc[:,m] #它的shape=(C,1)
y_pre=i_prob.index[np.argmax(i_prob.values)]
y_pre_set.append(y_pre)
testset['predict']=y_pre_set
#第三部:计算模型准确率
score=(testset['predict']==testset.iloc[:,-1]).mean()
return testset,score
from sklearn.naive_bayes import GaussianNB
from sklearn.naive_bayes import MultinomialNB
from sklearn.naive_bayes import BernoulliNB
(待补充)
参考:http://edu.cda.cn/course/966