当前位置: 首页 > news >正文

基于Pandas和FineBI的昆明职位数据分析与可视化实现(五) - 基于随机森林算法预测职位分类

文章目录

  • 一、决策树
    • 1. 什么是决策树?
    • 2. 决策树的结构
    • 3. 决策树的核心思想
    • 4. 决策树的工作流程
    • 5. 决策树的优点
    • 6. 决策树的缺点
    • 7. 决策树的应用场景
    • 8. 总结
  • 二、随机森林
    • 1. 什么是随机森林?
    • 2. 为什么需要随机森林?
    • 3. 随机森林的核心思想
    • 4. 随机森林的工作流程
    • 5. 随机森林的优点
    • 6. 随机森林的缺点
    • 7. 随机森林的应用场景
    • 8. 总结
  • 三、基于随机森林的职位分类预测分析
    • 1. 分析目的
    • 2. 分析步骤及说明
      • 2.1 导入必要的库
      • 2.2 设置支持中文的字体
      • 2.3 加载数据
      • 2.4 数据准备与预处理
      • 2.5 数据划分、模型构建与训练
      • 2.6 模型预测与模型评估
        • 2.6.1 预测准确率
        • 2.6.2 混淆矩阵
        • 2.6.3 分类报告
      • 2.7 数据可视化
        • 2.7.1 混淆矩阵可视化
        • 2.7.2 特征重要性可视化
      • 2.8 主函数整合流程
    • 3. 分析的实际应用
      • 3.1 招聘与人才匹配
      • 3.2 职业规划与发展
      • 3.3 企业战略与人力资源规划
      • 3.4 教育与培训行业
    • 4. 完整代码


一、决策树

1. 什么是决策树?

决策树(Decision Tree)是一种机器学习算法,它的核心思想是:

“一步步做选择,最终得出结论”

  • “选择”:这里的“选择”就是根据数据的特征(比如年龄、收入、天气等)进行判断。
  • “结论”:最终的结果可能是分类(比如“是否买手机”)或回归(比如“预测房价”)。

举个生活中的例子
假设你想决定“今天是否去超市买水果”,可能会这样思考:

  1. 天气是否晴朗?
    • 如果 → 去超市。
    • 如果 → 看是否有快递水果。
      • 如果 → 不去了。
      • 如果没有 → 去超市。

这个思考过程就是一个决策树

2. 决策树的结构

决策树的结构就像一棵倒挂的树:

  • 根节点(Root Node):决策的起点(比如“天气是否晴朗?”)。
  • 内部节点(Internal Node):中间的判断条件(比如“是否有快递水果?”)。
  • 叶节点(Leaf Node):最终的结论(比如“去超市”或“不去超市”)。

图示

      [天气是否晴朗?]/       \是          否/            \
[去超市]     [是否有快递水果?]/       \是         否[不去]    [去超市]

3. 决策树的核心思想

决策树的目标是:

“通过一系列问题(特征),一步步缩小范围,最终得到准确的分类或预测。”

(1)特征选择:如何决定第一个问题?

  • 从所有特征中选择最重要的一个特征作为第一个问题。
  • 比如:预测“是否买手机”,可能选“收入”而不是“性别”,因为收入对购买决策影响更大。

衡量特征重要性的方法

  • 信息增益(Information Gain):信息越混乱(熵越高),分裂后纯度提升越大,特征越重要。
  • 基尼指数(Gini Index):类似信息增益,但计算更简单(越小越好)。

(2)连续值处理:如何处理“年龄”这种连续特征?

  • 将连续值离散化(比如“年龄 < 30”或“年龄 ≥ 30”)。
  • 通过尝试不同的分割点(比如25岁、30岁),选择效果最好的那个

(3)剪枝(Pruning):避免过度复杂

  • 如果树太复杂(分支太多),可能会“死记硬背”训练数据,导致对新数据预测不准(过拟合)。
  • 剪枝就是删除不必要的分支,让树更简单、更稳定。

4. 决策树的工作流程

假设我们要用决策树预测“是否买手机”:

  1. 训练阶段

    • 从数据中学习特征的划分规则(比如“收入 > 5000?”)。
    • 递归地构建树,直到满足停止条件(比如所有样本都属于同一类)。
  2. 预测阶段

    • 对新样本,从根节点开始一步步判断,最终落到某个叶节点,得到预测结果。

5. 决策树的优点

  1. 直观易懂:像流程图一样,可以直接看懂模型的决策逻辑。
  2. 无需复杂预处理:对缺失值和异常值不敏感,甚至可以处理非数值特征。
  3. 速度快:分类和预测效率高。
  4. 适合高维数据:能自动筛选重要特征。

6. 决策树的缺点

  1. 容易过拟合:树太深时可能记住训练数据的噪声,导致泛化能力差。
  2. 对数据敏感:数据微小变化可能导致生成完全不同的树。
  3. 偏向多值特征:如果有特征值很多(比如身份证号),可能被优先选为分裂点。

7. 决策树的应用场景

  1. 分类问题

    • 垃圾邮件检测(判断一封邮件是否是垃圾邮件)。
    • 医学诊断(根据症状预测疾病)。
  2. 回归问题

    • 房价预测(根据面积、位置等预测价格)。
    • 销售预测(预测某商品的销量)。
  3. 其他用途

    • 特征重要性评估(找出哪些因素对结果影响最大)。
    • 异常检测(比如金融欺诈识别)。

