朴素贝叶斯与决策树应用

'''

Created on 2020年1月7日

@author: myz

'''

import tkinter

import tkinter.font as tkFont

import threading

import pandas as pd

from sklearn.naive_bayes import MultinomialNB

from sklearn.model_selection import train_test_split

from sklearn.feature_extraction.text import TfidfVectorizer

from sklearn.tree import DecisionTreeClassifier

from sklearn.metrics import classification_report

root=tkinter.Tk()

root.title('两种算法对比')

root.geometry('900x900')

input_var=tkinter.StringVar()

bayes_text=tkinter.Text(root,width=61,height=25)

decision_text=tkinter.Text(root,width=61,height=25)

predict_text=tkinter.Text(root,width=100,height=20)

ft1 = tkFont.Font(size=20, slant=tkFont.ITALIC)  #设置字体

dff=pd.DataFrame()

score1=0.0

score2=0.0

score3=0.0

score4=0.0

y_pred_bayes=[]

y_pred_decisiontree=[]

'''

贝叶斯多项式模型线程

'''

class bayes(threading.Thread):

    def __init__(self,dff):

        super(bayes,self).__init__()

        self.dff=dff

        self.clf=MultinomialNB(fit_prior=True,alpha=6.0)

        self.tfidf=TfidfVectorizer(max_features=4000,lowercase=False,ngram_range=(2,4))

        self.train_data=[]

        self.test_data=[]

        self.train_class=[]

        self.test_class=[]

    def run(self):

        list_action=[i for i in self.dff['behavior_type']]

        '''

        获取时间与商品id连在一起作为预测数据list_target

        '''

        list_time=[i for i in self.dff['time']]

        list_item=[i for i in self.dff['item_id']]

        list_target=[]

        lenn=len(list_action)

        for i in range(lenn):

            target=''

            target=str(list_item[i])

            target=target+str(list_time[i])

            list_target.append(str(target))

        '''

        数据拆分为训练及和测试集

        '''

        self.train_data,self.test_data,self.train_class,self.test_class=train_test_split(list_target,list_action,shuffle=True,test_size=0.25)

        '''

        特征提取

        '''

        self.tfidf.fit(self.train_data)

        tf_train_data=self.tfidf.fit_transform(self.train_data)

        tf_test_data=self.tfidf.fit_transform(self.test_data)

        '''

        朴素贝叶斯分类器预测

        '''

        self.clf.fit(tf_train_data,self.train_class)

        # tf_test_data = tfidf.transform(test_data)

        y_pred = self.clf.predict(tf_test_data)

        global score3

        global score4

        score3=self.clf.score(tf_train_data,self.train_class)

        score4=self.clf.score(tf_test_data,self.test_class)

        bayes_text.insert(tkinter.INSERT, '贝叶斯训练集分数{}\n'.format(score3))

        bayes_text.insert(tkinter.INSERT, '贝叶斯测试集分数{}\n'.format(score4))

        print('bayes训练集分数为:{}'.format(self.clf.score(tf_train_data,self.train_class)))

        print('bayes测试集分数为:{}'.format(self.clf.score(tf_test_data,self.test_class)))

        print('分类报告{}'.format(classification_report(y_pred,self.test_class)))

        bayes_text.insert(tkinter.INSERT, '贝叶斯分类报告{}\n'.format(classification_report(y_pred,self.test_class)))#显示精确度、召回率、所有标签结果的平均值、所有标签结果的加权平均值

    def predict(self):

        listt=[]

        listt.append(input_var.get())

        self.tfidf.fit_transform(listt)

        self.tfidf.fit_transform(self.train_data)

        data1=self.tfidf.transform(listt)

        global y_pred_bayes

        y_pred_bayes=self.clf.predict(data1)

        print('预测为:{}'.format(y_pred_bayes))

#        print(test_data[:50])

#        print(y_pred[:50])

'''

决策树模型线程

'''

class DecisionTree(threading.Thread):

    def __init__(self,dff):

        super(DecisionTree,self).__init__()

        self.dff=dff

        self.model=DecisionTreeClassifier(max_depth=30)#控制决策树的深度最大为4

        self.tfidf=TfidfVectorizer(max_features=4000,lowercase=False,ngram_range=(2,4))

        self.train_data2=[]

        self.test_data2=[]

        self.train_class2=[]

        self.test_class2=[]

    def run(self):

#        for i in self.dff['behavior_type']:

#            if i==4:

#                list.append(1)

#            else:

#                list.append(0)

