基于机器学习预测岗位薪资

本文根据某招聘网站抓取的岗位信息,来预测该岗位平均薪资。

数据预处理

数据示例如下:

因为本文重点介绍如何实现预测,因此对于数据的预处理部分讲解一下处理逻辑:

1、统一薪资的单位,要么统一为年薪(万/千),要么统一为月薪(万/千);

2、将薪资的上下限分割成两列数据,然后求得其平均值;

3、对其他文字性数据进行独热编码(one-hot),参考独热编码(One-Hot Encoding)-CSDN博客;

4、由于是预测每个岗位的平均薪资,因此针对采集下来的岗位需要分开处理一下,我这里以预测“前端开发”岗位为例。

预处理后数据示例如下:

可以看到,第一列为平均薪资(我这里是年薪-万为单位),然后有工作地点、公司规模、工作经验、学历四个特征的独热编码。独热编码的逻辑就是:假如公司规模的类型有三种,分别是50人以下,50-100人,100人以上,那么将这三种类型分为三列,然后1代表有,0代表无。其他特征的编码按照这个逻辑以此类推。

线性回归预测

使用sklearn导包,数据总共1W+,训练80%,测试20%,代码示例如下:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error
from sklearn.model_selection import GridSearchCV
import numpy as npdata = pd.read_csv('../input_data/test.csv', encoding='latin1')
output_path = '../output_data/LinearRegression/test/'# 提取特征和标签
features = data.drop('avg_salary', axis=1)
labels = data['avg_salary']# 拆分训练集和测试集 -- 训练80%,测试20%
train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size=0.2, random_state=42)# 创建线性回归模型
model = LinearRegression()# 定义超参数搜索空间
param_grid = {'fit_intercept': [True, False],'copy_X': [True, False],'n_jobs': [-1, 1, 2],'positive': [True, False]
}# 使用网格搜索进行超参数调优
grid_search = GridSearchCV(estimator=model, param_grid=param_grid, scoring='neg_mean_squared_error', cv=5)
grid_search.fit(train_features, train_labels)# 获取最佳模型和参数
best_model = grid_search.best_estimator_
best_params = grid_search.best_params_# 对测试集进行预测
predictions = best_model.predict(test_features)# 保存预测结果和标签
results = pd.DataFrame({'Label': test_labels, 'Pred': predictions})
results.to_csv(output_path + 'result.csv', index=False)# 评估模型性能
mse = mean_squared_error(test_labels, predictions)
mae = mean_absolute_error(test_labels, predictions)
r2 = r2_score(test_labels, predictions)
rmse = np.sqrt(mse)# 四舍五入保留4位小数
mse = round(mse, 4)
mae = round(mae, 4)
r2 = round(r2, 4)
rmse = round(rmse, 4)# 创建包含评估结果的数据帧
result_df = pd.DataFrame({'Metric': ['MSE', 'MAE', 'R2 Score','RMSE'],'Value': [mse, mae, r2, rmse]})
# 保存为CSV文件
result_df.to_csv(output_path + 'evaluate.csv', index=False)print("MSE: {:.4f}".format(mse))
print("MAE: {:.4f}".format(mae))
print("R2 Score: {:.4f}".format(r2))
print("RMSE: {:.4f}".format(rmse))

决策树预测

from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
import pandas as pd
import numpy as npdata = pd.read_csv('../input_data/test.csv', encoding='latin1')
output_path = '../output_data/DecisionTreeRegressor/test/'# 提取特征和标签
features = data.drop('avg_salary', axis=1)
labels = data['avg_salary']# 拆分训练集和测试集 -- 训练80%,测试20%
train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size=0.2, random_state=42)# 创建决策树回归模型
model = DecisionTreeRegressor()# 定义超参数搜索空间
param_grid = {'criterion': ['mse', 'friedman_mse', 'mae'],  # 分割质量的评估准则'max_depth': [None, 5, 10],  # 决策树的最大深度'min_samples_split': [2, 5, 10],  # 内部节点再划分所需的最小样本数'min_samples_leaf': [1, 2, 4]  # 叶节点上所需的最小样本数
}# 使用网格搜索进行超参数调优
grid_search = GridSearchCV(estimator=model, param_grid=param_grid, scoring='neg_mean_squared_error', cv=5)
grid_search.fit(train_features, train_labels)# 获取最佳模型和参数
best_model = grid_search.best_estimator_
best_params = grid_search.best_params_# 对测试集进行预测
predictions = best_model.predict(test_features)# 保存预测结果和标签
results = pd.DataFrame({'Label': test_labels, 'Pred': predictions})
results.to_csv(output_path + 'result.csv', index=False)# 评估模型性能
mse = mean_squared_error(test_labels, predictions)
mae = mean_absolute_error(test_labels, predictions)
r2 = r2_score(test_labels, predictions)
rmse = np.sqrt(mse)# 四舍五入保留4位小数
mse = round(mse, 4)
mae = round(mae, 4)
r2 = round(r2, 4)
rmse = round(rmse, 4)# 创建包含评估结果的数据帧
result_df = pd.DataFrame({'Metric': ['MSE', 'MAE', 'R2 Score','RMSE'],'Value': [mse, mae, r2, rmse]})
# 保存为CSV文件
result_df.to_csv(output_path + 'evaluate.csv', index=False)print("MSE: {:.4f}".format(mse))
print("MAE: {:.4f}".format(mae))
print("R2 Score: {:.4f}".format(r2))
print("RMSE: {:.4f}".format(rmse))

随机森林预测

