大数据分析案例-基于随机森林模型的机器学习工程师岗位薪资预测

🤵‍♂️ 个人主页:@艾派森的个人主页

✍🏻作者简介:Python学习者

🐋 希望大家多多支持,我们一起进步!😄

如果文章对你有帮助的话,

欢迎评论 💬点赞👍🏻 收藏 📂加关注+


喜欢大数据分析项目的小伙伴,希望可以多多支持该系列的其他文章

|----------------------------------------------------------------------------------------------------------------------------|
| 大数据分析案例-基于随机森林算法预测人类预期寿命 |
| 大数据分析案例-基于随机森林算法的商品评价情感分析 |
| 大数据分析案例-用RFM模型对客户价值分析(聚类) |
| 大数据分析案例-对电信客户流失分析预警预测 |
| 大数据分析案例-基于随机森林模型对北京房价进行预测 |
| 大数据分析案例-基于RFM模型对电商客户价值分析 |
| 大数据分析案例-基于逻辑回归算法构建垃圾邮件分类器模型 |
| 大数据分析案例-基于决策树算法构建员工离职预测模型 |
| 大数据分析案例-基于KNN算法对茅台股票进行预测 |
| 大数据分析案例-基于多元线性回归算法构建广告投放收益模型 |
| 大数据分析案例-基于随机森林算法构建返乡人群预测模型 |
| 大数据分析案例-基于决策树算法构建金融反欺诈分类模型 |
[大数据分析案例合集]


目录

1.项目背景

2.项目简介

2.1项目说明

2.2数据说明

2.3技术工具

3.算法原理

4.项目实施步骤

4.1理解数据

4.2数据预处理

4.3探索性数据分析

4.4特征工程

4.5模型构建

4.6模型评估

4.7模型预测

5.实验总结

源代码


1.项目背景

在当今信息爆炸的时代,数据驱动的决策已成为企业运营的常态。特别是在人力资源领域,如何准确预测某一岗位的薪资水平,不仅关系到企业的招聘策略,也直接影响到员工的满意度和企业的整体运营效率。机器学习工程师岗位,作为人工智能和大数据领域的核心职业,其薪资水平更是受到广泛关注。

机器学习工程师的薪资水平受到多种因素的影响,如地区经济发展、企业规模、个人工作经验、技能水平等。传统的薪资预测方法往往基于经验和简单的统计模型,难以全面考虑各种复杂因素之间的相互作用和影响。因此,我们需要一种更为先进、准确的预测方法,以更好地指导企业招聘和人才管理。

随机森林模型作为一种集成学习算法,以其高准确率、鲁棒性强、能够处理非线性关系等优点,在机器学习和数据挖掘领域得到了广泛应用。它通过构建多个决策树并对结果进行集成,可以充分考虑数据中的复杂关系和噪声,从而提高预测的准确性。因此,我们选择随机森林模型作为机器学习工程师岗位薪资预测的工具,旨在通过深入挖掘和分析各种影响因素,为薪资预测提供更加科学、准确的依据。

2.项目简介

2.1项目说明

本实验将通过收集机器学习工程师岗位的薪资数据,构建基于随机森林模型的薪资预测系统。我们将利用历史数据对模型进行训练和优化,并通过交叉验证等方法评估模型的性能。最终,我们将利用训练好的模型对新的数据进行预测,为企业招聘和人才管理提供有价值的参考。通过本实验的研究,我们期望能够为企业提供更准确的薪资预测服务,同时也为机器学习领域的薪资研究提供新的思路和方法。

2.2数据说明

本实验数据集来源于Kaggle,原始数据集中共有16494条数据,11个变量,各变量含义如下:

work_year:收集薪资数据的年份(例如,2024 年)。

experience_level:员工的经验水平(例如,MI 表示中级)。

employment_type:就业类型(例如,FT 表示全职)。

job_title:职位名称(例如数据科学家)。

