ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

随机森林算法驱动的高校学业预警系统设计与实现

随机森林算法驱动的高校学业预警系统设计与实现 这次我们来看一个将机器学习落到实处的高校场景项目基于随机森林算法的大学生学业预警系统设计与实现。它不是概念 Demo也不是单机小脚本而是从“原始教务数据”到“预警名单输出”的完整链路。核心逻辑很简单从学生成绩、考勤、行为数据里抽取特征训练随机森林模型输出挂科风险概率再自动分级给辅导员提供干预依据。相比单一成绩排序随机森林能综合多维度特征给出可解释的特征重要性排序这对高校学生管理场景非常实用。整个项目值得关注的点有三个第一算法门槛不高随机森林不需要 GPU普通 CPU 就能完成训练和预测数据量在万级时训练速度也很快第二不是花架子可以同时用随机森林分类器做预警等级判定也可以扩展随机森林回归算法输出连续风险分两者在教务场景都能落地第三系统整体可分为“特征建模 - 模型训练 - 预警分级 - 接口服务”四个模块核心代码量不大适合课程设计、毕业设计也适合高校信息部门做小规模试点。文章会从业务建模、特征工程、随机森林训练、预警分级、FastAPI 接口、批量任务、性能观察和常见问题排查一步步展开。如果你正在找机器学习方向的项目方案或者想给教务系统加一个预警模块但不知道从哪里下手这篇文章可以直接收藏。1. 核心能力速览在动手之前先看整个系统的能力边界。以下表格基于随机森林算法和教育数据挖掘的通用设计整理具体指标会随数据集、特征数量和参数配置变化部署时需要以实际训练结果为准。能力项说明项目类型机器学习分类/回归 Web 服务应用核心算法随机森林分类器可扩展随机森林回归算法主要功能挂科风险预测、预警等级划分、特征重要性分析、预警名单导出输入数据成绩表、考勤记录、作业提交记录、行为日志等结构化表格硬件要求无需 GPUCPU 即可训练内存建议 8G 以上训练耗时取决于样本量和树数量通常可在分钟级完成启动方式Python 命令启动训练脚本 FastAPI 接口服务是否支持 API支持可提供 HTTP 接口给教务系统或 Web 前端调用是否支持批量任务支持可批量预测一学年全部学生支持定时重跑输出形式预警等级、风险概率、特征重要性排序、CSV/Excel 导出典型场景高校学业预警、辅导员辅助管理、教学质量管理分析随机森林本身不需要独占 GPU这一点让它比深度学习方案更适合高校普通机房部署。整个项目成本主要花在数据清洗和特征工程上算法部分反而比较轻量。2. 学业预警业务建模与预警指标学业预警不是单纯拿“成绩是否及格”做二分类它更关心“未来是否可能挂科”。所以要建立一个可计算的风险模型用过去一段时间的学生行为数据预测未来一个学期或当前学期的挂科风险。2.1 预警业务逻辑一个完整的学生学业预警系统通常包括三层业务逻辑数据层对接教务系统、学工系统、考勤系统拿到学生的基础信息、选课信息、成绩信息、考勤信息、奖惩信息等。模型层对原始数据进行特征加工构造训练样本训练随机森林模型输出每个学生的挂科风险概率。应用层根据风险概率把学生划分为正常、关注、预警、严重预警等级生成预警学生名单推送给辅导员或教学管理人员。2.2 预警等级定义预警等级通常由业务方定义这里给出一套常见的五级划分方案也可以按实际教务规则调整。预警等级风险概率范围干预建议无预警0 ~ 0.3不需要干预关注0.3 ~ 0.5辅导员谈话了解情况一般预警0.5 ~ 0.7安排学业指导较重预警0.7 ~ 0.85通知家长组织一对一辅导严重预警0.85 ~ 1.0启动多部门联合帮扶2.3 预警类型划分除了总风险等级还可以把预警分成不同类型方便采取针对性措施学业成绩预警预测期末挂科概率较高通常结合平时成绩、作业完成情况判断。考勤预警缺勤次数显著偏高随机森林可以捕捉“考勤负面行为与挂科的相关性”。学习状态预警图书馆进出频次很低、实验报告拖欠次数多、在线学习平台活跃度下降都属于行为特征。综合预警多个维度特征叠加后风险概率超过阈值。3. 随机森林算法选型与模型设计随机森林是 Bagging 集成算法的代表由多棵决策树投票或平均得到最终结果。它在教育数据挖掘里表现稳定原因主要有几点对表格数据效果好不需要像神经网络那样做复杂的特征缩放。能输出特征重要性帮助学校知道“哪些因素对挂科影响最大”。对缺失值和异常值不敏感能容忍教务数据常见的不完整问题。不容易过拟合配合交叉验证可得到稳定的评估指标。3.1 随机森林分类器与随机森林回归算法的取舍这里有一个关键选择。如果业务目标是“输出预警等级”属于分类问题使用随机森林分类器from sklearn.ensemble import RandomForestClassifier model RandomForestClassifier( n_estimators300, max_depth10, min_samples_leaf5, random_state42 )如果业务目标是“输出 0 到 100 的连续风险分”属于回归问题使用随机森林回归算法from sklearn.ensemble import RandomForestRegressor model RandomForestRegressor( n_estimators300, max_depth10, min_samples_leaf5, random_state42 )实际落地时我建议训练一个分类模型做等级输出同时利用分类模型的predict_proba()得到概率值既能看到等级又能看到连续风险分一个模型覆盖两个业务需求。如果你们学校已经定义了一套精确到小数点后两位的风险指数并且希望追踪分数变化趋势那再单独训练一个回归模型也不迟。3.2 为什么不用 XGBoost 或神经网络XGBoost 在多数表格任务上精度会优于随机森林但它的调参成本更高容易在数据量小时过拟合。神经网络需要 GPU 和更大的数据规模在几百到几千条训练样本的学生数据上反而不稳定。学业预警系统的价值更多在于“快速跑通、规则可解释、业务可落地”随机森林在这三点上均衡性最好。3.3 模型评估设计评估随机森林模型时主要看这几个指标准确率所有预测里预测正确的比例适合等级均匀的情况。精确率和召回率重点关注“预警学生”这一类更看重召回率因为漏报一位高危学生比误报一位普通学生代价更大。F1-score精确率和召回率的调和平均。AUC反映模型对正负样本的区分能力AUC 在 0.85 以上说明模型有较好区分度。4. 环境准备与前置条件因为随机森林不依赖 GPU环境准备非常轻量。下面是建议的技术栈依赖版本建议用途Python3.9 ~ 3.11主开发语言pandas2.x数据处理numpy1.24数值计算scikit-learn1.2随机森林模型FastAPI0.100接口服务uvicorn0.23ASGI 服务SQLAlchemy2.x数据库操作MySQL / SQLite5.7 / 自带学生数据存储安装核心依赖pip install pandas numpy scikit-learn fastapi uvicorn sqlalchemy pymysql openpyxl如果你只需要本地跑通训练流程SQLite 就够了不需要额外安装数据库服务。如果要对接学校现有的教务系统再改成 MySQL 连接串。以下训练和接口代码均以 SQLite 为例。5. 数据准备与特征工程特征工程是这个项目最重要的环节。算法再好如果输入特征没有区分度预警结果也会失真。5.1 原始数据设计假设从教务系统导出以下三张表学生基础信息表字段说明student_id学号student_name姓名gender性别major专业grade年级成绩表字段说明student_id学号course_name课程名称course_type课程性质如必修、选修score期末成绩gpa学分绩点semester开课学期考勤行为表字段说明student_id学号attendance_rate出勤率absences缺勤次数late_count迟到次数assignment_submit_rate作业提交率library_visits图书馆入馆次数5.2 特征构造原始表不能直接喂给模型需要按学生聚合加工。常用的特征如下历史平均成绩所有已修课程的平均分。历史挂科数过往不及格课程数量这是强预测特征。上学期 GPA最近一学期平均绩点。出勤率本学期当前出勤率。缺勤次数本学期累计缺勤次数。作业提交率作业按时提交占比。课程选修数量本学期选课门数判断学习负荷是否过重。波动系数历史成绩标准差衡量成绩稳定性。专业差异编码不同专业课程难度不同用 LabelEncoder 编码。性别和年级有时会有一定的相关性可保留观察。聚合处理示例import pandas as pd def build_features(score_df, student_df, attendance_df): # 按学生聚合成绩特征 score_group score_df.groupby(student_id).agg( avg_score(score, mean), min_score(score, min), fail_count(score, lambda x: (x 60).sum()), gpa_mean(gpa, mean) ).reset_index() # 合并考勤行为特征 merged student_df.merge(score_group, onstudent_id, howleft) merged merged.merge(attendance_df, onstudent_id, howleft) # 缺失值处理没有历史成绩的新生用整体均值填充 feature_cols [avg_score, min_score, fail_count, gpa_mean, attendance_rate, absences, late_count, assignment_submit_rate, library_visits] merged[feature_cols] merged[feature_cols].fillna(merged[feature_cols].mean()) return merged注意一点特征里的fail_count如果用“本学期的挂科数”来预测“本学期的挂科风险”会造成数据泄漏。实际设计时要保证训练样本的特征只来自历史学期预测目标是未来学期不能用当前学期结果做特征。6. 随机森林模型训练与评估6.1 训练样本标签生成假设我们要预测学生“下学期是否有挂科风险”将下学期任意一门课程不及格记为 1否则记为 0。用上学期及以前的数据构造特征用下学期结果构造标签。from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import classification_report, roc_auc_score import pandas as pd # features是特征表label是目标列 X features.drop([student_id, student_name, is_risk], axis1) y features[is_risk] # 划分训练集和测试集 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy ) # 训练随机森林模型 model RandomForestClassifier( n_estimators300, max_depth12, min_samples_split10, min_samples_leaf4, class_weightbalanced, random_state42, n_jobs-1 ) model.fit(X_train, y_train) # 评估 y_pred model.predict(X_test) y_proba model.predict_proba(X_test)[:, 1] print(classification_report(y_test, y_pred)) print(AUC:, roc_auc_score(y_test, y_proba))6.2 输出模型特征重要性随机森林最实用的一个能力是输出特征重要性学校管理者可以直接看到影响学业风险的主要因素import numpy as np importance_df pd.DataFrame({ feature: X.columns, importance: model.feature_importances_ }).sort_values(importance, ascendingFalse) print(importance_df)典型的结果可能是特征重要性历史挂科数0.28上学期 GPA0.21出勤率0.15作业提交率0.12历史平均成绩0.10缺勤次数0.08这个结果可以直接拿来写数据可视化报表也可以指导学校后续重点抓哪些环节。6.3 使用随机森林回归算法输出风险分如果需要输出 0 到 100 分连续风险分可以在同一套特征上训练回归模型from sklearn.ensemble import RandomForestRegressor # 假设 risk_score 是由业务规则计算出的连续值 reg_features X reg_target features[risk_score] reg_model RandomForestRegressor( n_estimators300, max_depth12, min_samples_leaf5, random_state42, n_jobs-1 ) reg_model.fit(X_train, y_train)不过从实际使用角度出发我更推荐直接用分类模型的predict_proba()得到风险概率然后乘 100 映射为风险分这样模型只需要维护一套逻辑也更简单。6.4 调参顺序随机森林调参有一个比较稳妥的顺序先固定n_estimators100确定max_depth和min_samples_leaf的数量级。再逐步增大n_estimators观察 AUC 是否还在提升。如果训练数据正负样本不平衡优先调整class_weightbalanced。使用交叉验证代替单次划分评估结果更稳定。from sklearn.model_selection import GridSearchCV param_grid { n_estimators: [100, 200, 300], max_depth: [8, 10, 12], min_samples_leaf: [2, 4, 6] } grid GridSearchCV( RandomForestClassifier(class_weightbalanced, random_state42), param_grid, cv5, scoringroc_auc, n_jobs-1 ) grid.fit(X_train, y_train) print(best params:, grid.best_params_) print(best auc:, grid.best_score_)网格搜索在数据量较大时会比较吃 CPU建议先用小规模样本跑通流程再放到全量数据上执行。7. 预警分级与名单生成模型预测出风险概率后还要把它转成业务可用的预警名单。这里定义一个分级函数def get_warning_level(prob): if prob 0.3: return 无预警 elif prob 0.5: return 关注 elif prob 0.7: return 一般预警 elif prob 0.85: return 较重预警 else: return 严重预警批量生成预警名单result features[[student_id, student_name, major]].copy() result[risk_prob] model.predict_proba(X)[:, 1] result[warning_level] result[risk_prob].apply(get_warning_level) # 按风险概率从高到低排序 result result.sort_values(risk_prob, ascendingFalse) # 导出Excel result.to_excel(warning_list.xlsx, indexFalse) print(result.head(20))名单导出后辅导员可以按“严重预警”“较重预警”优先处理。系统不要只发一个名单就结束了还应该在名单里保留每个学生的关键特征值比如挂科数、出勤率、最近一学期 GPA方便干预时有据可依。8. 接口 API 与批量任务设计训练好的模型不能只停留在本地脚本里要落地成服务供前端或教务系统调用。8.1 保存模型import joblib joblib.dump(model, random_forest_model.pkl) joblib.dump(feature_columns, feature_columns.pkl)8.2 FastAPI 接口服务from fastapi import FastAPI from pydantic import BaseModel import pandas as pd import joblib app FastAPI(title学业预警系统预测接口) model joblib.load(random_forest_model.pkl) feature_columns joblib.load(feature_columns.pkl) class StudentItem(BaseModel): student_id: str avg_score: float min_score: float fail_count: int gpa_mean: float attendance_rate: float absences: int late_count: int assignment_submit_rate: float library_visits: int class BatchRequest(BaseModel): students: list[StudentItem] app.post(/predict) def predict(item: StudentItem): data pd.DataFrame([item.dict()]) # 只保留模型训练时使用的特征列 X data[feature_columns] prob model.predict_proba(X)[0, 1] level get_warning_level(prob) return { student_id: item.student_id, risk_prob: round(prob, 4), warning_level: level } app.post(/predict_batch) def predict_batch(req: BatchRequest): rows [item.dict() for item in req.students] data pd.DataFrame(rows) X data[feature_columns] proba model.predict_proba(X)[:, 1] result [] for i, row in data.iterrows(): level get_warning_level(proba[i]) result.append({ student_id: row[student_id], risk_prob: round(proba[i], 4), warning_level: level }) return {results: result} def get_warning_level(prob): if prob 0.3: return 无预警 elif prob 0.5: return 关注 elif prob 0.7: return 一般预警 elif prob 0.85: return 较重预警 else: return 严重预警启动接口服务uvicorn main:app --host 0.0.0.0 --port 80008.3 curl 调用示例批量预测接口调用示例curl -X POST http://127.0.0.1:8000/predict_batch \ -H Content-Type: application/json \ -d { students: [ { student_id: 2021001, avg_score: 72.5, min_score: 58, fail_count: 2, gpa_mean: 2.3, attendance_rate: 0.82, absences: 6, late_count: 4, assignment_submit_rate: 0.75, library_visits: 5 }, { student_id: 2021002, avg_score: 86.0, min_score: 78, fail_count: 0, gpa_mean: 3.6, attendance_rate: 0.98, absences: 0, late_count: 0, assignment_submit_rate: 0.96, library_visits: 30 } ] }8.4 定时批量预警任务实际业务中通常每个月或每学期结束时批量跑一次预警。可以用计划任务或while True定时器实现import time import pandas as pd import joblib model joblib.load(random_forest_model.pkl) def run_warning_task(): # 从数据库读取最新数据 df pd.read_sql(SELECT * FROM student_features, conengine) # 生成预警名单 proba model.predict_proba(df[feature_columns])[:, 1] df[risk_prob] proba df[warning_level] df[risk_prob].apply(get_warning_level) # 保存结果 df.to_sql(warning_result, conengine, if_existsreplace, indexFalse) print(预警任务执行完成:, time.strftime(%Y-%m-%d %H:%M:%S)) # 每小时执行一次实际部署建议用cron或APScheduler while True: run_warning_task() time.sleep(3600)批量任务一定要记录日志、加失败重试。模型预测本身很稳定但数据库连接和网络波动可能导致任务中断建议把“读取数据”“模型预测”“结果写入”三个阶段分别打日志。9. 数据库与 Web 管理端设计如果要把系统做成可交付的完整项目建议先建好数据库表结构。下面是一份最小可运行的 SQL 设计。CREATE TABLE student_info ( student_id VARCHAR(20) PRIMARY KEY, student_name VARCHAR(50), gender VARCHAR(10), major VARCHAR(100), grade VARCHAR(10) ); CREATE TABLE course_score ( id INTEGER PRIMARY KEY AUTOINCREMENT, student_id VARCHAR(20), course_name VARCHAR(100), semester VARCHAR(20), score DECIMAL(5,2), gpa DECIMAL(3,2) ); CREATE TABLE attendance_record ( student_id VARCHAR(20), semester VARCHAR(20), attendance_rate DECIMAL(5,2), absences INTEGER, late_count INTEGER, assignment_submit_rate DECIMAL(5,2) ); CREATE TABLE warning_result ( student_id VARCHAR(20), risk_prob DECIMAL(5,4), warning_level VARCHAR(20), update_time DATETIME );Web 管理端建议至少包含四个页面数据导入页支持上传 Excel 成绩表和考勤表。预警总览页以卡片形式展示各级预警人数用柱状图展示不同专业预警比例。学生详情页展示单个学生的历史成绩曲线、关键特征值、风险概率和预警等级。预警名单导出页按专业、年级、预警等级筛选后导出 Excel。整体架构可以简单勾勒为数据采集 - 特征加工 - 随机森林模型 - FastAPI 接口 - Web 管理端。其中特征加工和模型训练是核心前端只需要把接口结果展示出来即可。10. 功能测试与效果验证系统开发完成后不能只看模型训练精度还要从业务角度做验证。建议准备一份测试用例清单测试功能输入数据预期结果判断标准单条预测学生特征 JSON返回风险概率和预警等级概率需在 0~1 之间等级与阈值区间一致批量预测两个学生特征返回两条结果与本地脚本预测结果一致空数据处理缺失项填 0 或 NULL不报错有合理输出检查代码填充逻辑边界值测试风险概率恰好为 0.5返回“关注”或“一般预警”中的明确等级阈值边界判断需与业务确认全学期预警单学期全部学生生成完整预警名单名单人数占比合理严重预警比例不超过 5% 左右接口稳定性连续调用 100 次无超时、无报错检查接口日志模型效果验证时还有一个容易被忽略的点要对比“随机森林预测结果”和“人工经验规则”的重合度。学校辅导员通常有自己的一套经验判断标准如果模型给出的高危学生名单和辅导员心里预期的名单重合度很低就要检查特征是否选对、数据是否有误。模型不是替代人工判断而是帮人工从全部学生中圈定最需要关注的名单缩小排查范围。11. 资源占用与性能观察随机森林的资源占用主要集中在训练阶段推理阶段非常快这也是它适合做预警服务的原因。11.1 内存占用随机森林需要把多棵决策树同时存在内存中。树的数量越多、深度越深、特征越多模型文件越大内存占用也随之上升。比如一个 200 棵树、深度 12 的模型在几万条样本上模型文件大小通常在几十 MB 到上百 MB单机 8G 内存足够支撑。观察内存占用可以在训练和预测时手动查看import os import psutil process psutil.Process(os.getpid()) print(当前内存占用:, process.memory_info().rss / 1024 / 1024, MB)11.2 训练耗时观察数据规模和参数对训练耗时有直接影响。可以用 Python 的time模块记录训练时间import time start time.time() model.fit(X_train, y_train) print(训练耗时:, round(time.time() - start, 2), 秒)如果训练耗时太长优先降低n_estimators和max_depth而不是换机器。对学业预警这类业务来说300 棵树和 100 棵树的精度差异通常不大但耗时和内存占用差异明显。11.3 CPU 推理与批量预测随机森林推理不需要 GPU单个学生特征的预测时间在毫秒级批量预测一万名学生也只需要几秒到十几秒。因此不必为这个项目采购 GPU 服务器普通云主机或机房 PC 就能支撑整个学期的预警任务。部署服务时的性能建议接口服务所在机器建议 2 核 4G 以上。训练脚本和接口服务最好分开避免训练时占用大量 CPU 影响接口响应。批量任务尽量安排在凌晨或非高峰时段执行。接口服务加一层lru_cache对相同特征的重复查询直接返回缓存结果。11.4 显存随机森林算法不涉及 GPU 显存。如果后续扩展了深度神经网络模型做特征提取才需要考虑显存问题。在纯随机森林的学业预警系统中这一项可以忽略。12. 常见问题与排查方法这套系统在开发和部署时最常见的问题集中在数据处理和模型训练环节。下面整理了一份排查清单。问题现象可能原因排查方式解决方案模型训练报错特征数量不一致训练集和测试集特征列不一致打印X.columns和X_test.columns用训练时的feature_columns统一取列预测结果全是正常正负样本严重不平衡且未做处理查看y.value_counts()设置class_weightbalanced或对预警样本过采样特征重要性最高的列是学号学号被当成数值特征参与训练检查特征列列表去除student_id等标识列预测概率明显偏高使用了当前学期的挂科数作为特征检查特征构造时间窗口只用历史学期特征不能使用未来信息接口返回 500输入 JSON 缺字段或类型错误查看 FastAPI 日志确认前端传参和后端StudentItem定义一致中文学生姓名导出乱码Excel 写入编码问题检查导出文件编码使用openpyxl引擎或不使用旧版xlsxwriter训练耗时太长树数量或深度设置过大查看训练日志减少n_estimators或max_depth先跑小规模测试新数据没有历史成绩大一新生数据不完整查看缺失值统计用整体均值或同类专业均值填充标记“新生”类别数据库连接失败数据库服务未启动或连接串错误执行ping和连接测试检查 MySQL 服务状态和 URL 参数批量任务卡住数据量过大或死锁查看任务日志占用率分批次预测每次处理 1000 条加超时控制这里特别提醒一个问题如果你从教务系统导出的成绩表里同一门课程有补考、重修、缓考等多条记录聚合统计时一定要先明确口径。比如“历史挂科数”是只算首次考试不及格还是补考后仍不及格才算不同口径会直接影响模型标签的准确性。建议在特征工程阶段把口径写清楚避免后续回溯时数据对不上。13. 最佳实践与合规提醒学业预警系统涉及学生个人信息和学业隐私开发和使用时要注意以下几点。13.1 数据合规学生的成绩、考勤、行为记录属于个人敏感信息系统开发和测试阶段应使用脱敏后的模拟数据。训练模型时学号和姓名只用于结果关联不能进入模型特征。预警名单的访问权限要严格控制只允许辅导员和相关管理人员查看。系统上线前需要完成校内数据安全审查明确数据保存周期和销毁机制。13.2 效果复核预警结果只是辅助参考不能直接作为学生处分或评优的依据。每次批量预警后建议随机抽 10% 名单由辅导员人工复核持续积累反馈数据。模型需要定期重训建议每学期结束后用最新数据重新训练一次避免政策变化或教学改革导致模型失效。13.3 项目工程化建议把所有特征构造逻辑封装成函数保证训练脚本和接口服务使用同一套处理逻辑。模型文件按日期命名保留历史版本方便回滚。用pandas处理数据时统一使用copy()避免链式赋值警告。接口服务设置超时和并发限制防止晚高峰时被大量请求压垮。写一个train_pipeline.py汇总脚本一键完成“读取数据 - 特征构造 - 训练 - 保存模型 - 生成报告”。# train_pipeline.py 执行示例 python train_pipeline.py --config config.yaml14. 总结与下一步这套“基于随机森林算法的大学生学业预警系统”最值得尝试的点在于它把随机森林算法比较完整地应用到了教育管理场景既有特征工程、模型训练、效果评估的技术内容又有接口开发、批量任务、名单导出的工程内容是一个麻雀虽小五脏俱全的机器学习项目。建议第一次实现时先从“历史挂科数 上学期 GPA 出勤率 作业提交率”这四个特征开始训练跑通端到端流程之后再逐步加入图书馆行为、在线学习平台活跃度等扩展特征。最容易踩的坑不是随机森林参数调不好而是特征泄漏和时间窗口切分错误一定要先想清楚“用什么时间段的特征预测什么时间段的目标”。下一步可以往这几个方向扩展一是用 SHAP 值替代随机森林自带的重要性给出每个学生挂科风险上升的具体原因解释二是接入在线学习平台的行为日志增加多维特征三是把预警系统做成定时自动运行的守护服务每个学期自动输出预警名单并推送给辅导员。整体来说这个项目具备完整的教学价值和落地潜力动手写起来不算复杂但能把数据处理、模型训练和系统开发串在一起值得认真做一遍。建议收藏备用后面做模型调优或系统扩展时可以直接对照本文的方案来改。
返回列表