python用了五种算法实现分类,除了第一种贝叶斯准确率为40左右,其他准确率都还可以,最低也有80的准确率,然后基于这些分类模型设计了一个GUI,但是预测显示没有一个是对的,反复看了好多遍,初学机器学习,又是第一次用tinkter库,实在找不到问题。希望有大L帮看一下,感谢了。
from keras.datasets import mnist
from sklearn.naive_bayes import BernoulliNB
from keras.utils import np_utils
from sklearn.multioutput import MultiOutputClassifier
import numpy as np
import random
from keras.models import Sequential
from keras.layers import Dense
from tensorflow.keras.optimizers import SGD
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn import svm
import tkinter as tk
from PIL import Image, ImageTk
# 载入数据
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
i = random.randint(1, 10000) # 随机抽取test测试集中1-10000中的一个数i为序号
img = train_images[i].reshape(28, 28)
pil_img = Image.fromarray(np.uint8(img))
# 执行函数
def callback(num, item, train_images, train_labels, test_images, test_labels):
# 维度变换
train_images = train_images.reshape(60000, 28 * 28)
test_images = test_images.reshape(10000, 28 * 28)
# 归一化
train_images = train_images / 255
test_images = test_images / 255
# 独热编码
train_labels = np_utils.to_categorical(train_labels, num_classes=10)
test_labels = np_utils.to_categorical(test_labels, num_classes=10)
# 分类器模型
train_count = 10000 # 训练用10000个样本
# 贝叶斯预测模型
if num == 1:
estimator = BernoulliNB()
multi_target_forest = MultiOutputClassifier(estimator, n_jobs=-1)
multi_target_forest.fit(train_images[:train_count],
train_labels[:train_count])
predict = np.argmax(
multi_target_forest.predict(
np.array(test_images[item]).reshape(1, -1)))
# keras预测模型
elif num == 2:
# 创建模型 输入784个神经元,输出10个神经元
model = Sequential([
# 定义输出是10 输入是784,设置偏置为1,添加softmax激活函数
Dense(units=10,
input_dim=784,
bias_initializer='one',
activation="softmax"),
])
# 定义优化器
sgd = SGD(learning_rate=0.2)
# 定义优化器,loss_function,训练过程中计算准确率
model.compile(optimizer=sgd, loss="mse", metrics=['accuracy'])
# 训练模型
model.fit(train_images, train_labels, batch_size=32, epochs=10)
predict = np.argmax(
model.predict(np.array(test_images[item]).reshape(1, -1)))
# knn预测模型
elif num == 3:
estimator = KNeighborsClassifier(n_neighbors=3)
estimator.fit(train_images[:train_count], train_labels[:train_count])
predict = np.argmax(
estimator.predict(np.array(test_images[item]).reshape(1, -1)))
# 逻辑回归预测模型
elif num == 4:
estimator = LogisticRegression(solver='sag', max_iter=500)
multi_target_forest = MultiOutputClassifier(estimator, n_jobs=-1)
multi_target_forest.fit(train_images[:train_count],
train_labels[:train_count])
predict = np.argmax(
multi_target_forest.predict(
np.array(test_images[item]).reshape(1, -1)))
# svm支持向量机预测模型
elif num == 5:
estimator = svm.SVC()
multi_target_forest = MultiOutputClassifier(estimator, n_jobs=-1)
multi_target_forest.fit(train_images[:train_count],
train_labels[:train_count])
predict = np.argmax(
multi_target_forest.predict(
np.array(test_images[item]).reshape(1, -1)))
label_predict_val.config(text=predict)
# 创建一个应用窗口
window = tk.Tk()
window.title("Classification")
# 按钮
v = tk.IntVar(master=window)
button_1 = tk.Radiobutton(window, text='贝叶斯', variable=v, value=1)
button_2 = tk.Radiobutton(window, text='keras', variable=v, value=2)
button_3 = tk.Radiobutton(window, text='knn', variable=v, value=3)
button_4 = tk.Radiobutton(window, text='逻辑回归', variable=v, value=4)
button_5 = tk.Radiobutton(window, text='支持向量机', variable=v, value=5)
button_1.grid(row=0, column=0)
button_2.grid(row=0, column=1)
button_3.grid(row=0, column=2)
button_4.grid(row=0, column=3)
button_5.grid(row=0, column=4)
# 识别按键
search = tk.Button(window,
text="识别",
command=lambda: callback(num=v.get(),
item=i,
train_images=train_images,
train_labels=train_labels,
test_images=test_images,
test_labels=test_labels))
search.grid(row=0, column=5)
# 测试值图片显示
pil_img = ImageTk.PhotoImage(pil_img)
label_test = tk.Label(window, text="测试值:")
label_test.grid(row=1, column=0)
pic = tk.Label(window, image=pil_img)
pic.grid(row=1, column=1)
# 预测值显示
label_predict = tk.Label(window, text="预测值:")
label_predict.grid(row=1, column=3)
label_predict_val = tk.Label(window)
label_predict_val.grid(row=1, column=4)
window.mainloop()
label_predict_val.config(text=predict)
这里按理说是输出,可是没看到界面上有 label_predict_val,也没看到你的界面更新的代码