Tkinter GUI的Python随机森林ML模型

如何解决Tkinter GUI的Python随机森林ML模型

我对编程非常陌生,将不胜感激。我已经使用RandomForest开发了ML模型。当我独立运行模型时,我的代码工作正常,但是当我尝试使用Tkinter包装函数将数据发送到我的代码时,出现值错误。

我的模型代码如下

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.model_selection import StratifiedShuffleSplit
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.impute import SimpleImputer
from joblib import dump,load
from sklearn.ensemble import RandomForestRegressor

housing = pd.read_csv("housing_data.csv")
train_set,test_set = train_test_split(housing,test_size=0.2,random_state=42)
splitter = StratifiedShuffleSplit(n_splits = 1,test_size = 0.2,random_state=42)
for train_index,test_index in splitter.split(housing,housing['CHAS']):
    strat_train_set = housing.loc[train_index]
    strat_test_set = housing.loc[test_index]
median = housing["RM"].median()
housing["RM"].fillna(median)
housing = strat_train_set.drop("MEDV",axis = 1)
housing_labels = strat_train_set["MEDV"].copy()
my_pipeline = Pipeline([
    ('imputer',SimpleImputer(strategy = "median")),#imputer takes the median value and fills all the blank fields
    ('std_scaler',StandardScaler()),])
housing_pip = my_pipeline.fit_transform(housing)
print(housing_pip.shape)
model_random_forest = RandomForestRegressor()
model_random_forest.fit(housing_pip,housing_labels)
dump(model_random_forest,'Dragon.joblib')

我正在使用功能来输入值并获得预测。功能代码如下

a=[]
b=[]
c=[]
d=[]
e=[]
f=[]
g=[]
h=[]
i=[]
j=[]
k=[]
l=[]
m=[]
def predictor(array = np.array([[a],[b],[c],[d],[e],[f],[g],[h],[i],[j],[k],[l],[m]])):
    print(model_random_forest.predict(array))


predictor([[1,2,3,4,5,6,7,8,9,10,11,12,13]])

代码绝对可以正常工作,但是当我使用Tkinter GUI包装函数将值发送到该函数时,它会给出ValueError: Number of features of the model must match the input. Model n_features is 13 and input n_features is 1

我的Tkinter包装器功能如下

def make_predict():
    test.predictor([[crim.get()],[zn.get()],[indus.get()],[chas.get()],[nox.get()],[rm.get()],[age.get()],[dis.get()],[rad.get()],[tax.get()],[ptratio.get()],[b.get()],[lstat.get()]])

crim.get,zn.get等是tkinter中的输入框。伙计们,我非常感谢您的帮助。我是编程新手,已经花了很多时间解决此错误。

以防万一我也在下面粘贴完整的Tkinter代码

from tkinter import*
import numpy as np
import test

window = Tk()

def make_predict():
    test.predictor([[crim.get()],[lstat.get()]])
    #t1.delete(0,END)
    #t1.insert(END,(model_random_forest.predict(features)))


window.title("Property Price Predictor")
window.geometry('500x800')

mainLabel = Label(window,text="Property Price Predictor",font=("Arial Bold",20))
mainLabel.grid(row=2,columnspan=8)

crim=StringVar()
e1 = Entry(window,width = 25,textvariable=crim) #crim
e1.grid(row = 3,column = 2)
l1 = Label(window,text = 'PER CAPITA CRIME RATE BY TOWN')
l1.grid(row = 4,column = 2)

zn = StringVar()
e2 = Entry(window,textvariable=zn) #ZN
e2.grid(row = 6,column = 2)
l2 = Label(window,text = 'PROPORTION OF RESIDENTIAL LAND ZONED FOR LOTS OVER 25,000 SQ.FT.')
l2.grid(row = 7,column = 2)

indus=StringVar()
e3 = Entry(window,textvariable=indus) #INDUS
e3.grid(row = 9,column = 2)
l3 = Label(window,text = 'PROPORTION OF NON-RETAIL BUSINESS ACRES PER TOWN')
l3.grid(row = 10,column = 2)

chas=StringVar()
e4 = Entry(window,textvariable=chas) #CHAS
e4.grid(row = 12,column = 2)
l4 = Label(window,text = 'CHARLES RIVER DUMMY VARIABLE (= 1 IF TRACT BOUNDS RIVER; 0 OTHERWISE)')
l4.grid(row = 13,column = 2)

nox=StringVar()
e5 = Entry(window,textvariable=nox) #NOX
e5.grid(row = 15,column = 2)
l5 = Label(window,text = 'NITRIC OXIDES CONCENTRATION (PARTS PER 10 MILLION)')
l5.grid(row = 16,column = 2)

rm=StringVar()
e6 = Entry(window,textvariable=rm) #RM
e6.grid(row = 18,column = 2)
l6 = Label(window,text = 'AVERAGE NUMBER OF ROOMS PER DWELLING')
l6.grid(row = 19,column = 2)

age=StringVar()
e7 = Entry(window,textvariable=age) # AGE
e7.grid(row = 21,column = 2)
l7 = Label(window,text = 'PROPORTION OF OWNER-OCCUPIED UNITS BUILT PRIOR TO 1940')
l7.grid(row = 22,column = 2)

dis=StringVar()
e8 = Entry(window,textvariable=dis) #DIS
e8.grid(row = 24,column = 2)
l8 = Label(window,text = 'WEIGHTED DISTANCES TO FIVE BOSTON EMPLOYMENT CENTRES')
l8.grid(row = 25,column = 2)

rad=StringVar()
e9 = Entry(window,textvariable=rad) #RAD
e9.grid(row = 27,column = 2)
l9 = Label(window,text = 'INDEX OF ACCESSIBILITY TO RADIAL HIGHWAYS')
l9.grid(row = 28,column = 2)

tax=StringVar()
e10 = Entry(window,textvariable=tax ) #TAX
e10.grid(row = 30,column = 2)
l10 = Label(window,text = 'FULL-VALUE PROPERTY-TAX RATE PER $10,000')
l10.grid(row = 31,column = 2)

ptratio=StringVar()
e11 = Entry(window,textvariable=ptratio) #PTRATIO
e11.grid(row = 33,column = 2)
l11 = Label(window,text = 'PUPIL-TEACHER RATIO BY TOWN')
l11.grid(row = 34,column = 2)

b=StringVar()
e12 = Entry(window,textvariable=b) #B
e12.grid(row = 36,column = 2)
l12 = Label(window,text = '1000(BK - 0.63)^2 WHERE BK IS THE PROPORTION OF BLACKS BY TOWN')
l12.grid(row = 37,column = 2)

lstat=StringVar()
e13 = Entry(window,textvariable=lstat) #LSTAT
e13.grid(row = 39,column = 2)
l13 = Label(window,text = '% LOWER STATUS OF THE POPULATION')
l13.grid(row = 40,column = 2)

t1 = Text(window,height = 1,width = 20)
t1.grid(row = 45,column = 2)
l15 = Label(window,text = 'PREDICTION')
l15.grid(row = 46,column = 2)

db1 = Button(window,text = 'PREDICT',width=20,command = make_predict)
db1.grid(row=48,column=2)

window.mainloop()

解决方法

您的住房数据集很可能缺少值 您需要删除缺少值的列,而不是进行插补。

代码如下:

首先检查数据集中的缺失值

housing_train = X_train
missing_values_columns = [col for col in housing_train.columns
                 if housing_train[col].isnull().any()]
housing_transformed = X_test.drop(missing_values_columns,axis=1
model_random_forest = RandomForestRegressor()
model_random_forest.fit(housing_transformed,housing_labels)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?