wordpress批量刪除文章上海aso優(yōu)化公司
機器學習給我們提供了一些強大的工具,能從未知數(shù)據(jù)中抽取出有用的信息。因此,能否這些信息以易于人們理解的方式呈現(xiàn)十分重要。如果人們可以直接與算法和數(shù)據(jù)交互,將可以比較輕松的進行解釋。其中一個能夠同時支持數(shù)據(jù)呈現(xiàn)和用戶交互的方式就是構(gòu)建一個圖形用戶界面(GUI)。
利用GUI對回歸樹調(diào)優(yōu)的基本步驟:
1、收集數(shù)據(jù):所提供的文本文件
2、準備數(shù)據(jù):用Python解析上述文件,得到數(shù)值型數(shù)據(jù)
3、分析數(shù)據(jù):用tkinter構(gòu)建一個GUI來展示模型和數(shù)據(jù)
4、訓練算法:訓練一棵回歸樹和一顆模型樹,并與數(shù)據(jù)集一起展示
5、測試算法:這里一般不需要測試過程
6、使用算法:GUI使得人們可以在預剪枝時測試不同參數(shù)的影響,還可以幫助我們選擇模型的類型。
用tkinter創(chuàng)建GUI
Python有很多GUI框架,其中一個易于使用的tkinter,是隨Python的標準編譯版本發(fā)布的。tkinter可以在Windows、Mac OS和大多數(shù)的Linux平臺上使用。
簡答的GUI窗口:
from tkinter import *root=Tk()
myLabel=Label(root,text='hello')
myLabel.grid()
root.mainloop()
tkinter的GUI由一些小部件組成。所謂小部件,指的是文本框、按鈕、標簽和復選按鈕等對象。
下面將所需要的小部件集成在一起,構(gòu)建樹管理器。建立一個新的Python文件:
from tkinter import *
from numpy import *def loadDataSet(fileName):dataMat=[]fr=open(fileName)for line in fr.readlines():curLine=line.strip().split('\t')fltLine=list(map(float,curLine))#print(list(fltLine))dataMat.append(fltLine)return dataMatdef reDraw(tolS,tolN):pass
def drawNewTree():passroot=Tk()
Label(root,text='Plot Place Holder').grid(row=0,columnspan=3)
Label(root,text='tolN').grid(row=1,column=0)
tolNentry=Entry(root)
tolNentry.grid(row=1,column=1)
tolNentry.insert(0,'10')
Label(root,text='tolS').grid(row=2,column=0)
tolSentry=Entry(root)
tolSentry.grid(row=2,column=1)
tolSentry.insert(0,'1.0')
Button(root,text='ReDraw',command=drawNewTree).grid(row=1,column=2,rowspan=3)
chkBtnVar=IntVar()
chkbtn=Checkbutton(root,text='model Tree',variable=chkBtnVar)
chkbtn.grid(row=3,column=0,columnspan=2)
reDraw.rawDat=mat(loadDataSet('test/sine.txt'))
reDraw.testDat=arange(min(reDraw.rawDat[:,0]),max(reDraw.rawDat[:,0]),0.01)
reDraw(1.0,10)
root.mainloop()
上述代碼中,先是建立了一組tkinter模塊,并用網(wǎng)格布局管理器安排了它們的位置,這里還給出了兩個繪制占位符函數(shù)。代碼中先創(chuàng)建了一個Tk類型的根部件然后插入標簽,我們可以使用grid()方法設(shè)定行和列的位置,也可以通過設(shè)定columnspan和rowspan的值來告訴布局管理器是否允許一個小部件跨行或跨列。除此以外還有其他設(shè)置項可供使用。
現(xiàn)在GUI可以按照要求正常運行,下面利用它來繪圖。
集成matplotlib和tkinter
matplotlib的構(gòu)建程序包括一個前端,同時創(chuàng)建一個后端,用于實現(xiàn)繪圖和不同應(yīng)用之間接口。通過改變后端可以將圖像繪制在PNG、PDF、SVG等格式的文件上。
下面將設(shè)置后端為TkAgg。TkAgg可以在所選GUI框架上調(diào)用Agg,把Agg呈現(xiàn)在畫布上。我們可以在Tk的GUI上放置一個畫布,并用grid()來調(diào)整布局。
先用畫布來替換繪制占位符,刪掉對應(yīng)標簽并添加以下代碼:
reDraw.f = Figure(figsize=(5,4), dpi=100) #create canvas
reDraw.canvas = FigureCanvasTkAgg(reDraw.f, master=root)
reDraw.canvas.draw()
reDraw.canvas.get_tk_widget().grid(row=0, columnspan=3)
下面將樹創(chuàng)建函數(shù)與畫布鏈接起來:
import matplotlib
matplotlib.use('TkAgg')
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figuredef reDraw(tolS,tolN):reDraw.f.clf()reDraw.a=reDraw.f.add_subplot(111)if chkBtnVar.get():if tolN<2:tolN=2myTree=createTree(reDraw.rawDat,modelLeaf,modelErr,ops=(tolS,tolN))yHat=createForeCase(myTree,reDraw.testDat,modelTreeEval)else:myTree=createTree(reDraw.rawDat,ops=(tolS,tolN))yHat=createForeCase(myTree,reDraw.testDat)reDraw.a.scatter(reDraw.rawDat[:,0].tolist(),reDraw.rawDat[:,1].tolist(),s=5)reDraw.a.plot(reDraw.testDat,yHat,linewidth=2.0)reDraw.canvas.draw()
def getInputs():try:tolN=int(tolNentry.get())except:tolN=10print('enter Integer for tolN')tolNentry.delete(0,END)tolNentry.insert(0,'10')try:tolS=float(tolSentry.get())except:tolS=1.0print('enter Float for tolS')tolSentry.delete(0,END)tolSentry.insert(0,'1.0')return tolN,tolS
def drawNewTree():tolN,tolS=getInputs()reDraw(tolS,tolN)
上述代碼中,一開始導入matplotlib文件并設(shè)定后端為TkAgg。
drawNewTree()函數(shù)在ReDraw按鈕被點擊時被調(diào)用,它實現(xiàn)了兩個功能:1、調(diào)用getInputs()方法得到輸入框的值;2、利用該值調(diào)用reDraw()方法生成圖
getInputs()函數(shù)試圖理解用戶的輸入并防止程序崩潰。其中tolS期望的輸入是浮點數(shù),而tolN期望的輸入是整數(shù)。為了得到用戶輸入的文本,可以在Entry部件上調(diào)用.get()方法。另外這里使用了try和except模式,如果Python可以把輸入文本解析成整數(shù)就繼續(xù)執(zhí)行,如果不能識別則輸出錯誤信息,同時清空輸入框并恢復為默認值。
reDraw()函數(shù)的主要目的是把樹繪制出來。該函數(shù)假定輸入是合法的,它首先要做的是清空之前的圖像,使得前后兩個圖像不會重疊。清空時圖像的各個子圖也都會被清除,所以需要重新添加一個新圖。接下來函數(shù)會檢查復選框是否被選中。根據(jù)復選框是否被選中,確定基于tolS和tolN參數(shù)構(gòu)建模型樹還是回歸樹。當樹構(gòu)建完成之后就對測試集testDat進行預測,該測試集與訓練集有相同的范圍且點的分布均勻。最后,真實數(shù)據(jù)和預測值都會被繪制出來。具體實現(xiàn)是,真實值采用scatter()方法繪制,而預測值則采用plot()方法繪制,這是因為scatter()方法構(gòu)建的是離散型散點圖,而plot()方法則構(gòu)建連續(xù)曲線。
實際繪制效果: