🤵♂️ 个人主页:@艾派森的个人主页
✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+
喜欢大数据分析项目的小伙伴,希望可以多多支持该系列的其他文章
大数据分析案例-基于随机森林算法预测人类预期寿命 |
大数据分析案例-基于随机森林算法的商品评价情感分析 |
大数据分析案例-用RFM模型对客户价值分析(聚类) |
大数据分析案例-对电信客户流失分析预警预测 |
大数据分析案例-基于随机森林模型对北京房价进行预测 |
大数据分析案例-基于RFM模型对电商客户价值分析 |
大数据分析案例-基于逻辑回归算法构建垃圾邮件分类器模型 |
大数据分析案例-基于决策树算法构建员工离职预测模型 |
大数据分析案例-基于KNN算法对茅台股票进行预测 |
大数据分析案例-基于多元线性回归算法构建广告投放收益模型 |
大数据分析案例-基于随机森林算法构建返乡人群预测模型 |
大数据分析案例-基于决策树算法构建金融反欺诈分类模型 |
目录
1.项目背景
2.项目简介
2.1项目说明
2.2数据说明
2.3技术工具
3.算法原理
4.项目实施步骤
4.1理解数据
4.2数据预处理
4.3探索性数据分析
4.3.1各个大学的平均薪资
4.3.2平均薪资最高的前十名岗位
4.3.3平均薪资最低的前十名岗位
4.3.4每年的平均薪资水平
4.4特征工程
4.5模型构建
4.6特征重要性
4.7模型预测
5.实验总结
源代码
1.项目背景
随着高等教育的普及和社会经济的发展,大学毕业生就业成为社会关注的焦点之一。对于大学毕业生而言,选择何种专业和职业路径往往会直接影响其未来的职业发展和薪资水平。因此,通过构建一个能够预测大学毕业生薪资的模型,可以为学生提供更明智的职业规划和决策支持,也能为用人单位提供更科学的人才招聘依据。
决策树算法因其简单、易解释、能够处理非线性关系等特点,在数据挖掘和机器学习领域得到了广泛应用。通过构建基于决策树的大学毕业生薪资预测模型,可以充分利用该算法对各种变量之间复杂关系的建模能力,实现对薪资水平的准确预测。
当前社会,大学毕业生的就业形势具有多样性和复杂性,受到多方面因素的影响,包括但不限于所学专业、学历水平、实习经验、地理位置、行业需求等。因此,借助决策树算法进行大学毕业生薪资预测,有助于深入挖掘各种影响因素之间的关系,为个体制定更为个性化的职业规划提供科学依据。
此外,通过对毕业生薪资的预测,还能够为高校提供有针对性的培养方案,更好地迎合社会对各类专业人才的需求,促进教育与用人需求的对接。同时,用人单位在招聘时也能更准确地评估不同专业和背景的毕业生的薪资水平,提高用人效率。
综上所述,基于决策树算法构建大学毕业生薪资预测模型,既符合当前社会对高等教育与就业关系深度对接的需求,也为个体和社会提供了更为准确的信息和决策支持。
2.项目简介
2.1项目说明
本实验旨在对2009年-2020年各大学各学院的毕业生平均薪资数据进行分析挖掘,这一研究有望在提高大学毕业生职业发展水平、促进高校与用人单位合作、优化人才流动与分配等方面发挥积极作用。
2.2数据说明
数据来源于Kaggle,原始数据共有14470行,6个变量,各变量含义如下:
Year:年份
Name:名称
Primary Job Title:主要岗位名称
Base Pay:基本薪资
Department:学院
College:大学
2.3技术工具
Python版本:3.9
代码编辑器:jupyter notebook
3.算法原理
决策树( Decision Tree) 又称为判定树,是数据挖掘技术中的一种重要的分类与回归方法,它是一种以树结构(包括二叉树和多叉树)形式来表达的预测分析模型。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。一般,一棵决策树包含一个根节点,若干个内部结点和若干个叶结点。叶结点对应于决策结果,其他每个结点对应于一个属性测试。每个结点包含的样本集合根据属性测试的结果划分到子结点中,根结点包含样本全集,从根结点到每个叶结点的路径对应了一个判定的测试序列。决策树学习的目的是产生一棵泛化能力强,即处理未见示例强的决策树。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。
决策树的构建
特征选择:选取有较强分类能力的特征。
决策树生成:典型的算法有 ID3 和 C4.5, 它们生成决策树过程相似, ID3 是采用信息增益作为特征选择度量, 而 C4.5 采用信息增益比率。
决策树剪枝:剪枝原因是决策树生成算法生成的树对训练数据的预测很准确, 但是对于未知数据分类很差, 这就产生了过拟合的现象。涉及算法有CART算法。
决策树的划分选择
熵:物理意义是体系混乱程度的度量。
信息熵:表示事物不确定性的度量标准,可以根据数学中的概率计算,出现的概率就大,出现的机会就多,不确定性就小(信息熵小)。
决策树的剪枝
剪枝:顾名思义就是给决策树 "去掉" 一些判断分支,同时在剩下的树结构下仍然能得到不错的结果。之所以进行剪枝,是为了防止或减少 "过拟合现象" 的发生,是决策树具有更好的泛化能力。
具体做法:去掉过于细分的叶节点,使其回退到父节点,甚至更高的节点,然后将父节点或更高的叶节点改为新的叶节点。
剪枝的两种方法:
预剪枝:在决策树构造时就进行剪枝。在决策树构造过程中,对节点进行评估,如果对其划分并不能再验证集中提高准确性,那么该节点就不要继续王下划分。这时就会把当前节点作为叶节点。
后剪枝:在生成决策树之后再剪枝。通常会从决策树的叶节点开始,逐层向上对每个节点进行评估。如果剪掉该节点,带来的验证集中准确性差别不大或有明显提升,则可以对它进行剪枝,用叶子节点来代填该节点。
注意:决策树的生成只考虑局部最优,相对地,决策树的剪枝则考虑全局最优。
4.项目实施步骤
4.1理解数据
首先导入本次实验用到的第三方库和数据
查看数据大小
查看数据基本信息
查看数值型变量描述性统计
查看非数值型变量描述性统计
4.2数据预处理
统计数据的缺失值情况
从结果可以发现原始数据集并不存在缺失值,故不需要处理
检测原始数据中是否存在重复值
从结果发现为False,说明不存在重复值,故不需要处理
4.3探索性数据分析
4.3.1各个大学的平均薪资
4.3.2平均薪资最高的前十名岗位
4.3.3平均薪资最低的前十名岗位
4.3.4每年的平均薪资水平
4.4特征工程
这里需要进行编码处理
4.5模型构建
首先拆分数据集为测试集和训练集,测试集比例为0.2
定义一个评估模型的函数
构建线性回归模型
构建决策树模型
构建GBDT模型
4.6特征重要性
4.7模型预测
从图中可以看出,模型预测的效果好不错。
5.实验总结
通过基于决策树算法的大学毕业生薪资预测模型的构建和研究,我们深入探讨了影响毕业生薪资水平的多种因素之间的复杂关系。该模型不仅在预测准确性上表现出色,而且具有良好的可解释性,有助于为大学生提供更科学的职业规划建议,同时为用人单位提供更精准的招聘决策支持。
在实验中,通过决策树算法,我们成功地建立了一个能够捕捉这些信息之间关系的模型,从而实现了对毕业生薪资的准确预测。模型的优势在于它不仅能够对每个因素的重要性进行排序,还能够直观地呈现各个决策节点,为决策者提供了清晰的决策路径。
总体而言,基于决策树算法的大学毕业生薪资预测模型为高校、毕业生和用人单位提供了一个有力的决策工具,有助于实现更加精准的人才匹配,推动高等教育与职业市场更好地协同发展。未来的研究可以进一步探索模型的泛化能力和适应性,以应对变化多端的就业市场和职业发展环境。
心得与体会:
通过这次Python项目实战,我学到了许多新的知识,这是一个让我把书本上的理论知识运用于实践中的好机会。原先,学的时候感叹学的资料太难懂,此刻想来,有些其实并不难,关键在于理解。
在这次实战中还锻炼了我其他方面的潜力,提高了我的综合素质。首先,它锻炼了我做项目的潜力,提高了独立思考问题、自我动手操作的潜力,在工作的过程中,复习了以前学习过的知识,并掌握了一些应用知识的技巧等
在此次实战中,我还学会了下面几点工作学习心态:
1)继续学习,不断提升理论涵养。在信息时代,学习是不断地汲取新信息,获得事业进步的动力。作为一名青年学子更就应把学习作为持续工作用心性的重要途径。走上工作岗位后,我会用心响应单位号召,结合工作实际,不断学习理论、业务知识和社会知识,用先进的理论武装头脑,用精良的业务知识提升潜力,以广博的社会知识拓展视野。
2)努力实践,自觉进行主角转化。只有将理论付诸于实践才能实现理论自身的价值,也只有将理论付诸于实践才能使理论得以检验。同样,一个人的价值也是透过实践活动来实现的,也只有透过实践才能锻炼人的品质,彰显人的意志。
3)提高工作用心性和主动性。实习,是开端也是结束。展此刻自我面前的是一片任自我驰骋的沃土,也分明感受到了沉甸甸的职责。在今后的工作和生活中,我将继续学习,深入实践,不断提升自我,努力创造业绩,继续创造更多的价值。
这次Python实战不仅仅使我学到了知识,丰富了经验。也帮忙我缩小了实践和理论的差距。在未来的工作中我会把学到的理论知识和实践经验不断的应用到实际工作中,为实现理想而努力。
源代码
import pandas as pd
import matplotlib.pylab as plt
import numpy as np
import seaborn as sns
sns.set(font='SimHei')
plt.rcParams['font.sans-serif'] = ['SimHei'] #解决中文显示
plt.rcParams['axes.unicode_minus'] = False #解决符号无法显示
import warnings
warnings.filterwarnings('ignore')data = pd.read_csv('大学薪资数据集.csv') # 加载数据集
data.head() # 查看数据前五行
data.shape
data.info()
data.describe()
data.describe(include='O')
data.isnull().sum()
any(data.duplicated())
# 各个大学的平均薪资
data.groupby('College')['Base Pay'].mean().plot(kind='bar')
plt.title('各个大学的平均薪资')
plt.show()
# 平均薪资最高的前十名岗位
data.groupby('Primary Job Title')['Base Pay'].mean().sort_values(ascending=False).head(10)[::-1].plot(kind='barh')
plt.title('平均薪资最高的前十名岗位')
plt.xlabel('平均薪资')
plt.show()
# 平均薪资最低的前十名岗位
data.groupby('Primary Job Title')['Base Pay'].mean().sort_values(ascending=False).tail(10)[::-1].plot(kind='barh')
plt.title('平均薪资最低的前十名岗位')
plt.xlabel('平均薪资')
plt.show()
# 每年的平均薪资水平
data.groupby('Year')['Base Pay'].mean().plot()
plt.title('每年平均薪资折线图')
plt.ylabel('平均薪资')
plt.show()
# 特征工程-编码处理
from sklearn.preprocessing import LabelEncoder
for col in data.describe(include='O').columns.to_list():data[col] = LabelEncoder().fit_transform(data[col])
data.head()
from sklearn.model_selection import train_test_split
# 准确数据
data['Base Pay'] = data['Base Pay'].astype(dtype='int')
X = data.drop('Base Pay',axis=1)
y = data['Base Pay']
# 划分数据集
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=42)
print('训练集大小:',X_train.shape[0])
print('测试集大小:',X_test.shape[0])
from sklearn.metrics import r2_score,mean_absolute_error,mean_squared_errordef 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)
# 决策树回归
from sklearn.tree import DecisionTreeRegressor
tree = DecisionTreeRegressor()
train_model(tree)
# GBDT
from sklearn.ensemble import GradientBoostingRegressor
gbdt = GradientBoostingRegressor()
train_model(gbdt)
#打印特征重要性评分
feat_labels = X_train.columns[0:]
importances = gbdt.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 = tree.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 People',fontdict={'weight': 'normal', 'size': 15})
plt.ylabel('value of Salary',fontdict={'weight': 'normal', 'size': 15})
plt.show()