Python製作資料預測整合工具(值得收藏)
大資料預測是大資料最核心的應用,是它將傳統意義的預測拓展到“現測”。大資料預測的優勢體現在,它把一個非常困難的預測問題,轉化為一個相對簡單的描述問題,而這是傳統小資料集根本無法企及的。從預測的角度看,大資料預測所得出的結果不僅僅是用於處理現實業務的簡單、客觀的結論,更是能用於幫助企業經營的決策。
在過去,人們的決策主要是依賴 20% 的結構化資料,而大資料預測則可以利用另外 80% 的非結構化資料來做決策。大資料預測具有更多的資料維度,更快的資料頻度和更廣的資料寬度。與小資料時代相比,大資料預測的思維具有 3 大改變:實樣而非抽樣;預測效率而非精確;相關關係而非因果關係。
而今天我們就將利用python製作視覺化的大資料預測部分整合工具,其中資料在這裡使用一個實驗中的資料。普遍性的應用則直接從檔案讀取即可。其中的效果圖如下:
實驗前的準備
首先我們使用的python版本是3.6.5所用到的模組如下:
- sklearn模組用來建立整個模型訓練和儲存呼叫以及演算法的搭建框架等等。
- numpy模組用來處理資料矩陣運算。
- matplotlib模組用來視覺化擬合模型效果。
- Pillow庫用來載入圖片至GUI介面。
- Pandas模組用來讀取csv資料檔案。
- Tkinter用來建立GUI視窗程式。
資料的訓練和訓練的GUI視窗
經過演算法比較,發現這裡我們選擇使用sklearn簡單的多元迴歸進行擬合數據可以達到比較好的效果。
(1)首先是是資料的讀取,通過設定選定資料夾函式來讀取檔案,載入資料的效果:
'''選擇檔案功能''' def selectPath(): # 選擇檔案path_接收檔案地址 path_ =tkinter.filedialog.askopenfilename() # 通過replace函式替換絕對檔案地址中的/來使檔案可被程式讀取 # 注意:\\轉義後為\,所以\\\\轉義後為\\ path_ =path_.replace("/","\\\\") # path設定path_的值 path.set(path_) return path # 得到的DataFrame讀入所有資料 data = pd.read_excel(FILENAME,header=0,usecols="A,B,C,D,E,F,G,H,I") # DataFrame轉化為array DataArray = data.values # 讀取已使用年限作為標籤 Y = DataArray[:,8] # 讀取其他引數作為自變數,影響因素 X = DataArray[:,0:8] # 字串轉變為整數 for i in range(len(Y)): Y[i] = int(Y[i].replace("年","")) X = np.array(X) # 轉化為array Y = np.array(Y) # 轉化為array root = Tk() root.geometry("+500+260") # 背景圖設定 canvas = tk.Canvas(root,width=600,height=200,bd=0,highlightthickness=0) imgpath = '1.jpg' img = Image.open(imgpath) photo = ImageTk.PhotoImage(img) #背景圖大小設定 canvas.create_image(700,400,image=photo) canvas.pack() path = StringVar() #標籤名稱位置 label1=tk.Label(text = "目標路徑:") label1.pack() e1=tk.Entry( textvariable = path) e1.pack() bn1=tk.Button(text = "路徑選擇",command = selectPath) bn1.pack() bn2=tk.Button(text = "模型訓練",command = train) bn2.pack() bn3=tk.Button(text = "模型預測",command = test) bn3.pack() #標籤按鈕等放在背景圖上 canvas.create_window(50,50,width=150,height=30,window=label1) canvas.create_window(280,width=300,window=e1) canvas.create_window(510,window=bn1) canvas.create_window(50,100,window=bn2) canvas.create_window(510,window=bn3) root.mainloop()
效果如下可見:
(2)然後是資料的擬合和視覺化模型效果:
# 模型擬合 reg = LinearRegression() reg.fit(X,Y) # 預測效果 predict = reg.predict(np.array([X[0]])) Y_predict = reg.predict(X) print(Y_predict) # 橫座標 x_label = [] for i in range(len(Y)): x_label.append(i) # 繪圖 fig,ax = plt.subplots() # 真實值分佈散點圖 plt.scatter(x_label,Y) # 預測值分佈散點圖 plt.scatter(x_label,Y_predict) # 預測值擬合直線圖 plt.plot(x_label,Y_predict) # 橫縱座標 ax.set_xlabel('預測值與真實值模型擬合效果圖') ax.set_ylabel('藍色為真實值,黃色為預測值') # 將繪製的圖形顯示到tkinter:建立屬於root的canvas畫布,並將圖f置於畫布上 canvas = FigureCanvasTkAgg(fig,master=root) canvas.draw() # 注意show方法已經過時了,這裡改用draw canvas.get_tk_widget().pack() # matplotlib的導航工具欄顯示上來(預設是不會顯示它的) toolbar = NavigationToolbar2Tk(canvas,root) toolbar.update() canvas._tkcanvas.pack() #彈窗顯示 messagebox.showinfo(title='模型情況',message="模型訓練完成!") 其中的效果如下可見:
其中的效果如下可見:
模型的預測和使用
其中模型的預測主要通過兩種方式進行預測,分別是:手動輸入單個數據進行預測和讀取檔案進行預測。
其中手動輸入資料進行預測需要設定更多的GUI按鈕,其中程式碼如下:
#子視窗 LOVE = Toplevel(root) LOVE.geometry("+100+260") LOVE.title = "模型測試" #子視窗各標籤名 label = ["上升沿斜率(v/us)","下降沿斜率(v/us)","脈寬(ns)","低狀態電平(mv)","低電平方差(mv2)x10-3","高狀態電平(v)","高電平方差(v2)","訊號質量因子"] Label(LOVE,text="1、輸入引數預測",font=("微軟雅黑",20)).grid(row=0,column=0) #標籤名稱,字型位置 Label(LOVE,text=label[0],10)).grid(row=1,column=0) Label(LOVE,text=label[1],column=1) Label(LOVE,text=label[2],column=2) Label(LOVE,text=label[3],column=3) Label(LOVE,text=label[4],column=4) Label(LOVE,text=label[5],column=5) Label(LOVE,text=label[6],column=6) Label(LOVE,text=label[7],column=7) #編輯框位置和字型 en1=tk.Entry(LOVE,8)) en1.grid(row=2,column=0) en2=tk.Entry(LOVE,8)) en2.grid(row=2,column=1) en3=tk.Entry(LOVE,8)) en3.grid(row=2,column=2) en4=tk.Entry(LOVE,8)) en4.grid(row=2,column=3) en5=tk.Entry(LOVE,8)) en5.grid(row=2,column=4) en6=tk.Entry(LOVE,8)) en6.grid(row=2,column=5) en7=tk.Entry(LOVE,8)) en7.grid(row=2,column=6) en8=tk.Entry(LOVE,8)) en8.grid(row=2,column=7) Label(LOVE,text="",10)).grid(row=3,column=0) #測試輸入框預測 def pp(): x=np.array([int(en1.get()),int(en2.get()),int(en3.get()),int(en4.get()),int(en5.get()),int(en6.get()),int(en7.get()),int(en8.get())]) # 預測效果 predict = reg.predict(np.array([x])) Label(LOVE,text="預測結果已使用年數為:"+str(predict[0])+"年",10)).grid(row=4,column=3) print(predict) Button(LOVE,text="預測:",15),command=pp).grid(row=4,text="2、選擇檔案預測",20)).grid(row=5,column=0) path1 = StringVar() label1 = tk.Label(LOVE,text="目標路徑:",10)) label1.grid(row=6,column=0) e1 = tk.Entry(LOVE,textvariable=path1,10)) e1.grid(row=6,column=2) label = ["上升沿斜率(v/us)","訊號質量因子"] n = 0 for i in predict_value: print(str(label) + "分別為" + str(X[n]) + "預測出來的結果為:" + str(i) + "年" + "\n") f = open("預測結果.txt","a") f.write(str(label) + "分別為" + str(X[n]) + "預測出來的結果為:" + str(i) + "年" + "\n") f.close() f = open("result.txt","a") f.write(str(i) + "\n") f.close() n += 1 messagebox.showinfo(title='模型情況',message="預測結果儲存在當前資料夾下的TXT檔案中!") os.system("result.txt") os.system("預測結果.txt") Button(LOVE,command=ppt).grid(row=7,column=0)
效果如下可見:
選擇檔案進行讀取預測和模型訓練資料的讀取類似,程式碼如下:
#選擇檔案預測 def selectPath1(): # 選擇檔案path_接收檔案地址 path_ =tkinter.filedialog.askopenfilename() # 通過replace函式替換絕對檔案地址中的/來使檔案可被程式讀取 # 注意:\\轉義後為\,所以\\\\轉義後為\\ path_ =path_.replace("/","\\\\") # path設定path_的值 path1.set(path_) return path bn1 = tk.Button(LOVE,text="路徑選擇",10),command=selectPath1) bn1.grid(row=6,column=6) def ppt(): try: os.remove("預測結果.txt") os.remove("result.txt") except: pass # 檔案的名字 FILENAME =path1.get() # 禁用科學計數法 pd.set_option('float_format',lambda x: '%.3f' % x) np.set_printoptions(threshold=np.inf) # 得到的DataFrame讀入所有資料 data =pd.read_excel(FILENAME,H") # DataFrame轉化為array DataArray =data.values # 讀取其他引數作為自變數,影響因素 X = DataArray[:,0:8] predict_value = reg.predict(X) print(predict_value)
效果如下:
由於讀取檔案進行預測的話,資料較多故直接儲存在TXT中方便檢視
以上就是Python製作資料預測整合工具(值得收藏)的詳細內容,更多關於python 資料預測的資料請關注我們其它相關文章!