8. 总结

  • 决策树 = 一步步提问 + 最终结论
  • 它通过特征选择剪枝,让模型既准确又简单。
  • 适合解决大多数分类和回归问题,是机器学习中非常实用的“基础工具”。

二、随机森林

1. 什么是随机森林?

随机森林(Random Forest)是一种机器学习算法,它的核心思想是:

“让很多专家一起做决定”

  • “专家”:这里的“专家”就是很多棵决策树(Decision Tree)。
  • “一起做决定”:每一棵决策树都会独立地对问题做出判断,最后通过投票(分类问题)或平均(回归问题)的方式,得到最终结果。

2. 为什么需要随机森林?

假设你有一个问题需要解决,比如:

“我今天该穿什么衣服?”

  • 如果你只问一个朋友(一棵决策树),他可能会说:“看天气预报!” 但如果你问很多个朋友(很多棵决策树),每个人根据不同的条件(比如天气、温度、活动类型)给出建议,最后综合大家的意见,结果会更可靠!

随机森林的作用

  1. 减少错误:如果一棵树判断错了,其他树可能能纠正它。
  2. 适应复杂问题:比如处理很多特征(变量)或噪声数据。
  3. 防止过拟合:单棵树可能“死记硬背”训练数据,而随机森林通过多棵树的平均降低这种风险。

3. 随机森林的核心思想

随机森林有两个关键的“随机性”:

(1)随机选样本:Bootstrap抽样

  • 从原始数据中有放回地随机抽取样本,生成多个子数据集(每个子数据集约63%的数据来自原数据)。
  • 比如,你的数据有100条记录,随机抽样生成一个子数据集,可能包含重复的样本(比如某条记录被抽到多次),而另一些样本没有被选中。

(2)随机选特征:特征子集

  • 每棵决策树在分裂节点时,不是考虑所有特征,而是随机选择一部分特征(比如总特征数的一半)。
  • 比如,你要预测房价,特征包括面积、位置、卧室数量、学区等。每棵树可能只随机选其中的2-3个特征来判断。

4. 随机森林的工作流程

假设我们要用随机森林预测“明天是否下雨”:

  1. 生成多棵决策树

    • 从数据中随机抽样(Bootstrap)生成多个子数据集。
    • 对每个子数据集,随机选择一部分特征,训练一棵决策树。
  2. 每棵树独立预测

    • 比如,第一棵树可能根据“湿度”和“风速”判断“下雨”;
    • 第二棵树可能根据“云层厚度”和“温度”判断“不下雨”。
  3. 综合所有树的结果

    • 分类问题(比如下雨/不下雨):统计所有树的预测结果,少数服从多数
    • 回归问题(比如预测房价):取所有树的预测值的平均值

5. 随机森林的优点

  1. 高准确性:通常比单棵决策树表现更好。
  2. 抗干扰能力强:对异常值和噪声数据不敏感。
  3. 适合高维数据:即使有大量特征,也能自动筛选重要特征。
  4. 无需调参太多:默认参数通常就能取得不错的效果。
  5. 可解释性:能计算每个特征的重要性(比如“湿度”对预测下雨的影响最大)。

6. 随机森林的缺点

  1. 模型解释性差:相比单棵决策树,随机森林的判断逻辑更复杂。
  2. 计算资源消耗大:如果数据量很大或树的数量很多,训练时间会变长。
  3. 不适合高维稀疏数据:比如文本分类中的词袋模型(One-Hot编码)可能效果不佳。

7. 随机森林的应用场景

  1. 分类问题

    • 垃圾邮件检测(判断一封邮件是否是垃圾邮件)。
    • 医学诊断(根据症状预测疾病)。
    • 图像分类(识别图片中的物体)。
  2. 回归问题

    • 房价预测(根据面积、位置等预测价格)。
    • 销售预测(预测某商品的销量)。
  3. 其他用途

    • 特征重要性评估(找出哪些因素对结果影响最大)。
    • 异常检测(比如金融欺诈识别)。

8. 总结

  • 随机森林 = 多棵决策树 + 随机性 + 集体决策
  • 它通过随机选样本随机选特征,让每棵树的判断更独立,最终结果更稳定。
  • 适合解决大多数分类和回归问题,是机器学习中非常实用的“万能工具”。

三、基于随机森林的职位分类预测分析

分析流程:开始 → 加载数据 → 准备数据 → 数据预处理 → 划分数据集 → 模型构建 → 模型训练 → 模型预测 → 模型评估 → 数据可视化 → 结果分析 → 结束

1. 分析目的

本代码基于集成学习框架,运用随机森林算法构建职位分类预测模型,旨在解决非结构化招聘文本数据的自动分类问题。研究聚焦于昆明地区职位数据集,通过提取职位名称、公司信息、行业类别和技能要求等多维度特征,构建高准确度的职位一级分类预测模型。研究采用分层评估策略,综合运用准确率、精确率、召回率、F1 分数等指标全面量化模型性能,并通过混淆矩阵可视化分析分类模式,结合特征重要性评估揭示不同特征对分类决策的影响权重,最终形成可解释性强、业务指导性高的职位分类解决方案。