salary:工资金额。

salary_currency:工资的计价货币(例如,USD 代表美元)。

salary_in_usd:转换为美元的工资金额。

employee_residence:员工居住的国家/地区(例如,AU 代表澳大利亚)。

Remote_ratio:表示远程工作级别的比率(0 表示无远程工作)。

company_location:公司的位置(例如,AU 代表澳大利亚)。

company_size:公司的规模(例如,S 表示小型)。

2.3技术工具

Python版本:3.9

代码编辑器:jupyter notebook

3.算法原理

随机森林是一种有监督学习算法。就像它的名字一样,它创建了一个森林,并使它拥有某种方式随机性。所构建的"森林"是决策树的集成,大部分时候都是用"bagging"方法训练的。bagging 方法,即 bootstrapaggregating,采用的是随机有放回的选择训练数据然后构造分类器,最后组合学习到的模型来增加整体的效果。简而言之,随机森林建立了多个决策树,并将它们合并在一起以获得更准确和稳定的预测。其一大优势在于它既可用于分类,也可用于回归问题,这两类问题恰好构成了当前的大多数机器学习系统所需要面对的。

随机森林分类器使用所有的决策树分类器以及 bagging 分类器的超参数来控制整体结构。与其先构建 bagging分类器,并将其传递给决策树分类器,我们可以直接使用随机森林分类器类,这样对于决策树而言,更加方便和优化。要注意的是,回归问题同样有一个随机森林回归器与之相对应。

随机森林算法中树的增长会给模型带来额外的随机性。与决策树不同的是,每个节点被分割成最小化误差的最佳指标,在随机森林中我们选择随机选择的指标来构建最佳分割。因此,在随机森林中,仅考虑用于分割节点的随机子集,甚至可以通过在每个指标上使用随机阈值来使树更加随机,而不是如正常的决策树一样搜索最佳阈值。这个过程产生了广泛的多样性,通常可以得到更好的模型。

4.项目实施步骤

4.1理解数据

导入数据分析第三方库并加载数据集

查看数据集大小

查看数据基本信息

查看数值型变量的描述性统计

查看非数值型变量的描述性统计

4.2数据预处理

统计数据集缺失值情况

统计数据集重复值情况

从结果中可以看出原始数据集不存在缺失值,但存在6401个重复数据。

删除重复数据

4.3探索性数据分析

-工资分布似乎是右偏的,长尾倾向于更高的工资。

-大部分人的工资在101,000 - 186,000美元之间。

-工资中位数约为14.13万美元,这表明有一半的工资高于/低于此值。

-有一些异常值的薪水很高,这可能需要进一步调查。

在前20名中,最常见的职位是数据工程师,这表明对该职位的需求很高。

其他突出的职位包括数据科学家、数据分析师和机器学习工程师,这表明它们在数据集中的重要性。

排名前20的职位出现的频率各不相同,有些职位的出现频率明显高于其他职位。

中型企业的平均工资和中位数在这三类企业中是最高的。

大公司的平均工资和中位数是第二高的。

小公司的平均工资和中位数最低。

所有公司规模的工资中位数都低于平均工资,这表明工资分布略有右倾斜(即,有一些高异常值将平均值向上拉)。

按工资中位数对经验等级排序

首先,我们根据他们的工资中位数对经验水平进行排名。这让我们初步了解了不同经验水平的薪水是如何不同的。

输出结果显示,经验等级排序如下:

EX(行政人员),平均工资为18万美元

SE(高级),工资中位数为165,000美元

MI(中级),工资中位数为129,900美元

EN(入门级),工资中位数为85,750美元

4.4特征工程

删除无关的变量

对非数值型变量进行编码处理

查看薪资分布

为了提高模型准确率,这里我们剔除掉薪资大于400000的数据

准备建模数据,并拆分数据集为训练集和测试集

4.5模型构建

为了选择并评估模型,这里我们自定义一个函数

