首页 > 编程语言 >用Python解决综合评价问题_模糊综合评价,决策树与灰色关联分析

用Python解决综合评价问题_模糊综合评价,决策树与灰色关联分析

时间:2024-09-17 12:49:23浏览次数:3  
标签:人才 Python 指标 df np 评价 决策树

一:模糊综合评价

模糊综合评价是一种有效的处理不确定性和模糊性的评价方法,特别是在人才评价等领域。它允许我们综合考虑多个评价指标,并给出一个综合的评价结果。以下是利用模糊综合评价对人才进行评价的步骤:

  1. 确定评价指标:首先,我们需要确定用于评价人才的各种指标,例如专业技能、团队合作能力、创新能力等。

  2. 建立评价集:评价集是对人才评价结果的集合,例如“优秀”、“良好”、“一般”、“较差”等。

  3. 确定权重:每个评价指标对人才评价的影响程度不同,因此需要为每个指标分配一个权重,表示其重要性。

  4. 构建模糊关系矩阵:通过专家打分或其他方法,对每个指标进行评价,构建一个模糊关系矩阵,表示评价指标与评价集之间的关系。

  5. 模糊合成:使用合适的合成方法(如最大-最小合成法),将模糊关系矩阵与权重相结合,得到一个综合评价结果。

  6. 结果分析:对综合评价结果进行分析,得出对人才的最终评价。

现在,我们可以通过一个示例来演示这个过程。假设我们有三个评价指标:专业技能、团队合作能力和创新能力,每个指标的权重分别为0.6、0.3 和 0.1。评价集为{ 优秀,良好,一般,较差 }。我们可以构建一个模糊关系矩阵,并计算出一个综合评价结果。

为了简化计算,我们可以假设模糊关系矩阵已经通过专家打分得到。接下来,我将使用Python来计算这个模糊综合评价。首先,我们需要定义权重和模糊关系矩阵。然后,我们将使用模糊合成方法来计算最终的评价结果。

import numpy as np

# 定义权重
weights = np.array([0.6, 0.3, 0.1])

# 每一行代表一个评价指标,每一列代表一个评价等级(优秀,良好,一般,较差)
fuzzy_relation_matrix = np.array([
    [0.7, 0.2, 0.1, 0],
    [0.6, 0.3, 0.1, 0],
    [0.2, 0.5, 0.3, 0]
])

# 计算综合评价结果
# 使用最大-最小合成法
def fuzzy_composite_evaluation(weights, fuzzy_relation_matrix):
    # 将权重扩展到与模糊关系矩阵相同的维度
    weighted_matrix = np.tile(weights, (fuzzy_relation_matrix.shape[1], 1)).T * fuzzy_relation_matrix
    # 计算每个评价等级的综合得分
    composite_scores = np.max(weighted_matrix, axis=0)
    return composite_scores

composite_scores = fuzzy_composite_evaluation(weights, fuzzy_relation_matrix)
composite_scores

通过计算,我们得到了每个评价等级的综合得分:优秀为0.42,良好为0.12,一般为0.06,较差为0。这意味着根据给定的权重和模糊关系矩阵,这位人才在“优秀”这一评价等级上的得分最高,因此可以认为这位人才的整体表现是优秀的。

以下是对这段代码中模糊综合评价所用数学原理的解释:

一、权重的作用

给定的权重 weights = np.array([0.6, 0.3, 0.1]),表示各个评价指标在综合评价中的重要程度。权重值越大,对应的评价指标对最终结果的影响就越大。

二、模糊关系矩阵

模糊关系矩阵 fuzzy_relation_matrix 每一行代表一个评价指标,每一列代表一个评价等级(优秀,良好,一般,较差)。矩阵中的元素表示某个评价指标对于特定评价等级的隶属度。例如,fuzzy_relation_matrix[0][0]=0.7 表示第一个评价指标对于 “优秀” 这个评价等级的隶属度为 0.7,即有70%的可能性认为该人才在专业技能方面是优秀的。具体来说:

  • 第一行代表“专业技能”这一评价指标在不同评价等级上的隶属度。
  • 第二行代表“团队合作能力”这一评价指标在不同评价等级上的隶属度。
  • 第三行代表“创新能力”这一评价指标在不同评价等级上的隶属度。

