Python中的朴素贝叶斯分类器实现

时间:2017-07-04 14:04:39

标签: python machine-learning classification implementation naivebayes

我在Python中实现了朴素贝叶斯分类器。我使用1000,2000甚至5000元组运行我的代码,但它始终提供100%的准确性。现在我怀疑实施情况。这是正常的还是我在代码中做错了什么。它是一个2级分类器。

class_names=my_data[target].unique()
prob_class=[]


for clas in class_names:
    prob_class.append(float(len(my_data[my_data[target]==clas]))/float(len(my_data)))


def bayes_classify(x,my_train_data):
    max_prob=-1
    best_class=class_names[0]
    ind=0
    col_names=my_train_data.column_names()
    for clas in class_names:
        prob=prob_class[ind]
        pure_data=my_train_data[my_train_data[target]==clas]
        for col in col_names:
            if(my_train_data[col].dtype()==str):
                prob=prob*(float(len(pure_data[pure_data[col]==x[col]]))/float(len(pure_data)))
            else:    
                mean=pure_data[col].mean()
                stdev=pure_data[col].std()
                stdev=stdev+0.1
                exponent = math.exp(-(math.pow(x[col]-mean,2)/(2*math.pow(stdev,2))))
                prob=prob*(1 / (math.sqrt(2*math.pi)) * stdev) * exponent

        if(prob>max_prob):
            max_prob=prob
            best_class=clas
        ind=ind+1
    return best_class


def evaluate_bayes_classifier(my_test_data,my_train_data):
    prediction = my_test_data.apply(lambda x: bayes_classify(x,my_train_data))
    my_test_data['pred']=prediction
    target_values=my_test_data[target]
    mistakes=my_test_data.apply(lambda x: 1 if(x[target]!=x['pred']) else 0)
    cla_err=mistakes.sum()/float (len(mistakes))
    my_test_data.remove_column('pred')
    return target_values,prediction,cla_err



my_train_data, my_test_data = my_data.random_split(.8, seed=1)
targets,predictions,error=evaluate_bayes_classifier(my_test_data,my_train_data)
accuracy=(1-error)*100

Train_data

Test_data

0 个答案:

没有答案