构建线性回归模型

构建KNN回归模型

构建决策树模型

构建随机森林模型

构建GBDT模型

我们以模型准确率和R方值为评价指标,可以看出决策树的准确率最高,随机森林排第二高,但是随机森林模型的R方比决策树大的多,所以综合评价,我们最终选择随机森林模型作为最终模型。

4.6模型评估

打印随机森林模型的特征重要性

可以看出,岗位名称、经验水平、员工住址的重要程度最大。

4.7模型预测

5.实验总结

经过对机器学习工程师岗位薪资的随机森林模型预测实验,我们得到了令人满意的结果。实验成功构建了一个基于随机森林算法的薪资预测模型,该模型能够综合考虑地区、企业规模、个人工作经验和技能水平等多种影响因素,为机器学习工程师岗位的薪资水平提供了较为准确的预测。

在模型训练和优化过程中,我们利用了丰富的历史数据,通过交叉验证等方法对模型性能进行了全面评估。结果显示,模型在预测精度和稳定性方面都表现出色,能够较好地拟合实际数据中的复杂关系和噪声。

通过本实验,我们验证了随机森林模型在薪资预测领域的有效性,并为企业招聘和人才管理提供了新的思路和工具。企业可以利用该模型快速准确地预测不同条件下机器学习工程师的薪资水平,从而制定更加科学合理的招聘策略,提高人才引进的效率和效果。

此外,本实验也为机器学习领域的薪资研究提供了新的视角和方法。通过深入分析各种影响因素与薪资水平之间的关系,我们可以更好地理解人才市场的运作机制,为人才培养和职业发展提供更加科学的指导。

总之,本实验在机器学习工程师岗位薪资预测方面取得了积极的成果,不仅为企业提供了实用的工具和方法,也为机器学习领域的薪资研究开辟了新的方向。我们期待未来能够进一步拓展和完善该模型,为更多领域的人才管理和薪资预测提供有力支持。

心得与体会:

通过这次Python项目实战,我学到了许多新的知识,这是一个让我把书本上的理论知识运用于实践中的好机会。原先,学的时候感叹学的资料太难懂,此刻想来,有些其实并不难,关键在于理解。

在这次实战中还锻炼了我其他方面的潜力,提高了我的综合素质。首先,它锻炼了我做项目的潜力,提高了独立思考问题、自我动手操作的潜力,在工作的过程中,复习了以前学习过的知识,并掌握了一些应用知识的技巧等

在此次实战中,我还学会了下面几点工作学习心态:

1)继续学习,不断提升理论涵养。在信息时代,学习是不断地汲取新信息,获得事业进步的动力。作为一名青年学子更就应把学习作为持续工作用心性的重要途径。走上工作岗位后,我会用心响应单位号召,结合工作实际,不断学习理论、业务知识和社会知识,用先进的理论武装头脑,用精良的业务知识提升潜力,以广博的社会知识拓展视野。

2)努力实践,自觉进行主角转化。只有将理论付诸于实践才能实现理论自身的价值,也只有将理论付诸于实践才能使理论得以检验。同样,一个人的价值也是透过实践活动来实现的,也只有透过实践才能锻炼人的品质,彰显人的意志。

3)提高工作用心性和主动性。实习,是开端也是结束。展此刻自我面前的是一片任自我驰骋的沃土,也分明感受到了沉甸甸的职责。在今后的工作和生活中,我将继续学习,深入实践,不断提升自我,努力创造业绩,继续创造更多的价值。

这次Python实战不仅仅使我学到了知识,丰富了经验。也帮忙我缩小了实践和理论的差距。在未来的工作中我会把学到的理论知识和实践经验不断的应用到实际工作中,为实现理想而努力。

源代码

python 复制代码
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")

df = pd.read_csv("salaries.csv")
df.head()
df.shape
df.info()
df.describe()
df.describe(include='O')
df.isnull().sum()
df.duplicated().sum()
df.drop_duplicates(inplace=True)
df.duplicated().sum()
# 工资分布直方图
plt.figure(figsize=(8, 6))
sns.histplot(data=df, x='salary_in_usd', kde=True)
plt.title('Distribution of Salaries (USD)')
plt.xlabel('Salary (USD)')
plt.ylabel('Frequency')
plt.show()
-工资分布似乎是右偏的,长尾倾向于更高的工资。
-大部分人的工资在101,000 - 186,000美元之间。
-工资中位数约为14.13万美元,这表明有一半的工资高于/低于此值。
-有一些异常值的薪水很高,这可能需要进一步调查。
# 前20个职位标题的条形图
top_20_titles = df['job_title'].value_counts().head(20)
# 为排名前20的职位创建一个条形图
plt.figure(figsize=(12, 6))
plt.bar(top_20_titles.index, top_20_titles.values)
plt.xlabel('Job Title')
plt.ylabel('Count')
plt.title('Top 20 Job Titles')
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
plt.show()
该柱状图揭示了以下见解:
在前20名中,最常见的职位是数据工程师,这表明对该职位的需求很高。
其他突出的职位包括数据科学家、数据分析师和机器学习工程师,这表明它们在数据集中的重要性。
排名前20的职位出现的频率各不相同,有些职位的出现频率明显高于其他职位。
# 职位名称词云
top_20_titles = df['job_title'].value_counts().head(20)
title_counts = dict(top_20_titles)
from wordcloud import WordCloud
wordcloud = WordCloud(width=800, height=400, background_color='white').generate_from_frequencies(title_counts)
plt.figure(figsize=(10, 6))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.title('Top 20 - Job Title Word Cloud')
plt.show()
# 前10名职位树图-树状图使用嵌套的矩形来表示每个职位的相对频率。
job_title_counts = df['job_title'].value_counts().head(10)
import squarify
plt.figure(figsize=(12, 6))
squarify.plot(sizes=job_title_counts, label=job_title_counts.index, alpha=0.8)
plt.axis('off')
plt.title('Job Title Treemap')
plt.show()
# 公司规模分析
# 变量
size=df['company_size']
salary=df['salary_in_usd']

#公司规模
print("Value Counts by Company Size:")
company_size_counts = df['company_size'].value_counts()
print(company_size_counts)

# 计算组均值和中位数
print("Mean Salaries by Company Size:")
print(df.groupby('company_size')['salary_in_usd'].mean().to_string(index=True))
print("\nMedian Salaries by Company Size:")
print(df.groupby('company_size')['salary_in_usd'].median().to_string(index=True))

#散点图
plt.figure(figsize=(16, 6))
plt.scatter(salary,size)
plt.xlabel('Salary in USD')
plt.ylabel('Company Size')
plt.title('Salary vs. Company Size')
plt.show()

#箱型图
plt.figure(figsize=(10, 6))
box_plot_data = [df[df['company_size'] == size]['salary_in_usd'] for size in ['S', 'M', 'L']]
box_plot = plt.boxplot(box_plot_data, patch_artist=True)
colors = ['lightblue', 'lightgreen', 'pink']
for patch, color in zip(box_plot['boxes'], colors):
    patch.set_facecolor(color)
