通过功能的需求分析进行系统设计,拟采Django 应用框架,提高开发效率,降低系统维护难度。
本课题选择Python来进行开发,前台使用vue开发,数据库选择MySQL进行建库,python是目前最为流行的技术,无论是成熟度和未来发展都更能适应本基于Python的房价预测系统的业务。
本课题使用面向对象的设计思想进行设计,对系统的现状进行调研,收集当前基于Python的房价预测系统的需求,以及对实际业务的调查,整理需求文档,使用用例图状态图等进行描述,接着使用面向对象技术设计系统功能,系统数据库。完成基于Python的房价预测系统,主要包括了系统的开发背景收集、建模工具选型、技术确定、需求分析的整理、数据库的设计和功能模块划分、系统环境的部署、实现测试方法的选择,以及最后的搭建部署。a.校所学的相关专业课程如《数据库原理及应用》、《Django框架》、《python程序设计》、《python数据分析》、《预测算法》、《Web开发》、《软件工程》等课程的综合应用对完成本课题研究有较大的促进。
b.导师提供的相关参考资料,也让我有了更清晰的设计思路与过程。
c.收集了关于Django框架、python语言等方面的相关资料进行研读,对Scikit-learn等python库的训练使用。
d.下载相关的爬虫项目进行研究,学习代码框架。
e.通过理论知识、结合实践经验,可以支撑毕业设计的顺利完成。

通过使用Python这种面向对象语言与后端的MySQL数据库相结合,在老师的指导下完成设计,并对整个系统进行验证测试,利用基于Python的房价预测系统,直接在前台页面里注册、登录、查询爬取的房价数据,并进行预测分析。管理后台对爬取的信息进行管理。
使用Scikit-learn库搭建线性回归模型进行房价预测,以面积、人均收入、平均房龄为变量,建立多因子模型,评估模型表现。先对数据进行预处理,建立单因子线性回归模型,训练模型,评估模型表现,可视化线性回归预测结果。

def to_forecast(data,req_dict,value):
    if len(data) < 5:
        print(f"的样本数量不足: {len(data)}")
        return pd.DataFrame()
    #3.处理特征值和目标值
    labels={}
    for key in data.keys():
        if pd.api.types.is_string_dtype(data[key]):
            label_encoder = LabelEncoder()
            labels[key] = label_encoder
            data[key] = label_encoder.fit_transform(data[key])
    #4.数据集划分
    X = data[[
        'roomtype',
        'roomorientation',
        'area',
        'decorationcondition',
    ]]
    y = data[[
        'unitprice',
    ]]
    x_train, x_test, y_train, y_test = train_test_split(X, y,test_size=0.2, random_state=22)
    #5.构建预测特征值
    #根据输入的特征值去预测
    if req_dict:
        req_dict.pop('addtime',None)
        future_df = pd.DataFrame([req_dict])
        for key in future_df.keys():
           if key in labels:
               encoder = labels[key]
               values = future_df[key][0]
               try:
                   values = encoder.transform([values])[0]
               except ValueError as e: #处理未见过的标签
                   values = np.array([encoder.transform([v])[0] if v in encoder.classes_ else -1 for v in values]).sum()
               future_df[key][0] = values
    else:
        future_df = x_test
    #特征工程-标准化
    estimator_file = os.path.join(parent_directory, "gzhpforecast.pkl")
    estimator = RandomForestRegressor(n_estimators=100, random_state=42)
    _, num_columns = y_train.shape
    if num_columns>=2:
        estimator.fit(x_train, y_train)
    else:
        estimator.fit(x_train, y_train.values.ravel())
    y_pred = estimator.predict(x_test)
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体 SimHei
    plt.rcParams['axes.unicode_minus'] = False  # 解决负号 '-' 显示为方块的问题
    # 绘制预测值与实际值的散点图
    plt.figure(figsize=(10, 6))
    plt.scatter(y_test, y_pred, alpha=0.5)
    plt.xlabel("实际值")
    plt.ylabel("预测值")
    plt.title("实际值与预测值(随机森林回归)")
    directory =os.path.join(parent_directory, "templates","front","gzhpforecast","figure.png")
    os.makedirs(os.path.dirname(directory), exist_ok=True)
    plt.savefig(directory)
    plt.clf()
    # 绘制特征重要性
    feature_importances = estimator.feature_importances_
    features = [
        'roomtype',
        'roomorientation',
        'area',
        'decorationcondition',
    ]
    sns.barplot(x=feature_importances, y=features)
    plt.xlabel("重要性得分")
    plt.ylabel("特征")
    plt.title("特征重要性")
    if value!=None:
        directory =os.path.join(parent_directory, "templates","front","gzhpforecast","{value}_figure.png")
        os.makedirs(os.path.dirname(directory), exist_ok=True)
        plt.savefig(directory)
    else:
        directory =os.path.join(parent_directory, "templates","front","gzhpforecast","figure_other.png")
        os.makedirs(os.path.dirname(directory), exist_ok=True)
        plt.savefig(directory)
    plt.clf()
    #保存模型
    joblib.dump(estimator, estimator_file)
    y_pred  = estimator.predict(x_test)

    comparison_df = pd.DataFrame({'实际值': y_test.values.flatten(), '预测值': y_pred.flatten()})
    comparison_df = comparison_df.sort_values(by='实际值')  # 按实际销量排序,方便可视化

Logo

一站式 AI 云服务平台

更多推荐