博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅点击查看作者主页,了解更多项目!
🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅
1、毕业设计:2026年计算机专业毕业设计选题汇总(建议收藏)✅
2、大数据毕业设计:2026年选题大全 深度学习 python语言 JAVA语言 hadoop和spark(建议收藏)✅
🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅
1、项目介绍
技术栈:
python语言、Flask框架、xgboost、前程无忧网站、requests爬虫 决策树回归模型、XGBoost回归模型。
招聘数据分析 爬虫 推荐 薪资预测 机器学习双模型 前程无忧 文档
本项目利用 Python 从前程无忧招聘网站抓取招聘数据,进行数据清洗和格式化后存储到关系型数据库中(如mysql、sqlite等),利用 Flask + Bootstrap + Echarts 搭建招聘信息可视化分析系统,
实现不同岗位的学历要求、工作经验、技能要求、薪资待遇等维度的可视化分析,并根据岗位所在地进行不同地域(华东、华北、华中、华南、西南、西北和东北)维度的细粒度分析。
同时依据用户需求实现热门岗位的推荐,并利用机器学习决策树模型和XGBoost模型的岗位薪资预测。
2、项目界面
(1)岗位行业分析
(2)岗位应聘要求分析
(3)数据中心
(4)词云图分析
(5)高薪行业与岗位推荐
(6)薪资预测
(7)后台管理
(8)数据采集
(9)注册登录
3、项目说明
本项目以 Python 为开发核心,基于 Django 框架搭建后端支撑体系,结合 HTML 构建前端页面结构,集成随机森林分类算法实现核心预测功能,并通过 Echarts 可视化技术呈现数据价值,打造了集岗位数据分析、薪资预测、后台管理于一体的数据驱动型平台。
系统核心功能聚焦数据应用与决策辅助:在数据展示层面,设有数据大屏模块,汇总岗位关键指标并直观呈现;首页介绍页清晰引导用户操作路径;同时通过多维度数据分析可视化模块,以图表形式展示行业岗位需求分布、岗位各项技能占比情况,帮助用户快速把握行业趋势与能力需求。
核心亮点在于岗位薪资预测功能:依托随机森林分类算法,结合岗位类型、技能要求、行业属性等数据维度,为用户提供个性化薪资预测服务 —— 用户输入相关岗位信息后,系统通过算法模型运算生成预测结果,并在 “预测结果” 页面清晰展示,为求职定价或企业薪酬设定提供数据参考。
后台管理模块则承担运营支撑角色,提供数据维护、功能管控等操作入口,保障平台数据准确性与系统稳定运行。整体界面设计以数据呈现为核心,数据大屏信息集中、分析页面图表直观、预测流程简洁、管理界面功能明确,全方位满足用户对岗位数据的查询、分析与预测需求,助力提升求职与企业招聘的决策效率。
一、预测模块
利用机器学习决策树模型和XGBoost模型的岗位薪资预测。
完成了两个机器学习模型的训练和评估:决策树回归模型和XGBoost回归模型。
简要步骤如下:
1、数据预处理:
将类别数据映射为数值数据。
提取目标变量 y 和特征变量 X。
2、导入机器学习库:
导入必要的机器学习库。
3、训练决策树回归模型:
创建决策树回归模型。
划分训练集和测试集。
训练模型并评估性能(MAE 和 R²)。
4、训练 XGBoost 回归模型:
划分训练集和测试集。
创建 XGBoost 回归模型。
训练模型并评估性能(MAE 和 R²)。
5、调用函数:
调用函数训练两个模型。
4、核心代码
defcalc_salary(salary):""" 薪资数值化 """salary=salary.split('·')[0]salary_data=salary.split('-')iflen(salary_data)!=2:returnNone,None,Nonemin_salary,max_salary=salary.split('-')[0],salary.split('-')[1]if'年'insalary:returnNone,None,Noneifmax_salary.endswith('千'):max_scale=1000max_salary=max_salary[:-1]elifsalary.endswith('万'):max_scale=10000max_salary=max_salary[:-1]else:returnNone,None,Noneifmin_salary.endswith('千'):min_scale=1000min_salary=min_salary[:-1]elifmin_salary.endswith('万'):min_scale=10000min_salary=min_salary[:-1]else:min_scale=max_scale# 计算平均薪资max_salary=max_scale*float(max_salary)min_salary=min_scale*float(min_salary)salary=min_salary+max_salary/2returnsalary,min_salary,max_salary# 薪资预测模型sql='select hangye,xueli,city,jingyan,salary from job'conn=sqlite3.connect(DATABASE)cursor=conn.cursor()cursor.execute(sql)jobs=cursor.fetchall()train_datas=[]forjobinjobs:hangye,xueli,city,jingyan,salary=jobifcity+'市'notincity_fenqu_maps:continuefengqu=city_fenqu_maps[city+'市']salary,min_salary,max_salary=calc_salary(salary)ifsalary:train_datas.append([hangye,xueli,fengqu,jingyan,salary])train_datas=pd.DataFrame(train_datas,columns=['hangye','xueli','fengqu','jingyan','salary'])# 行业hangye_mean=train_datas.groupby('hangye')['salary'].mean().reset_index().sort_values(by='salary',ascending=False)all_hangye=hangye_mean['hangye'].values.tolist()# 学历xueli_mean=train_datas.groupby('xueli')['salary'].mean().reset_index().sort_values(by='salary',ascending=False)all_xueli=xueli_mean['xueli'].values.tolist()# 地区fengqu_mean=train_datas.groupby('fengqu')['salary'].mean().reset_index().sort_values(by='salary',ascending=False)all_fengqu=fengqu_mean['fengqu'].values.tolist()# 工作经验jingyan_mean=train_datas.groupby('jingyan')['salary'].mean().reset_index().sort_values(by='salary',ascending=False)all_jingyan=jingyan_mean['jingyan'].values.tolist()hangye_map={hy:ifori,hyinenumerate(all_hangye)}xueli_map={hy:ifori,hyinenumerate(all_xueli)}fengqu_map={hy:ifori,hyinenumerate(all_fengqu)}jingyan_map={hy:ifori,hyinenumerate(all_jingyan)}print(xueli_map)print(hangye_map)print(fengqu_map)print(jingyan_map)# 1、构造决策树机器学习模型train_datas['hangye']=train_datas['hangye'].map(hangye_map)train_datas['xueli']=train_datas['xueli'].map(xueli_map)train_datas['fengqu']=train_datas['fengqu'].map(fengqu_map)train_datas['jingyan']=train_datas['jingyan'].map(jingyan_map)# 导入机器学习库fromsklearn.treeimportDecisionTreeRegressorfromsklearn.metricsimportmean_absolute_error,r2_scorefromsklearn.model_selectionimporttrain_test_split y=train_datas['salary'].valuesdeltrain_datas['salary']deftrain_regr():# 创建回归模型regr=DecisionTreeRegressor(max_depth=19)# 目标变量X=train_datas.values X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=42)print('开始训练决策树回归模型。。。。。')regr.fit(X,y)pred=regr.predict(X)mae=mean_absolute_error(y,pred)r2=r2_score(y,pred)print(f'平均绝对误差MAE:{mae:.3f}元')print(f'拟合优度R^2:{r2:.3f}')returnregr# 2、XGBOOST回归模型deftrain_xgb():# 构建目标变量X=train_datas.values# 划分训练集X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=42)print("开始训练XGBOOST回归模型。。。。。")xgb_models=xgb.XGBRegressor(objective="reg:squarederror",colsample_bytree=0.5,subsample=0.8,learning_rate=0.01,max_depth=10,alpha=10,n_estimators=500,min_child_weight=3,gamma=2,random_state=42)xgb_models.fit(X_train,y_train)pred=xgb_models.predict(X_test)mae=mean_absolute_error(y_test,pred)r2=r2_score(y_test,pred)print(f'平均绝对误差MAE:{mae:.3f}元')print(f'拟合优度R^2:{r2:.3f}')returnxgb_models regr=train_regr()xgb_models=train_xgb()@app.route('/get_selectors')defget_selectors():returnjsonify({'hangye':all_hangye,'xueli':all_xueli,'fengqu':all_fengqu,'jingyan':all_jingyan,})@app.route('/tree_model_predict_salary')deftree_model_predict_salary():"""根据学历,工作经验,求职岗位等预测出对应的薪资情况"""fengqu=request.args.get('fengqu')hangye=request.args.get('hangye')xueli=request.args.get('xueli')jingyan=request.args.get('jingyan')conn=sqlite3.connect(DATABASE)cursor=conn.cursor()check_sql="SELECT * FROM job where hangye='{}' and xueli='{}'".format(hangye,xueli)cursor.execute(check_sql)jobs=cursor.fetchall()hotjobs=[]job_set=set()forjobinjobs:id,job_name,hangye,company,province,city,salary,jingyan,xueli,zhaopin_counts,pub_time=job# job_name, hangye, company, province, city, salary, jingyan, xueli, zhaopin_counts, pub_time = job# 地区筛选if'市'notincity:city=city+'市'ifcitynotincity_fenqu_maps:continueifcity_fenqu_maps[city]!=fengqu:continuetry:tmp=float(jingyan)jingyan='{}年工作经验'.format(jingyan)except:pass# 薪资筛选salary,min_salary,max_salary=calc_salary(salary)ifnotsalary:continueiff'{job_name}-{company}-{salary}-{pub_time}'notinjob_set:hotjobs.append((job_name,hangye,company,province,salary,jingyan,xueli,zhaopin_counts,pub_time))job_set.add(f'{job_name}-{company}-{salary}-{pub_time}')# 选取 top 20 的top_salarys=hotjobs[:20]hangye,xueli,fengqu,jingyan=hangye_map[hangye],xueli_map[xueli],fengqu_map[fengqu],jingyan_map[jingyan]# 模型预测pred_salary=regr.predict(np.array([hangye,xueli,fengqu,jingyan]).reshape(1,-1))pred_salary=pred_salary[0]xgb_pred_salary=xgb_models.predict(np.array([hangye,xueli,fengqu,jingyan]).reshape(1,-1))xgb_pred_salary=xgb_pred_salary[0]returnjsonify({'pred_salary':pred_salary,'recommend_jobs':top_salarys,"xgb_pred_salary":str(xgb_pred_salary)})if__name__=="__main__":app.run(host='127.0.0.1')5、源码获取方式
🍅由于篇幅限制,获取完整文章或源码、代做项目的,查看【用户名】、【专栏名称】就可以找到我啦🍅
感兴趣的可以先收藏起来,点赞、关注不迷路,下方查看👇🏻获取联系方式👇🏻