plt.xticks([1, 2, 3], ['Small', 'Medium', 'Large'])
plt.xlabel('Company Size')
plt.ylabel('Salary (USD)')
plt.title('Salary Distribution by Company Size')
plt.legend(box_plot['boxes'], ['Small', 'Medium', 'Large'], title='Company Size', loc='upper right')
plt.show()
中型企业的平均工资和中位数在这三类企业中是最高的。
大公司的平均工资和中位数是第二高的。
小公司的平均工资和中位数最低。
所有公司规模的工资中位数都低于平均工资,这表明工资分布略有右倾斜(即,有一些高异常值将平均值向上拉)。
# 按经验水平分析工资分配
# 计算每个经验级别的工资中位数
experience_salaries = df.groupby('experience_level')['salary_in_usd'].median().reset_index()
# 按工资中位数降序排序经验水平
experience_salaries_sorted = experience_salaries.sort_values('salary_in_usd', ascending=False)
# 将经验等级与原始数据合并
df_Ranked = pd.merge(df, experience_salaries_sorted, on='experience_level')
# 创建了一个字典,将经验等级映射到他们的等级
experience_rank = {'EN': 0, 'MI': 1, 'SE': 2, 'EX': 3}
df['experience_rank'] = df['experience_level'].map(experience_rank)
print("Experience Levels Ranked by Median Salary:")
print(experience_salaries_sorted)
plt.figure(figsize=(10, 6))
sns.boxplot(data=df, x='experience_level', y='salary_in_usd')
plt.title('Salary Distribution by Experience Level')
plt.xlabel('Experience Level')
plt.ylabel('Salary (USD)')
plt.xticks([0, 1, 2, 3], ['EN', 'MI', 'SE', 'EX'])
plt.show()
按工资中位数对经验等级排序¶
首先,我们根据他们的工资中位数对经验水平进行排名。这让我们初步了解了不同经验水平的薪水是如何不同的。
输出结果显示,经验等级排序如下:
EX(行政人员),平均工资为18万美元
SE(高级),工资中位数为165,000美元
MI(中级),工资中位数为129,900美元
EN(入门级),工资中位数为85,750美元
# 按经验水平及受雇类别划分的薪金分布
plt.figure(figsize=(12, 6))
sns.set_color_codes("pastel")
sns.barplot(x='experience_level', y='salary_in_usd', hue='employment_type', data=df,)
plt.title('Salary Distribution by Experience Level and Employment Type')
plt.xlabel('Experience Level')
plt.ylabel('Salary (USD)')
plt.legend(title='Employment Type')
plt.show()
# 历年按经验水平划分的平均工资
plt.figure(figsize=(10, 6))
sns.lineplot(data=df, x='work_year', y='salary_in_usd', hue='experience_level', estimator='mean', ci=None)
plt.title('Average salaries by level of experience over the years')
plt.xlabel('Year')
plt.ylabel('Salary (USD)')
plt.legend(title='Experience level', labels=['EN', 'MI', 'SE', 'EX'])
plt.show()
# 历年的薪资趋势
plt.figure(figsize=(10, 6))
sns.lineplot(data=df, x='work_year', y='salary_in_usd', estimator='mean', ci=None)
plt.title('Salary trends over the years')
plt.xlabel('Year')
plt.ylabel('Salary (USD)')
plt.show()
# 按公司规模划分的历年平均工资
plt.figure(figsize=(10, 6))
df.groupby(['work_year', 'company_size'])['salary_in_usd'].mean().unstack().plot(kind='line', marker='o')
plt.title('Average Salaries by Company Size Over the Years')
plt.xlabel('Year')
plt.ylabel('Average salary (USD)')
plt.legend(title='Company size')
plt.show()
# 相关性分析
numeric_columns = df.select_dtypes(include=['number'])
correlation_matrix = numeric_columns.corr()
plt.figure(figsize=(12, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt=".2f", linewidths=0.5)
plt.title('Correlation Matrix')
plt.show()
df.head()
new_df = df.drop(['salary','salary_currency'],axis=1)
new_df.head()
from sklearn.preprocessing import LabelEncoder

for col in new_df.describe(include='O'):
    new_df[col] = LabelEncoder().fit_transform(new_df[col])
new_df.head()
sns.boxplot(data=new_df,y='salary_in_usd')
new_df = new_df[new_df['salary_in_usd']<400000]
from sklearn.model_selection import train_test_split
X = new_df.drop('salary_in_usd',axis=1)
y = new_df['salary_in_usd']
# 划分数据集
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=42)
import seaborn as sns
import matplotlib.pylab as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #解决中文显示
plt.rcParams['axes.unicode_minus'] = False   #解决符号无法显示
sns.set(font='SimHei')
from sklearn.metrics import r2_score,mean_absolute_error,mean_squared_error
import numpy as np
# 定义一个训练模型并对模型各个指标进行评估的函数
def train_model(ml_model):
    print("Model is: ", ml_model)
    model = ml_model.fit(X_train, y_train)
    print("Training score: ", model.score(X_train,y_train))
    predictions = model.predict(X_test)
    r2score = r2_score(y_test, predictions)
    print("r2 score is: ", r2score)
    print('MAE:', mean_absolute_error(y_test,predictions))
    print('MSE:', mean_squared_error(y_test,predictions))
    print('RMSE:', np.sqrt(mean_squared_error(y_test,predictions)))
    # 真实值和预测值的差值
    sns.distplot(y_test - predictions)