三、最大 - 最小合成法

1:扩展权重:将权重扩展到与模糊关系矩阵相同的维度,通过 np.tile(weights, (fuzzy_relation_matrix.shape[1], 1)).T 操作,将权重在列方向上进行重复,使其维度与模糊关系矩阵一致。然后与模糊关系矩阵相乘,得到 weighted_matrix。这个过程实际上是将每个评价指标的权重与对应的隶属度进行结合,得到加权后的隶属度。

2:计算综合得分composite_scores = np.max(weighted_matrix, axis=0),对加权后的矩阵在列方向上取最大值。这是基于最大 - 最小合成法的原理,即对于每个评价等级,取所有评价指标在该等级上的加权隶属度的最大值作为该等级的综合得分。这种方法体现了在模糊综合评价中,综合考虑各个评价指标的影响,以最具优势的情况来确定最终的评价结果。

总的来说,这段代码通过给定的权重和模糊关系矩阵,利用最大 - 最小合成法计算出每个评价等级的综合得分,从而实现对评价对象的模糊综合评价。这种方法适用于处理具有模糊性和不确定性的评价问题,能够更全面地反映评价对象的特点。

二:决策树

决策树是一种在机器学习和数据分析中广泛使用的模型,它通过学习样本数据的特征和决策规则,构建一个树状的决策流程,以此来预测新样本的类别或数值。在人才评价指标的应用中,决策树可以根据一系列预定义的评价指标,如工作经验、教育背景、技能水平等,来对人才进行分类或评分。

构建决策树模型通常包括以下几个步骤:

  1. 特征选择:选择最能代表人才特征的评价指标,这些指标应该是对人才评价最具预测力的。特征选择的方法包括信息增益、信息增益比和基尼指数等。

  2. 决策树生成:使用训练数据集来构建决策树。这个过程通常是一个递归过程,通过不断地选择最优的特征进行数据集的分割,直到满足停止条件,如达到最大树深、节点包含的样本数量低于阈值或信息增益小于某个值。

  3. 决策树剪枝:为了防止过拟合,决策树可能需要剪枝。剪枝过程包括预剪枝和后剪枝,预剪枝是在树生长过程中提前停止树的生长,后剪枝是在树完全生长后,从底向上评估是否合并决策节点。

  4. 模型评估:使用测试数据集对构建的决策树模型进行评估,常用的评估指标包括准确率、召回率、精确度和F1分数等。

在实际应用中,决策树算法如ID3、C4.5和CART等,可以处理分类和回归问题。ID3和C4.5主要用于分类问题,而CART可以同时处理分类和回归问题。这些算法在选择分裂节点时使用不同的准则,如ID3使用信息增益,C4.5使用信息增益比,CART使用基尼指数。

假设我们有一个人才评价数据集,包含了 10 个人才的评价指标和评价结果。评价指标包括:学历、工作经验、专业技能、沟通能力、团队合作能力、创新能力、领导力、责任心、工作态度和绩效表现。评价结果分为优秀、良好、一般和差四个等级。

我们可以将这个数据集表示为一个决策表,其中每一行表示一个人才,每一列表示一个评价指标或评价结果。决策表的形式如下:

人才编号学历工作经验专业技能沟通能力团队合作能力创新能力领导力责任心工作态度绩效表现评价结果
1硕士5 年优秀
2本科3 年良好
3本科2 年一般
4硕士4 年优秀
5本科3 年良好
6本科2 年一般
7硕士5 年优秀
8本科3 年良好
9本科2 年一般
10硕士4 年优秀

下面是一个利用决策树根据一些人才评价指标对人才进行评价的例子:

import pandas as pd
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
  • pandas 是一个数据分析库,用于处理和操作结构化数据。
  • SelectKBest 是 scikit-learn 库中的一个类,用于选择 K 个最佳特征。
  • chi2 是卡方检验,用于 SelectKBest 的得分函数,以评估特征与目标变量之间的关系。
  • DecisionTreeClassifier 是 scikit-learn 中的决策树分类器。
  • tree 模块用于导出决策树的规则。
# 假设的人才评价数据
data = {
    '人才编号': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    '学历': ['硕士', '本科', '本科', '硕士', '本科', '本科', '硕士', '本科', '本科', '硕士'],
    '工作经验': [5, 3, 2, 4, 3, 2, 5, 3, 2, 4],
    '专业技能': ['高', '中', '低', '高', '中', '低', '高', '中', '低', '高'],
    '沟通能力': ['高', '中', '低', '高', '中', '低', '高', '中', '低', '高'],
    '团队合作能力': ['高', '中', '低', '高', '中', '低', '高', '中', '低', '高'],
    '创新能力': ['高', '中', '低', '高', '中', '低', '高', '中', '低', '高'],
    '领导力': ['高', '中', '低', '高', '中', '低', '高', '中', '低', '高'],
    '责任心': ['高', '中', '低', '高', '中', '低', '高', '中', '低', '高'],
    '工作态度': ['高', '中', '低', '高', '中', '低', '高', '中', '低', '高'],
    '绩效表现': ['高', '中', '低', '高', '中', '低', '高', '中', '低', '高'],
    '评价结果': ['优秀', '良好', '一般', '优秀', '良好', '一般', '优秀', '良好', '一般', '优秀']
}

df = pd.DataFrame(data)

这里定义了一个名为 data 的字典,其中包含了假设的人才评价数据。这些数据被转换成了 pandas DataFrame 对象 df

# 数据预处理:将类别型数据进行数值编码
df['学历'] = df['学历'].map({'本科': 0, '硕士': 1})
df['专业技能'] = df['专业技能'].map({'低': 0, '中': 1, '高': 2})
df['沟通能力'] = df['沟通能力'].map({'低': 0, '中': 1, '高': 2})
df['团队合作能力'] = df['团队合作能力'].map({'低': 0, '中': 1, '高': 2})
df['创新能力'] = df['创新能力'].map({'低': 0, '中': 1, '高': 2})
df['领导力'] = df['领导力'].map({'低': 0, '中': 1, '高': 2})
df['责任心'] = df['责任心'].map({'低': 0, '中': 1, '高': 2})
df['工作态度'] = df['工作态度'].map({'低': 0, '中': 1, '高': 2})
df['绩效表现'] = df['绩效表现'].map({'低': 0, '中': 1, '高': 2})
df['评价结果'] = df['评价结果'].map({'一般': 0, '良好': 1, '优秀': 2})

数据预处理阶段,将类别型数据(如学历、专业技能等)转换为数值型数据,以便机器学习模型可以处理。这里使用了 pandas 的 map 函数,将原始的文本标签映射为数值。

X = df.iloc[:, :-1]  # 特征
y = df.iloc[:, -1]   # 标签
selector = SelectKBest(score_func=chi2, k='all')
selector.fit(X, y)
scores = selector.scores_
  • X 包含了除最后一列(评价结果)之外的所有列,即特征。
  • y 是最后一列,即目标变量(评价结果)。
  • SelectKBest 实例化时使用了卡方检验作为得分函数,并且设置为选择所有特征(k='all')。
  • fit 方法用于计算每个特征的得分。
  • scores_ 属性包含了每个特征的得分。
selected_features = X.columns[(-scores).argsort()[:3]]
print("选择的属性:", selected_features)

这里选择了得分最高的三个特征。argsort 方法返回了得分从小到大的索引,取负数后变成了从大到小,然后取前三个索引。

clf = DecisionTreeClassifier()
clf.fit(X[selected_features], y)
tree_rules = tree.export_text(clf, feature_names=selected_features.tolist())
print(tree_rules)
  • 实例化一个决策树分类器 clf
  • 使用选定的特征 X[selected_features] 和目标变量 y 来训练决策树。
  • 使用 export_text 方法导出决策树的规则,以文本形式展示。
