项目视频讲解:
基于机器学习神经网络的 GUI的房价预测系统-完整代码+数据_哔哩哔哩_bilibili
项目运行结果:
代码:
from sklearn import preprocessing
import random
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn import preprocessing
from datetime import datetime
import time
import math
from matplotlib import pyplot
from sklearn.model_selection import train_test_split
from scipy import stats, integrate
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import KFold
from sklearn.metrics import classification_report
from sklearn.model_selection import learning_curve
from sklearn.model_selection import validation_curve
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.metrics import confusion_matrix
from sklearn.model_selection import train_test_split
from sklearn import metrics
from sklearn.svm import SVR
from sklearn.neighbors import KNeighborsRegressor
from sklearn.metrics import mean_squared_error, mean_absolute_error # 评价指标
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import AdaBoostRegressor
from xgboost import XGBRegressor
from sklearn.ensemble import GradientBoostingRegressor
from lightgbm import LGBMRegressor
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
from date_process import data_read_csv
train_x,train_y=data_read_csv()
x_train, x_test, y_train, y_test = train_test_split(np.array(train_x), np.array(train_y), test_size=0.4,shuffle=True,random_state=1)
twox_train, twox_test, twoy_train, twoy_test = train_test_split(np.array(x_test), np.array(y_test), test_size=0.5,shuffle=True,random_state=1)
print('x_train.shape',x_train.shape)
print('x_test.shape',x_test.shape)
# 集成学习模型
# svm算法
from sklearn.linear_model import LassoLarsIC as LR#逻辑回归
svm = LR(max_iter=5,fit_intercept=False,copy_X=False)
svm.fit(twox_train, twoy_train)
svm_pred = svm.predict(twox_test)
from metra import metric
mae, mse, rmse, mape, mspe,r2=metric(np.array(svm_pred), np.array(twoy_test))
print('mae, mse, rmse, mape, mspe,r2')
print(mae, mse, rmse, mape, mspe,r2)
# 设置Seaborn样式
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style="darkgrid")
x = range(len(twoy_test))
data = pd.DataFrame({'x': x, 'y_pred': svm_pred, 'y_true': twoy_test}).iloc[100:200,:]
# 绘制y_pred的折线图
sns.lineplot(x='x', y='y_pred', data=data, linewidth=1, label='y_pred',color='blue')
# 绘制y_true的折线图
sns.lineplot(x='x', y='y_true', data=data, linewidth=1, label='y_true',color='orange')
# 添加标题和标签
plt.title('pred-true')
plt.xlabel('data_id')
plt.ylabel('pred')
plt.savefig('knn_Prediction_True.png')
# 显示图形
plt.show()
import tkinter as tk
from tkinter import messagebox
from tkinter import ttk
import pandas as pd
from sklearn.linear_model import LinearRegression
import os
from sklearn import preprocessing
import random
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from datetime import datetime
import time
import math
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.metrics import mean_squared_error, mean_absolute_error # 评价指标
from sklearn.neighbors import KNeighborsRegressor
from sklearn.model_selection import KFold
from sklearn.metrics import classification_report
from sklearn.model_selection import learning_curve, validation_curve, cross_val_score
from sklearn.decomposition import PCA
from sklearn.metrics import confusion_matrix
from sklearn.ensemble import RandomForestRegressor, AdaBoostRegressor, GradientBoostingRegressor
from sklearn.svm import SVR
from sklearn.linear_model import LogisticRegression
from xgboost import XGBRegressor
from lightgbm import LGBMRegressor
import joblib # 用于模型保存和加载
from date_process import data_read_csv
from metra import metric
# 示例数据,确保包含面积、楼层、年月和价格
data = pd.DataFrame({
'面积': [30, 50, 70, 100, 120],
'楼层': [1, 2, 3, 4, 5],
'年月': ['2022-01', '2022-02', '2022-03', '2022-04', '2022-05'],
'房价': [100, 150, 200, 250, 300]
})
# 训练模型
X = data[['面积']]
y = data['房价']
model = LinearRegression()
model.fit(X, y)
USER_FILE = "users.txt"
class App:
def __init__(self, root):
self.root = root
self.root.title("房价预测系统")
self.root.geometry("800x600")
self.root.config(bg='lightblue')
# 背景图像
self.background_image = tk.PhotoImage(file="background.png") # 确保这个文件存在
background_label = tk.Label(root, image=self.background_image)
background_label.place(relwidth=1, relheight=1)
# 用户模块
self.user_frame = tk.Frame(root, bg='lightblue')
self.user_frame.pack(fill='both', expand=True)
# 注册登录
self.username_label = tk.Label(self.user_frame, text="用户名:", bg='lightblue')
self.username_label.pack(pady=5)
self.username_entry = tk.Entry(self.user_frame)
self.username_entry.pack(pady=5)
self.password_label = tk.Label(self.user_frame, text="密码:", bg='lightblue')
self.password_label.pack(pady=5)
self.password_entry = tk.Entry(self.user_frame, show='*')
self.password_entry.pack(pady=5)
self.login_button = tk.Button(self.user_frame, text="登录", command=self.login)
self.login_button.pack(pady=10)
self.register_button = tk.Button(self.user_frame, text="注册", command=self.register)
self.register_button.pack(pady=10)
self.admin_button = tk.Button(self.user_frame, text="管理员登录", command=self.show_admin_controls)
self.admin_button.pack(pady=10)
# 预测分析模块
self.predict_frame = tk.Frame(root, bg='lightblue')
self.area_label = tk.Label(self.predict_frame, text="输入面积:", bg='lightblue')
self.area_label.pack(pady=5)
self.area_entry = tk.Entry(self.predict_frame)
self.area_entry.pack(pady=5)
self.predict_button = tk.Button(self.predict_frame, text="预测房价", command=self.predict_price)
self.predict_button.pack(pady=10)
self.result_label = tk.Label(self.predict_frame, text="", bg='lightblue')
self.result_label.pack(pady=5)
self.visualize_button = tk.Button(self.predict_frame, text="查看房价信息", command=self.show_price_info)
self.visualize_button.pack(pady=10)
self.back_button = tk.Button(self.predict_frame, text="返回", command=self.show_user_frame)
self.back_button.pack(pady=10)
# 表格显示
self.tree = ttk.Treeview(self.predict_frame, columns=('面积', '楼层', '年月', '房价'), show='headings')
self.tree.heading('面积', text='面积')
self.tree.heading('楼层', text='楼层')
self.tree.heading('年月', text='年月')
self.tree.heading('房价', text='房价')
self.tree.pack(fill='both', expand=True)
# 管理员模块
self.admin_frame = tk.Frame(root, bg='lightblue')
self.user_list_label = tk.Label(self.admin_frame, text="用户列表:", bg='lightblue')
self.user_list_label.pack(pady=5)
self.user_list_box = tk.Listbox(self.admin_frame)
self.user_list_box.pack(fill='both', expand=True)
self.delete_user_button = tk.Button(self.admin_frame, text="删除用户", command=self.delete_user)
self.delete_user_button.pack(pady=10)
self.admin_back_button = tk.Button(self.admin_frame, text="返回", command=self.show_user_frame)
self.admin_back_button.pack(pady=10)
self.load_users()
def load_users(self):
"""从文本文件加载用户信息"""
if os.path.exists(USER_FILE):
with open(USER_FILE, 'r') as f:
users = f.readlines()
for user in users:
username, _ = user.strip().split(',')
self.user_list_box.insert(tk.END, username)
def login(self):
username = self.username_entry.get()
password = self.password_entry.get()
# 验证用户逻辑
if self.validate_user(username, password):
messagebox.showinfo("登录", f"欢迎,{username}!")
self.user_frame.pack_forget() # 隐藏用户模块
self.predict_frame.pack(fill='both', expand=True) # 显示预测分析模块
else:
messagebox.showwarning("登录", "用户名或密码错误!")
def validate_user(self, username, password):
"""验证用户信息"""
if os.path.exists(USER_FILE):
with open(USER_FILE, 'r') as f:
for line in f:
stored_username, stored_password = line.strip().split(',')
if stored_username == username and stored_password == password:
return True
return False
def register(self):
username = self.username_entry.get()
password = self.password_entry.get()
if username and password:
with open(USER_FILE, 'a') as f:
f.write(f"{username},{password}\n")
messagebox.showinfo("注册", f"用户 {username} 注册成功!")
self.username_entry.delete(0, tk.END)
self.password_entry.delete(0, tk.END)
else:
messagebox.showwarning("注册", "用户名或密码不能为空!")
def show_admin_controls(self):
self.user_frame.pack_forget() # 隐藏用户模块
self.admin_frame.pack(fill='both', expand=True) # 显示用户管理界面
self.user_list_box.delete(0, tk.END) # 清空现有用户列表
self.load_users() # 重新加载用户列表
def delete_user(self):
selected_user = self.user_list_box.curselection()
if selected_user:
user_to_delete = self.user_list_box.get(selected_user)
self.remove_user(user_to_delete) # 从文件中删除用户
self.update_user_list() # 更新用户列表
messagebox.showinfo("删除用户", f"用户 {user_to_delete} 已删除!")
else:
messagebox.showwarning("删除用户", "请选择要删除的用户!")
def remove_user(self, username):
"""从文件中删除用户"""
with open(USER_FILE, 'r') as f:
lines = f.readlines()
with open(USER_FILE, 'w') as f:
for line in lines:
if line.strip().split(',')[0] != username:
f.write(line)
def update_user_list(self):
self.user_list_box.delete(0, tk.END) # 清空现有用户列表
self.load_users() # 重新加载用户列表
def predict_price(self):
area = self.area_entry.get()
area=area.split(',')
area=np.array([ int(i) for i in area])
area=area.reshape(1,-1)
# 加载模型
loaded_svm = joblib.load('knn_model.pkl')
# 使用加载的模型进行预测
svm_pred = loaded_svm.predict(area)
self.result_label.config(text=f"预测房价: {svm_pred[0]:.2f} 万元")
return svm_pred
def show_price_info(self):
for row in self.tree.get_children():
self.tree.delete(row)
for index, row in data.iterrows():
self.tree.insert('', 'end', values=(row['面积'], row['楼层'], row['年月'], row['房价']))
def show_user_frame(self):
self.predict_frame.pack_forget() # 隐藏预测分析模块
self.admin_frame.pack_forget() # 隐藏管理员模块
self.user_frame.pack(fill='both', expand=True) # 显示用户模块
if __name__ == "__main__":
root = tk.Tk()
app = App(root)
root.mainloop()
https://download.youkuaiyun.com/download/weixin_55771290/90331050