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

一:模糊综合评价

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

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

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

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

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

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

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

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

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

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 年 优秀

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

python 复制代码
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 模块用于导出决策树的规则。
python 复制代码
# 假设的人才评价数据
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

python 复制代码
# 数据预处理:将类别型数据进行数值编码
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 方法导出决策树的规则,以文本形式展示。
python 复制代码
# 人才评价示例
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)
A 4 5 6 3 8
B 3 7 4 2 7
C 5 3 8 4 6

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

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

参考序列(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 的综合素质相对较低。

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

python 复制代码
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)

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

相关推荐
阡之尘埃2 小时前
Python数据分析案例61——信贷风控评分卡模型(A卡)(scorecardpy 全面解析)
人工智能·python·机器学习·数据分析·智能风控·信贷风控
布说在见4 小时前
层次与网络的视觉对话:树图与力引导布局的双剑合璧
信息可视化·数据挖掘·数据分析
丕羽5 小时前
【Pytorch】基本语法
人工智能·pytorch·python
bryant_meng5 小时前
【python】Distribution
开发语言·python·分布函数·常用分布
m0_594526306 小时前
Python批量合并多个PDF
java·python·pdf
工业互联网专业7 小时前
Python毕业设计选题:基于Hadoop的租房数据分析系统的设计与实现
vue.js·hadoop·python·flask·毕业设计·源码·课程设计
钱钱钱端7 小时前
【压力测试】如何确定系统最大并发用户数?
自动化测试·软件测试·python·职场和发展·压力测试·postman
慕卿扬7 小时前
基于python的机器学习(二)—— 使用Scikit-learn库
笔记·python·学习·机器学习·scikit-learn
Json____7 小时前
python的安装环境Miniconda(Conda 命令管理依赖配置)
开发语言·python·conda·miniconda
小袁在上班7 小时前
Python 单元测试中的 Mocking 与 Stubbing:提高测试效率的关键技术
python·单元测试·log4j