# 人才评价示例
new_talent = {'学历': 1, '工作经验': 4, '专业技能': 2, '沟通能力': 2, '团队合作能力': 2,
              '创新能力': 2, '领导力': 2, '责任心': 2, '工作态度': 2, '绩效表现': 2}
new_talent_df = pd.DataFrame([new_talent])
new_talent_df = new_talent_df[selected_features]
prediction = clf.predict(new_talent_df)
print(f"根据决策树模型,新人才的评价结果为:{'一般' if prediction[0] == 0 else '良好' if prediction[0] == 1 else '优秀'}")
  • 创建一个新的 DataFrame 对象 new_talent_df,包含一个新人才的数据。
  • 使用决策树模型对新的数据进行预测。
  • 打印预测结果,将数值标签映射回原始的文本标签。

决策树的规则与预测结果如下:

三:灰色关联分析

灰色关联分析是一种多因素统计分析方法,它以各因素的样本数据为依据,用灰色关联度来描述因素间关系的强弱、大小和次序。下面是一个利用灰色关联分析根据一些人才评价指标对人才进行评价的示例。

假设我们要评价三位候选人(A、B、C)的综合素质,选取了以下五个评价指标:

  1. 教育背景(X1):学历水平,博士为 5 分,硕士为 4 分,本科为 3 分,大专为 2 分,高中及以下为 1 分。
  2. 工作经验(X2):工作年限,每满一年得 1 分。
  3. 专业技能(X3):通过相关专业技能考试的数量,每通过一项得 2 分。
  4. 创新能力(X4):过去三年发表的论文数量,每篇得 3 分。
  5. 团队协作能力(X5):由同事和上级进行评价,满分 10 分。

三位候选人的各项指标得分如下表所示:

候选人教育背景(X1)工作经验(X2)专业技能(X3)创新能力(X4)团队协作能力(X5)
A45638
B37427
C53846

接下来,我们使用灰色关联分析对这三位候选人进行评价。

步骤一:确定参考序列和比较序列

参考序列(X0)是理想的人才评价指标值,我们可以取各项指标的最大值作为参考序列:

X0 = [5, 7, 8, 4, 8]

比较序列(Xi)是三位候选人的各项指标得分:

X1 = [4, 5, 6, 3, 8]
X2 = [3, 7, 4, 2, 7]
X3 = [5, 3, 8, 4, 6]

步骤二:数据无量纲化处理

为了消除不同指标量纲的影响,我们对数据进行无量纲化处理。这里采用初值化方法,即将每个序列的第一个数据作为基准,其他数据除以该基准值。

无量纲化后的参考序列和比较序列如下:

X0' = [1, 1, 1, 1, 1]

X1' = [4/5, 5/5, 6/5, 3/5, 8/5] = [0.8, 1, 1.2, 0.6, 1.6]
X2' = [3/5, 7/5, 4/5, 2/5, 7/5] = [0.6, 1.4, 0.8, 0.4, 1.4]
X3' = [5/5, 3/5, 8/5, 4/5, 6/5] = [1, 0.6, 1.6, 0.8, 1.2]

步骤三:计算关联系数

对于候选人 A:

对于候选人 B:

对于候选人 C:

步骤四:计算关联度

步骤五:评价结果分析

根据关联度的大小对候选人进行评价,关联度越大,说明该候选人与理想人才的匹配程度越高。

从计算结果可以看出,候选人 A 和候选人 C 的关联度相同且大于候选人 B 的关联度。因此,候选人 A 和候选人 C 的综合素质相对较高,候选人 B 的综合素质相对较低。

以上过程用可以用以下代码表示:

import numpy as np

# 原始数据
data = np.array([[4, 5, 6, 3, 8], [3, 7, 4, 2, 7], [5, 3, 8, 4, 6]])

# 确定参考序列(取各项指标最大值)
ref_seq = np.max(data, axis=0)

# 数据无量纲化处理(初值化方法)
normalized_data = data / ref_seq

# 计算关联系数
def calculate_correlation_coefficient(ref_seq, compared_seq, rho=0.5):
    min_diff = np.min(np.abs(ref_seq - compared_seq))
    max_diff = np.max(np.abs(ref_seq - compared_seq))
    return (min_diff + rho * max_diff) / (np.abs(ref_seq - compared_seq) + rho * max_diff)