from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
import pandas as pd
import numpy as npdata = pd.read_csv('../input_data/test.csv', encoding='latin1')
output_path = '../output_data/RandomForestRegressor/test/'# 提取特征和标签
features = data.drop('avg_salary', axis=1)
labels = data['avg_salary']# 拆分训练集和测试集 -- 训练80%,测试20%
train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size=0.2, random_state=42)# 创建随机森林回归模型
model = RandomForestRegressor()# 定义超参数搜索空间
param_grid = {'n_estimators': [100, 200, 300],  # 决策树的数量'max_depth': [None, 5, 10],  # 决策树的最大深度'min_samples_split': [2, 5, 10],  # 内部节点再划分所需的最小样本数'min_samples_leaf': [1, 2, 4],  # 叶节点上所需的最小样本数'max_features': ['auto', 'sqrt']  # 寻找最佳分割时要考虑的特征数量
}# 使用网格搜索进行超参数调优
grid_search = GridSearchCV(estimator=model, param_grid=param_grid, scoring='neg_mean_squared_error', cv=5)
grid_search.fit(train_features, train_labels)# 获取最佳模型和参数
best_model = grid_search.best_estimator_
best_params = grid_search.best_params_# 对测试集进行预测
predictions = best_model.predict(test_features)# 保存预测结果和标签
results = pd.DataFrame({'Label': test_labels, 'Pred': predictions})
results.to_csv(output_path + 'result.csv', index=False)# 评估模型性能
mse = mean_squared_error(test_labels, predictions)
mae = mean_absolute_error(test_labels, predictions)
r2 = r2_score(test_labels, predictions)
rmse = np.sqrt(mse)# 四舍五入保留4位小数
mse = round(mse, 4)
mae = round(mae, 4)
r2 = round(r2, 4)
rmse = round(rmse, 4)# 创建包含评估结果的数据帧
result_df = pd.DataFrame({'Metric': ['MSE', 'MAE', 'R2 Score','RMSE'],'Value': [mse, mae, r2, rmse]})
# 保存为CSV文件
result_df.to_csv(output_path + 'evaluate.csv', index=False)print("MSE: {:.4f}".format(mse))
print("MAE: {:.4f}".format(mae))
print("R2 Score: {:.4f}".format(r2))
print("RMSE: {:.4f}".format(rmse))

评估结果

由于我使用的是基本模型,没有怎么去设置参数以及特征优化等操作,导致结果并没有那么理想,大家可以根据需要去完善模型。

数据拟合可视化

示例100条的数据拟合情况(从下标第2000行开始)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/615661.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【员工培训体系的建立】使用培训积分制:量化培训效果

该公园希望通过定期培训来帮助员工获取有效信息和先进技术成果,不断提高员工的综合素质,适应新形势的需要,并且管理者逐步认识到,不应把现代公园的人员培训所产生人力资本的再生产视为一种消费,而应视为一种投资&#…

Android 四大组件启动

service: startService启动过程分析 - Gityuan博客 | 袁辉辉的技术博客 在整个startService过程,从进程角度看服务启动过程 Process A进程:是指调用startService命令所在的进程,也就是启动服务的发起端进程,比如点击桌面App图标…

3.Godot节点编辑操作及类的继承关系

1. 节点的父子关系 在层级树中,对象 (节点) 呈树形显示,一个节点下面,也可以下挂子节点 1 添加两个对象 2 拖拽一个对象到另一个对象,成为子对象 (子节点) 3 移动父对象、旋转父对象,观察可以发现,当父对…

【操作系统专题】计算机系统概述

🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 前言1.基本构成2.微处理器…

MYSQL原理学习篇简记(二)

👏作者简介:大家好,我是小周同志,25届双非校招生Java选手,很高兴认识大家 📕学习出处:本文是学自小林coding (xiaolincoding.com) 网站的MYSQL图解篇 🔥如果感觉博主的文章还不错的…

使用idea运行程序,发现控制台的中文出现乱码

修改UTF-8发现没有效果,寻找.idea文件夹的encodings.xml文件,将里面的UTF-8全部变成GBK.

数据结构——单链表(C语言版)

文章目录 一、链表的概念及结构二、单链表的实现SList.h链表的打印申请新的结点链表的尾插链表的头插链表的尾删链表的头删链表的查找在指定位置之前插入数据在指定位置之后插入数据删除pos结点删除pos之后的结点销毁链表 三、完整源代码SList.hSList.ctest.c 一、链表的概念及…

Ubuntu 22上安装Anaconda3。下载、安装、验证详细教程

在Ubuntu 22上安装Anaconda3,你可以遵循以下步骤: 更新系统存储库: 打开终端并运行以下命令来更新系统存储库: sudo apt update安装curl包: 下载Anaconda安装脚本通常需要使用curl工具。如果系统中没有安装curl&#x…

基于单链表实现通讯管理系统!(有完整源码!)

​ 个人主页:秋风起,再归来~ 文章专栏:C语言实战项目 个人格言:悟已往之不谏,知来者犹可追 克心守己,律己则安! 1、前言 友友们,这篇文章是基于单链…

ARM单片机的GPIO口在控制不同LED、按键时的设置

个人备忘,不喜勿喷。 GPIO口在驱动共阴极、共阳极LED灯时需要不同的初始化设置 对于这一类的led灯: 最好选择推挽、上拉、高速输出,同时IO口初始化时需要拉高。 上面这种需要下拉输入; 上图这种需要上拉输入,这样才…

MySQL基础知识——MySQL事务

事务背景 什么是事务? 一组由一个或多个数据库操作组成的操作组,能够原子的执行,且事务间相互独立; 简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。 注:MyS…

Tomcat启动闪退的10个解决小技巧

引言 大家好!在我们日常开发中,使用Tomcat作为Web服务器是相当常见的。 然而,遇到Tomcat启动后立即闪退的问题也不是什么稀罕事。 这种情况可能会让人感到困惑和沮丧,特别是当你急需完成一个项目或者修复一个重要的bug时。 不过…