2. 分析步骤及说明

2.1 导入必要的库

本模块构建了完整的数据科学工具链,集成了数值计算、数据处理、可视化和机器学习四大核心功能。NumPy 提供高效的多维数组操作和数学函数支持,是科学计算的基础库;Pandas 基于 NumPy 构建,提供 DataFrame 数据结构,支持高性能数据清洗、转换和分析;Seaborn 和 Matplotlib 组成可视化引擎,前者基于后者封装了更高级的统计图表接口;Scikit-learn 则提供了从数据预处理、模型训练到评估的全流程机器学习工具,包括随机森林算法实现、多种评估指标计算和数据集划分功能。

import numpy as np
import pandas as pd
import seaborn as sns
from matplotlib import pyplot as plt
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder

2.2 设置支持中文的字体

在数据可视化过程中,中文显示问题是常见挑战。本模块通过配置 matplotlib 的字体参数,指定支持中文字符的 SimHei 字体,解决了图表标题、坐标轴标签等位置中文显示乱码的问题。同时设置axes.unicode_minus参数确保负号正确显示,这一配置是生成专业中文可视化图表的基础步骤,为后续模型评估结果的直观展示提供了技术保障。

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

2.3 加载数据

数据加载模块实现了稳健的 CSV 文件读取接口,采用函数式设计模式,通过参数化文件路径支持不同数据集的灵活加载。函数内部调用 pandas 的read_csv方法,默认采用高效的 C 引擎解析文件,自动处理列名识别、数据类型推断等操作。该设计遵循软件工程的单一职责原则,使数据加载与后续处理逻辑解耦,便于代码维护和功能扩展,同时为数据异常处理预留了接口。

def load_data(file_path):"""加载数据集"""return pd.read_csv(file_path)

2.4 数据准备与预处理

特征工程是机器学习建模的关键环节,本模块针对职位分类任务设计了系统的特征处理流程。首先提取职位名称、公司名称、行业类别和技能要求作为核心特征向量,这些文本特征经过标签编码转换为数值表示,使分类算法能够有效处理。标签编码采用 Scikit-learn 的 LabelEncoder 实现,为每个类别分配唯一整数编码,并保留编码映射关系。特别地,代码注释中保留了目标变量编码的实现方案,允许根据模型需求灵活切换编码策略,体现了良好的工程设计思维。

def prepare_data(data):"""准备特征和目标变量"""X = data[['job_name', 'company_name', 'company_industry','skill']].copy()y = data['category_1'].copy()# 对 object 类型数据进行编码categorical_cols = X.select_dtypes(include=['object']).columnsfor col in categorical_cols:le = LabelEncoder()X[col] = le.fit_transform(X[col])# 对目标变量进行编码# le_y = LabelEncoder()# y = le_y.fit_transform(y)return X, y

2.5 数据划分、模型构建与训练

模型训练模块实现了标准的随机森林分类器训练流程,采用分层抽样策略将数据集按 7:3 比例划分为训练集和测试集,并设置固定随机种子确保实验可复现。随机森林参数配置为包含 100 棵决策树的集成模型,采用 Gini 不纯度作为分裂标准,默认启用自助采样 (bootstrap) 技术。该算法通过集成多棵决策树降低了单一决策树的过拟合风险,同时利用特征随机选择机制增强了模型的泛化能力。训练完成的模型将用于后续预测和评估,为职位分类任务提供决策支持。

def train_model(X, y):"""训练随机森林分类器"""# 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 构建并训练模型rf = RandomForestClassifier(n_estimators=100, random_state=42)rf.fit(X_train, y_train)return rf, X_test, y_test

2.6 模型预测与模型评估

模型评估模块构建了多维度的评估体系,全面量化模型性能。首先计算总体预测准确率,作为模型整体性能的基础指标;然后生成多分类混淆矩阵,通过分析对角元素和非对角元素的分布,揭示模型在各类别上的分类效果;进一步计算精确率、召回率和 F1 分数等细分指标,针对每个职位类别进行性能评估。特别地,代码设置zero_division=1参数处理无预测样本的特殊情况,增强了评估过程的鲁棒性。所有评估结果以结构化格式保存到 CSV 文件,既便于后续深入分析,也为跨系统共享提供了标准接口。

def evaluate_model(rf, X_test, y_test, cm_path, report_path):"""评估模型并保存结果"""# 在测试集上进行预测y_pred = rf.predict(X_test)# 计算准确率accuracy = accuracy_score(y_test, y_pred)print(f'随机森林预测职位一级分类的准确率:{accuracy:.4f}')# 混淆矩阵cm = confusion_matrix(y_test, y_pred)cm_df = pd.DataFrame(cm, columns=rf.classes_, index=rf.classes_)cm_df.to_csv(cm_path, index_label='真实标签', encoding='utf-8-sig', mode='w')# 分类报告report = classification_report(y_test, y_pred, zero_division=1)report_df = pd.DataFrame([x.split() for x in report.split('\n')])report_df.to_csv(report_path, index=False, header=False, encoding='utf-8-sig', mode='w')print(report)return y_pred, cm
2.6.1 预测准确率