#        model=SVC(C=0.8, kernel='rbf', gamma=20, decision_function_shape='ovr')

        list_action=[i for i in self.dff['behavior_type']]

        '''

        获取时间与商品id连在一起作为预测数据list_target

        '''

        list_time=[i for i in self.dff['time']]

        list_item=[i for i in self.dff['item_id']]

        list_target=[]

        lenn=len(list_action)

        for i in range(lenn):

            target=''

            target=str(list_item[i])

            target=target+str(list_time[i])

            list_target.append(str(target))

        '''

        数据拆分为训练及和测试集

        '''

        self.train_data2,self.test_data2,self.train_class2,self.test_class2=train_test_split(list_target,list_action,shuffle=True,test_size=0.25)

        '''

        特征提取

        '''

        self.tfidf.fit(self.train_data2)

        tf_train_data2=self.tfidf.fit_transform(self.train_data2)

        tf_test_data2=self.tfidf.fit_transform(self.test_data2)

        self.model.fit(tf_train_data2,self.train_class2)

        y_pred=self.model.predict(tf_test_data2)

        global score1

        global score2

        score1=self.model.score(tf_train_data2,self.train_class2)

        score2=self.model.score(tf_test_data2,self.test_class2)

        decision_text.insert(tkinter.INSERT, '决策树训练集分数{}\n'.format(score1))

        decision_text.insert(tkinter.INSERT, '决策树测试集分数{}\n'.format(score2))

        print('决策树模型训练集分数为:{}'.format(self.model.score(tf_train_data2,self.train_class2)))

        print('决策树模型测试集分数为:{}'.format(self.model.score(tf_test_data2,self.test_class2)))

        print('分类报告{}'.format(classification_report(y_pred,self.test_class2)))

        decision_text.insert(tkinter.INSERT, '决策树分类报告\n{}'.format(classification_report(y_pred,self.test_class2)))

#        print(test_data2[:50])

#        print(y_pred[:50])

    def predict(self):

        listt=[]

        listt.append(input_var.get())

        self.tfidf.fit_transform(listt)

        self.tfidf.fit_transform(self.train_data2)

        data1=self.tfidf.transform(listt)

        global y_pred_decisiontree

        y_pred_decisiontree=self.model.predict(data1)

        print('预测为:{}'.format(y_pred_decisiontree))

def interface():

    title_label=tkinter.Label(root,text='预测用户行为',font=ft1)

    title_label.grid(row=0,columnspan=8,pady=8)

    bayes_button=tkinter.Button(root,text='bayes模型',command=bayes_start) # command 点击事件命令

    bayes_button.grid(row=1,column=0,columnspan=4,pady=2)

    decision_button=tkinter.Button(root,text='decision_tree模型',command=decision_tree) # command 点击事件命令

    decision_button.grid(row=1,column=4,columnspan=4,pady=2)

    bayes_text.grid(row=2,column=0,columnspan=4,padx=8)   

    decision_text.grid(row=2,column=4,columnspan=4,padx=8)

    smalltitle_label=tkinter.Label(root,text='预测用户行为',font=ft1)

    smalltitle_label.grid(row=3,columnspan=8,pady=8)

    input_entry=tkinter.Entry(root,textvariable=input_var,width=100)

    input_entry.grid(row=4,column=0,pady=10,columnspan=7,ipady=7)

    bayes_predict_button=tkinter.Button(root,text='bayes预测',command=bayes_predict) # command 点击事件命令

    bayes_predict_button.grid(row=4,column=7,pady=10)

    predict_text.grid(row=5,column=0,rowspan=10,columnspan=7,padx=8)

    decision_predict_button=tkinter.Button(root,text='decision_tree预测',command=decision_predict) # command 点击事件命令

    decision_predict_button.grid(row=5,column=7)

    root.mainloop()

def bayes_start():

    print('启动贝叶斯模型评估')

    bayes_text.insert(tkinter.INSERT, '启动贝叶斯模型评估\n')

    m1.start()

#    time.sleep(300)

#    bayes_text.insert(tkinter.INSERT, '贝叶斯训练集分数{}\n'.format(score3))

#    bayes_text.insert(tkinter.INSERT, '贝叶斯测试集分数{}\n'.format(score4))

def decision_tree():

    print('启动决策树模型评估')

    decision_text.insert(tkinter.INSERT, '启动决策树模型评估\n')

    m2.start()

#    time.sleep(60)

#    decision_text.insert(tkinter.INSERT, '决策树训练集分数{}\n'.format(score1))

#    decision_text.insert(tkinter.INSERT, '决策树测试集分数{}\n'.format(score2))

def bayes_predict():

    print('开始bayes预测')

    m1.predict()

    predict_text.insert(tkinter.INSERT, '开始贝叶斯预测\n')

    predict_text.insert(tkinter.INSERT, '消费者针对此商品,在此时的行为预测为:{}\n'.format(y_pred_bayes))

#    predict_text.insert(tkinter.INSERT, y_pred_bayes)

def decision_predict():

    print('开始决策树预测')

    m2.predict()

    predict_text.insert(tkinter.INSERT, '开始决策树预测\n')

#    predict_text.insert(tkinter.INSERT, input_var.get())

    predict_text.insert(tkinter.INSERT, '消费者针对此商品,在此时的行为预测为:{}\n'.format(y_pred_decisiontree))

if __name__=='__main__':

        dff=pd.read_csv('clean_user33.csv')

        m1=bayes(dff)

        m2=DecisionTree(dff)

        interface()

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容