correlation_coefficients = []
for candidate in normalized_data:
    correlation_coefficients.append(calculate_correlation_coefficient(ref_seq, candidate))

# 计算关联度(关联系数的平均值)
correlation_degrees = [np.mean(candidate_correlation) for candidate_correlation in correlation_coefficients]

print("关联度:", correlation_degrees)

想要探索更多元化的数据分析视角,可以关注之前发布的相关内容。

标签:人才,Python,指标,df,np,评价,决策树
From: https://blog.csdn.net/2301_80651329/article/details/142301057

相关文章

  • python+flask计算机毕业设计基于微信小程序的综合旅游管理系统的设计与实现(程序+开题+
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着移动互联网技术的飞速发展,人们的生活方式和消费习惯正经历着深刻的变革。旅游作为现代人休闲娱乐的重要方式之一,其服务模式和体验需求......
  • python+flask计算机毕业设计健身房管理系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着现代人生活节奏的加快和健康意识的日益增强,健身房作为促进全民健身、提升生活质量的重要场所,其管理与服务效率成为了行业关注的焦点。......
  • python之模块和包的导入与使用,pip的使用(13)
    文章目录1、模块1.1模块的分类1.1.1内置模块1.1.2第三方模块(比较重要)1.1.3自定义模块1.2模块的导入1.2.1单个模块的导入1.2.2同时导入多个模块1.2.3模块导入规范1.2.4给导入的模块取别名1.2.5同时导入模块和名字1.2.6给导入的名字取别名扩展:导入模块中所有的......
  • Python中的逻辑运算符:解锁编程世界的隐形钥匙
    引言逻辑运算符是任何编程语言的基础组成部分之一,在Python中也不例外。它允许我们基于一个或多个布尔表达式的真假值来决定程序的行为。在日常开发工作中,逻辑运算符广泛应用于条件判断、循环控制等场合,是构建复杂逻辑不可或缺的一部分。掌握好逻辑运算符,不仅可以提高代码的......
  • Python中的“with”语句:解锁优雅资源管理的秘密
    引言在日常开发过程中,我们经常会遇到需要打开文件、建立网络连接或数据库会话的情况。传统的做法是手动打开资源,在使用完毕后记得关闭。但这种方法存在明显不足:一旦在使用过程中发生异常,很容易忘记关闭资源,导致内存泄漏等问题。而“with”语句提供了一种更安全、简洁的方式来管理......
  • Python中的魔法:探索自定义Context Manager的魅力
    引言在日常开发中,我们经常需要处理各种资源管理的问题。比如,打开一个文件后需要记得关闭;使用完数据库连接后需要释放等。如果这些操作处理不当,可能会导致内存泄漏或者其他资源浪费的问题。ContextManager的设计正是为了解决这些问题而生,它提供了一种自动化的资源管理方式。那么,如......
  • 软件工程结对项目 3:python实现自动生成小学四则运算题目的程序
    这个作业属于哪个课程广工计院计科34班软工这个作业要求在哪里作业要求团队成员1庄崇立3122004633团队成员2罗振烘3122004748这个作业的目标结对合作完成小学四则运算题目的程序,熟悉项目开发流程,提高团队合作能力一、GitHub地址二、需求1.题目:实现一......
  • python- +和+=的区别
     区别:+使用__add__函数,返回新地址+= 可变数据时使用__iadd__函数,返回原地址;不可变数据用__add__函数 不可变数据#不可变数据+和+=都用__add__函数i=10i=i+2print(id(i))i+=2print(id(i)) 可变数据#可变数据+使用__add__函数,返回新地址#......
  • Python Web开发中的扩展与插件开发:从自定义到打包与发布
    PythonWeb开发中的扩展与插件开发:从自定义到打包与发布目录⚙️Flask中的自定义扩展开发......
  • Python Web 开发中的国际化与本地化处理
    PythonWeb开发中的国际化与本地化处理目录......