随机森林预测职位一级分类的准确率为 0.7669,保留两位小数后约为 0.77,这意味着模型在预测职位一级分类上有一定的准确性,但仍有提升空间。
在这里插入图片描述

2.6.2 混淆矩阵

在机器学习和统计学中,用于评估分类模型性能的矩阵。它显示了模型预测结果与实际标签之间的对应关系,可以用于计算准确率、召回率、精确率等指标。

在这里插入图片描述

2.6.3 分类报告

指标解释:

precision(精确率):模型预测为某类别的样本中,实际真正属于该类别的比例,反映预测结果的 “纯度”(如预测为 “产品” 类的职位中,86% 确实是真实的产品类职位)。

recall(召回率):真实属于某类别的样本中,被模型正确预测出来的比例,体现模型 “找全某类别样本” 的能力(如所有真实的 “客服 / 运营” 职位里,88% 被模型成功识别)。

f1-score(F1 分数):精确率和召回率的调和平均数,平衡二者的综合指标,数值越高说明模型在 “精准预测” 和 “找全样本” 间的权衡越好(如 “客服 / 运营” 类 F1=0.85,分类质量较优)。

support(支持数):测试集中真实属于某类别的样本数量,是计算精确率和召回率的基础数据,同时提示数据规模对模型评估结果的影响(如 “产品” 类样本量仅 221,可能导致指标波动更大)。

accuracy(准确率):模型对所有样本的整体预测正确率,即 “预测正确的样本总数 / 总样本数”,反映模型在全部数据上的综合分类能力(如 0.77 代表 77% 的样本被正确分类,总样本量 5293 )。

macro avg(宏平均):对所有类别,分别计算 precision、recall、f1-score 后取算术平均,平等对待每个类别(无论样本量多少),体现模型在 “类别均衡视角” 下的平均性能(如 0.76 是所有类别精确率的平均,0.70 是召回率的平均 )。

weighted avg(加权平均):对所有类别,分别计算 precision、recall、f1-score 后,按类别样本量(support)加权平均,样本多的类别对结果影响更大,更贴合 “真实数据分布” 的综合表现(如样本量大的 “客服 / 运营” 类,会拉高加权后的指标 )。

在这里插入图片描述

这份分类报告呈现了随机森林模型在职位一级分类任务中的多维度性能表现,以下从整体到类别、从指标关联到业务含义展开分析:

一、整体性能(accuracymacro avgweighted avg

  1. accuracy(准确率):0.77
    模型对所有样本的整体预测正确率为 77%,即 5293 条测试样本中约 4076 条分类正确。但因职位类别数据可能存在不平衡(如“客服/运营”样本量 1860 远多于“产品”类 221 ),单一准确率无法完全反映模型对小众类别的分类能力,需结合其他指标分析。

  2. macro avg(宏平均):精确率 0.76、召回率 0.70、F1 分数 0.72
    对所有类别“一视同仁”取平均(不考虑样本量差异 ),体现模型在“类别均衡视角”下的平均表现。精确率、召回率、F1 分数均低于整体准确率,说明样本量少的类别(如“产品”“电子/电气/通信” )拉低了平均水平,模型对小众类别的分类能力弱于大众类别。

  3. weighted avg(加权平均):精确率 0.76、召回率 0.77、F1 分数 0.76
    按类别样本量(support )加权计算的平均,更贴合真实数据分布。因“客服/运营”“互联网/AI”等样本量大的类别指标较好(如“客服/运营”召回率 0.88 ),加权后召回率(0.77 )接近整体准确率,说明模型对“数据多”类别的分类贡献主导了整体结果。

二、类别级性能(分职位类别看 precision/recall/f1-score

  1. 互联网/AI(support=1393,样本量较大 )

    • 精确率 0.71:预测为“互联网/AI”的样本中,71% 确实是真实该类 → 模型对该类的预测“纯度”一般,存在一定误判(如把其他类别误归为互联网/AI )。
    • 召回率 0.77:真实“互联网/AI”职位中,77% 被正确识别 → 漏判率 23%,模型对该类的“覆盖能力”尚可,但仍有优化空间(如补充该类特征、调整分类阈值 )。
    • F1 分数 0.74:精确率与召回率的平衡值,综合表现中等,说明该类分类质量受误判和漏判共同影响。
  2. 产品(support=221,样本量最小 )

    • 精确率 0.86:预测为“产品”的样本中,86% 真实属于该类 → 模型对该类的预测“很准”,误判少(因样本少,模型可能更谨慎预测 )。
    • 召回率 0.58:真实“产品”职位中,仅 58% 被正确识别 → 漏判率高达 42%,是所有类别中召回率最低的 → 因样本量少,模型学习不充分,易把“产品”类误归为其他类别(如互联网/AI )。
    • F1 分数 0.69:受低召回率拖累,综合表现最差 → 需重点优化:可补充“产品”类样本、强化特征工程(突出产品类职位的独特关键词,如“需求文档”“PRD” )。
  3. 客服/运营(support=1860,样本量最大 )

    • 精确率 0.82:预测为“客服/运营”的样本中,82% 真实属于该类 → 误判率 18%,主要是把其他类别(如销售、互联网/AI )误归为该类(因样本多,模型“敢预测”,但也会引入误判 )。
    • 召回率 0.88:真实“客服/运营”职位中,88% 被正确识别 → 漏判率 12%,是所有类别中召回率最高的 → 因样本量大,模型对该类特征学习充分,“找全能力”强。
    • F1 分数 0.85:精确率与召回率平衡最佳,综合表现最优 → 说明模型对“样本多、特征明确”的类别分类效果好,符合业务预期(客服/运营类职位描述通常有明显关键词,如“用户反馈”“流程优化” )。
  4. 电子/电气/通信(support=644,样本量中等 )

    • 精确率 0.63:预测为该类的样本中,仅 63% 真实属于该类 → 误判率高(如把“互联网/AI”类的硬件研发职位误归为该类 ),模型对该类与其他技术类别的区分能力弱。
    • 召回率 0.48:真实该类职位中,仅 48% 被正确识别 → 漏判率 52%,是所有类别中召回率第二低的 → 因该类与“互联网/AI”等技术类别的技能要求有重叠(如都涉及“通信协议”“硬件设计” ),模型易混淆。
    • F1 分数 0.54:综合表现最差(除“产品”类 )→ 需优化特征区分度(如增加“电子电路”“通信标准”等专属关键词,减少与其他类别的特征重叠 )。
  5. 销售(support=1175,样本量中等 )

    • 精确率 0.80:预测为“销售”的样本中,80% 真实属于该类 → 误判率 20%,主要是把“客服/运营”类(如“客户对接”描述 )误归为销售。
    • 召回率 0.78:真实“销售”职位中,78% 被正确识别 → 漏判率 22%,模型对该类的“覆盖能力”中等(因销售类职位描述多样,部分边缘样本易被漏判 )。
    • F1 分数 0.79:综合表现较好,仅次于“客服/运营”类 → 说明模型对“销售”类的特征(如“客户拓展”“业绩指标” )识别较清晰,但仍可通过补充样本、强化关键词优化。

2.7 数据可视化

可视化模块将抽象的评估结果转化为直观的图形表示,便于业务理解和决策。混淆矩阵热力图采用蓝色彩度映射,通过颜色深浅直观展示真实类别与预测类别的匹配情况,同时标注具体数值增强可读性;特征重要性条形图按重要性升序排列,清晰展示各特征对分类决策的贡献程度,帮助业务人员识别关键影响因素。所有图表均保存为 PNG 格式,支持高分辨率输出,同时将特征重要性数据保存为 CSV 文件,为进一步数据分析提供原始数据支持。这种多模态的结果呈现方式,满足了不同用户群体对模型评估结果的需求。

def visualize_results(rf, X, cm, cm_path, fi_path):"""可视化评估结果"""# 混淆矩阵可视化plt.figure(figsize=(10, 7))sns.heatmap(cm, annot=True, fmt='d', cmap='Blues',xticklabels=rf.classes_, yticklabels=rf.classes_)plt.xlabel('预测的标签')plt.ylabel('真正的标签')plt.title('随机森林分类器的混淆矩阵')plt.savefig(cm_path)plt.close()# 特征重要性可视化feature_importances = rf.feature_importances_feature_names = X.columnsindices = np.argsort(feature_importances)# 保存特征重要性到 CSV 文件feature_importances_df = pd.DataFrame({'特征变量': feature_names, '重要性': feature_importances})feature_importances_df.to_csv(fi_path, index=False, encoding='utf-8-sig', mode='w')plt.figure(figsize=(10, 6))plt.title('随机森林分类器的特征重要性')plt.barh(range(len(indices)), feature_importances[indices], align='center')plt.yticks(range(len(indices)), [feature_names[i] for i in indices])plt.xlabel('相对重要性')plt.tight_layout()plt.savefig(fi_path.replace('.csv', '.png'))plt.close()
2.7.1 混淆矩阵可视化

此混淆矩阵直观呈现随机森林分类器在职位一级分类任务中的预测表现,以热力图形式展示真实标签与预测标签的对应关系。矩阵行代表样本真实所属类别(互联网/AI、产品、客服/运营、电子/电气/通信、销售 ),列代表模型预测类别,颜色深浅及数值反映各类别间预测与真实情况的匹配数量:

  • 对角线:展示模型正确分类的样本数。例如,“客服/运营”类别对角线数值1641,说明该类超千条样本被正确识别,是分类效果最好的类别;“互联网/AI”正确分类数1070、“销售”913 ,也体现较好识别能力,但“产品”仅128、“电子/电气/通信”307 ,反映对这两类的正确分类相对薄弱。
  • 非对角线:呈现类别误判情况。如“互联网/AI”有114条样本被误判为“客服/运营”,“电子/电气/通信”有246条误判为“互联网/AI” ,说明技术类职位(互联网/AI 与电子/电气/通信 )特征易混淆;“产品”类32条误判为“互联网/AI” ,因样本量少、特征难区分,导致模型易误归为大众类别。

整体来看,模型对“客服/运营”“销售”等样本量大、特征明确的类别分类更准,对“产品”“电子/电气/通信”等小众或特征模糊类别,误判风险更高,后续可通过补充样本、强化特征区分度优化分类效果。
在这里插入图片描述

2.7.2 特征重要性可视化

特征重要性评分表通过量化数值展示随机森林模型中各特征对职位分类的贡献程度。表格包含两列:特征(job_name、company_name、company_industry、skill)与重要性(对应特征的影响权重)。其中,skill(技能要求)与job_name(职位名称)的重要性值分别为 0.3515 和 0.3514,近乎相等且显著高于其他特征,表明这两类特征是模型分类的核心依据(合计贡献约 70% 的决策权重);company_industry(公司行业)重要性为 0.1612,反映行业标签对分类有一定辅助作用;company_name(公司名称)重要性最低(0.1359),可能因公司名称多样性高、语义指向不明确,导致模型从中提取有效分类信息的能力较弱。此数据为特征工程优化提供明确方向:应优先强化skill与job_name的特征提取(如技能关键词标准化、职位名称规范化处理),同时可考虑对company_industry进行降维或特征组合,提升其分类贡献度。

在这里插入图片描述

特征重要性条形图以直观的可视化方式呈现各特征对职位分类的影响权重差异。图表采用水平条形布局,横轴为重要性评分(范围 0-0.4),纵轴为特征名称(按重要性升序排列)。条形长度与特征重要性成正比,颜色统一为蓝色以避免视觉干扰。从图中可清晰观察到:skill与job_name的条形长度最长且几乎等高,二者构成模型决策的 “双支柱”;company_industry条形长度约为前两者的一半,形成第二梯队;company_name条形最短,与其他特征形成明显区隔。这种可视化不仅验证了表格数据的结论,更通过空间对比突出特征间的相对重要性,帮助业务人员快速把握模型的决策逻辑 —— 职位技能要求和名称是分类的关键驱动因素,而公司信息的影响力有限。此结论可指导后续特征筛选与优化,如针对skill和job_name设计更复杂的特征提取算法,或考虑减少对company_name的依赖以降低计算成本。
在这里插入图片描述

2.8 主函数整合流程

主函数作为整个分析流程的控制中心,采用模块化设计思想,将数据加载、特征工程、模型训练、评估和可视化等独立组件有机整合。通过集中管理文件路径配置,实现了数据流向的清晰定义和结果文件的规范化存储。流程中每个阶段都有明确的状态提示,便于监控执行进度和定位潜在问题。这种设计模式不仅保证了分析过程的可重复性,还为后续功能扩展提供了良好的架构基础,例如增加特征选择策略、集成其他分类算法或实现自动化报告生成等功能,均可在不改变现有代码结构的前提下轻松实现。

if __name__ == "__main__":"""主函数:整合数据处理、模型训练、评估和可视化流程"""# 文件路径配置DATA_PATH = '../data/data_cleaning_result/cleaned_position_dataset.csv'CM_CSV_PATH = '../data/algorithm_analysis_results/confusion_matrix.csv'CM_IMG_PATH = '../data/algorithm_analysis_results/confusion_matrix.png'REPORT_PATH = '../data/algorithm_analysis_results/classification_report.csv'FI_CSV_PATH = '../data/algorithm_analysis_results/feature_importances.csv'FI_IMG_PATH = '../data/algorithm_analysis_results/feature_importances.png'# 数据加载与准备print("正在加载数据...")df = load_data(DATA_PATH)X, y = prepare_data(df)# 模型训练print("正在训练模型...")rf, X_test, y_test = train_model(X, y)# 模型评估print("正在评估模型...")y_pred, cm = evaluate_model(rf, X_test, y_test, CM_CSV_PATH, REPORT_PATH)# 可视化结果print("正在生成可视化结果...")visualize_results(rf, X, cm, CM_IMG_PATH, FI_CSV_PATH)print("分析完成!结果已保存至指定路径。")

3. 分析的实际应用

3.1 招聘与人才匹配

  • 精准岗位推荐:招聘平台可以利用这个模型。当求职者输入自己的工作技能、之前所在公司行业等信息时,平台能基于训练好的模型预测出该求职者适合的职位一级分类,从而为其精准推荐匹配的岗位,提高人岗匹配效率。例如,如果模型预测某求职者适合“互联网/AI”类职位,就可以优先推送相关岗位给该求职者。
  • 筛选候选人:企业招聘人员在面对大量简历时,可以借助该模型对候选人进行初步筛选。根据职位的一级分类要求,快速判断候选人是否大概率符合岗位类别,节省筛选简历的时间和精力。比如对于“电子/电气/通信”类职位,能更准确地找出潜在合适的候选人。

3.2 职业规划与发展

  • 个人职业定位:对于正在考虑职业转型或者刚刚进入职场的人来说,通过输入自己的技能、期望的公司类型等信息,利用模型预测自己可能适合的职位分类,有助于他们更好地进行职业定位和规划。例如,一个对不同领域都有一定涉猎的人,可以通过模型预测了解自己更倾向于“产品”类还是“客服/运营”类工作。
  • 职业技能提升方向:从特征重要性的结果中,个人可以了解到哪些因素对特定职位分类影响较大。比如,如果“skill”(技能)在“互联网/AI”职位分类中特征重要性较高,那么想要进入该领域的人就可以有针对性地提升相关技能。

3.3 企业战略与人力资源规划

  • 人才需求预测:企业可以根据市场上不同职位类别的分布和趋势,结合自身发展战略,预测未来对不同职位类别的人才需求。例如,如果模型显示“互联网/AI”类职位在市场上需求增长,企业若有相关业务拓展计划,就可以提前规划招聘和培养该类人才。
  • 内部人才调配:企业内部在进行组织结构调整或者项目分配时,可以参考模型结果,将员工调配到更符合其能力特征的职位类别中,提高员工的工作满意度和工作效率。比如将具有特定技能的员工从“销售”岗位调配到更匹配的“互联网/AI”类岗位。

3.4 教育与培训行业

  • 专业与课程设置:学校和培训机构可以依据职位分类的需求和各特征的重要性,调整专业和课程设置。例如,如果“电子/电气/通信”类职位对某些特定技能要求较高,就可以在相关专业中加强这些技能课程的教学。
  • 培训内容定制:针对不同职业目标的学员,定制个性化的培训内容。比如为想要进入“产品”类职位的学员,重点培训与产品设计、市场调研等相关的知识和技能,提高培训的针对性和实用性。

4. 完整代码

import numpy as np
import pandas as pd
import seaborn as sns
from matplotlib import pyplot as plt
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder# 设置支持中文的字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 解决负号'-'显示为方块的问题def load_data(file_path):"""加载数据集参数:file_path (str): CSV文件路径返回:DataFrame: 加载的数据集"""return pd.read_csv(file_path)def prepare_data(data):"""准备特征和目标变量参数:data (DataFrame): 原始数据集返回:tuple: 特征矩阵X和目标变量y"""# 提取特征列和目标列X = data[['job_name', 'company_name', 'company_industry', 'skill']].copy()y = data['category_1'].copy()# 对object类型特征进行标签编码,将文本转换为数值categorical_cols = X.select_dtypes(include=['object']).columnsfor col in categorical_cols:le = LabelEncoder()X[col] = le.fit_transform(X[col])# 目标变量编码(注释掉,保留原始类别标签便于后续分析)# le_y = LabelEncoder()# y = le_y.fit_transform(y)return X, ydef train_model(X, y):"""训练随机森林分类器参数:X (DataFrame): 特征矩阵y (Series): 目标变量返回:tuple: 训练好的模型、测试集特征和测试集目标变量"""# 划分训练集和测试集,设置30%为测试集,固定随机种子确保结果可复现X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 初始化随机森林分类器,使用100棵决策树,固定随机种子rf = RandomForestClassifier(n_estimators=100, random_state=42)rf.fit(X_train, y_train)return rf, X_test, y_testdef evaluate_model(rf, X_test, y_test, cm_path, report_path):"""评估模型并保存结果参数:rf (RandomForestClassifier): 训练好的随机森林模型X_test (DataFrame): 测试集特征y_test (Series): 测试集目标变量cm_path (str): 混淆矩阵CSV保存路径report_path (str): 分类报告CSV保存路径返回:tuple: 预测结果和混淆矩阵"""# 在测试集上进行预测y_pred = rf.predict(X_test)# 计算并打印模型准确率accuracy = accuracy_score(y_test, y_pred)print(f'随机森林预测职位一级分类的准确率:{accuracy:.4f}')# 生成混淆矩阵并保存为CSVcm = confusion_matrix(y_test, y_pred)cm_df = pd.DataFrame(cm, columns=rf.classes_, index=rf.classes_)cm_df.to_csv(cm_path, index_label='真实标签', encoding='utf-8-sig', mode='w')# 生成分类报告并保存为结构化CSVreport = classification_report(y_test, y_pred, zero_division=1)# 解析分类报告文本为DataFrame,处理多种格式情况report_data = []lines = report.split('\n')# 提取列名行,适应不同版本sklearn的输出差异header_line = lines[0].strip()if 'support' in header_line:columns = header_line.split()else:columns = ['class', 'precision', 'recall', 'f1-score', 'support']# 解析类别行和平均值行for line in lines[2:]:line = line.strip()if not line:continue# 处理平均值行(宏平均、加权平均、准确率)if line.startswith('avg') or line.startswith('weighted') or line.startswith('accuracy'):parts = line.split()if len(parts) < 5:  # 处理accuracy行(只有4个值)avg_type = parts[0]precision = float(parts[1]) if len(parts) > 1 else 0.0recall = float(parts[2]) if len(parts) > 2 else 0.0f1_score = float(parts[3]) if len(parts) > 3 else 0.0support = int(y_test.shape[0])  # 使用总样本数else:avg_type = parts[0] + ' ' + parts[1] if parts[1] != 'avg' else parts[0]precision = float(parts[-4])recall = float(parts[-3])f1_score = float(parts[-2])support = int(parts[-1])report_data.append([avg_type, precision, recall, f1_score, support])# 处理类别行else:parts = line.split()if len(parts) < 5:continue  # 跳过空行或格式异常的行# 处理类别名称包含空格的情况if len(parts) > 5:class_name = ' '.join(parts[:-4])precision = float(parts[-4])recall = float(parts[-3])f1_score = float(parts[-2])support = int(parts[-1])else:class_name = parts[0]precision = float(parts[1])recall = float(parts[2])f1_score = float(parts[3])support = int(parts[4])report_data.append([class_name, precision, recall, f1_score, support])# 创建DataFrame并保存为CSV,设置中文列名report_df = pd.DataFrame(report_data, columns=['类别', '精确率', '召回率', 'F1分数', '样本量'])report_df.to_csv(report_path, index=False, encoding='utf-8-sig', mode='w')# 打印原始格式的分类报告print(report)return y_pred, cmdef visualize_results(rf, X, cm, cm_path, fi_path):"""可视化评估结果参数:rf (RandomForestClassifier): 训练好的随机森林模型X (DataFrame): 完整特征矩阵cm (array): 混淆矩阵cm_path (str): 混淆矩阵图像保存路径fi_path (str): 特征重要性CSV保存路径(图像路径自动生成)"""# 混淆矩阵可视化plt.figure(figsize=(10, 7))sns.heatmap(cm, annot=True, fmt='d', cmap='Blues',xticklabels=rf.classes_, yticklabels=rf.classes_)plt.xlabel('预测的标签')plt.ylabel('真正的标签')plt.title('随机森林分类器的混淆矩阵')plt.savefig(cm_path)plt.close()# 特征重要性可视化feature_importances = rf.feature_importances_feature_names = X.columnsindices = np.argsort(feature_importances)  # 按重要性升序排序# 保存特征重要性到CSV文件feature_importances_df = pd.DataFrame({'特征变量': feature_names, '重要性': feature_importances})feature_importances_df.to_csv(fi_path, index=False, encoding='utf-8-sig', mode='w')# 绘制特征重要性条形图plt.figure(figsize=(10, 6))plt.title('随机森林分类器的特征重要性')plt.barh(range(len(indices)), feature_importances[indices], align='center')plt.yticks(range(len(indices)), [feature_names[i] for i in indices])plt.xlabel('相对重要性')plt.tight_layout()  # 确保标签完整显示plt.savefig(fi_path.replace('.csv', '.png'))  # 保存为PNG图像plt.close()if __name__ == "__main__":"""主函数:整合数据处理、模型训练、评估和可视化流程"""# 文件路径配置DATA_PATH = '../data/data_cleaning_result/cleaned_position_dataset.csv'CM_CSV_PATH = '../data/algorithm_analysis_results/confusion_matrix.csv'CM_IMG_PATH = '../data/algorithm_analysis_results/confusion_matrix.png'REPORT_PATH = '../data/algorithm_analysis_results/classification_report.csv'FI_CSV_PATH = '../data/algorithm_analysis_results/feature_importances.csv'FI_IMG_PATH = '../data/algorithm_analysis_results/feature_importances.png'# 数据加载与准备print("正在加载数据...")df = load_data(DATA_PATH)X, y = prepare_data(df)# 模型训练print("正在训练模型...")rf, X_test, y_test = train_model(X, y)# 模型评估print("正在评估模型...")y_pred, cm = evaluate_model(rf, X_test, y_test, CM_CSV_PATH, REPORT_PATH)# 可视化结果print("正在生成可视化结果...")visualize_results(rf, X, cm, CM_IMG_PATH, FI_CSV_PATH)print("分析完成!结果已保存至指定路径。")
http://www.dtcms.com/a/267816.html

相关文章:

  • 【星闪】Hi2821 | Pinctrl、GPIO + LED灯和按键输入例程
  • 字符函数和字符串函数(下)- 暴力匹配算法
  • python pip 下载慢
  • 在 Dokploy 中为 PostgreSQL 搭建 PgBouncer 数据库连接池(图文)
  • 【influxdb3】如何使用 SQL 对时间序列数据进行聚合查询
  • Golang读取ZIP压缩包并显示Gin静态html网站
  • 51c大模型~合集150
  • 大型语言模型中的自动化思维链提示
  • unity校招岗面试题 天津某场 深圳某场
  • spring中@Transactional注解和事务的实战理解附代码
  • 蓝凌EKP产品:Hibernate懒加载检测与开发助手
  • LoRaWAN的设备类型有哪几种?
  • ABP VNext + Tye:本地微服务编排与调试
  • 1.线性神经网络--线性回归
  • Windows深色模式助手,定时自动切换
  • 热方程初边值问题解法
  • Qt之修改纯色图片的颜色
  • token设计方案
  • 大话网络协议 - HTTP不同版本的演进及其区别
  • 基于Excel的数据分析思维与分析方法
  • Java poi-tl 使用 word 模板 生成 word
  • 人工智能之数学基础:线性回归算法的矩阵参数求导
  • dubbo源码学习2-dubbo协议源码分析
  • C++:编译QXlsx库过程
  • 咕咚运动启动时弹出广告
  • Go语言--语法基础6--基本数据类型--切片类型
  • 【学习篇】SQL复杂查询学习
  • D3 面试题100道之(61-80)
  • React 英语单词消消乐一款专为英语学习设计的互动式记忆游戏
  • Flink ClickHouse 连接器:实现 Flink 与 ClickHouse 无缝对接