# 构建多元线性回归
from sklearn.linear_model import LinearRegression
lg = LinearRegression()
train_model(lg)
# 构建knn回归
from sklearn.neighbors import KNeighborsRegressor
knn = KNeighborsRegressor()
train_model(knn)
# 构建决策树回归
from sklearn.tree import DecisionTreeRegressor
tree = DecisionTreeRegressor()
train_model(tree)
# 构建随机森林回归
from sklearn.ensemble import RandomForestRegressor
forest = RandomForestRegressor()
train_model(forest)
# GBDT回归
from sklearn.ensemble import GradientBoostingRegressor
gbdt = GradientBoostingRegressor()
train_model(gbdt)
#打印特征重要性评分
feat_labels = X_train.columns[0:]
importances = forest.feature_importances_
indices = np.argsort(importances)[::-1]
index_list = []
value_list = []
for f,j in zip(range(X_train.shape[1]),indices):
    index_list.append(feat_labels[j])
    value_list.append(importances[j])
    print(f + 1, feat_labels[j], importances[j])
plt.figure(figsize=(10,6))
plt.barh(index_list[::-1],value_list[::-1])
plt.yticks(fontsize=12)
plt.title('各特征重要程度排序',fontsize=14)
plt.show()
# 使用随机森林模型预测并可视化
plt.figure(figsize=(10,6))  
y_pred = forest.predict(X_test)
plt.plot(range(len(y_test))[:200],y_pred[:200],'b',label='预测值')
plt.plot(range(len(y_test))[:200],y_test[:200],'r',label='真实值')
plt.legend(loc='upper right',fontsize=15)
plt.xlabel('the number of job',fontdict={'weight': 'normal', 'size': 15})
plt.ylabel('value of salary',fontdict={'weight': 'normal', 'size': 15})
plt.show()
相关推荐
Mopes__1 小时前
Python | Leetcode Python题解之第517题超级洗衣机
python·leetcode·题解
测试老哥3 小时前
Python+Selenium+Pytest+POM自动化测试框架封装(完整版)
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
Ws_3 小时前
蓝桥杯 python day01 第一题
开发语言·python·蓝桥杯
神雕大侠mu4 小时前
函数式接口与回调函数实践
开发语言·python
堇舟4 小时前
斯皮尔曼相关(Spearman correlation)系数
人工智能·算法·机器学习
萧鼎5 小时前
【Python】高效数据处理:使用Dask处理大规模数据
开发语言·python
互联网杂货铺5 小时前
Python测试框架—pytest详解
自动化测试·软件测试·python·测试工具·测试用例·pytest·1024程序员节
yyfhq5 小时前
dcgan
深度学习·机器学习·生成对抗网络
Ellie陈5 小时前
Java已死,大模型才是未来?
java·开发语言·前端·后端·python
菜鸟的人工智能之路5 小时前
ROC 曲线:医学研究中的得力助手
python·数据分析·健康医疗