我在之前的比赛中很少涉及评价模型,做的更多的是模型评价,虽然两个词语位置不同但方法差异很大(开始我也差点搞混了),这次学习算是提供了一些新思路,个人就简单记录一下学习的内容(仅面向初学者,有些算法过于复杂,我自己也搞不明白,重点要学着用)。
权重生成通常涉及到确定不同因素或变量在模型中的重要性。一般情况需要通过实际数据,和多种方法生成。在获取权重后我们可以对每个指标进行评价,通过权重得分来选择最优方案。下面介绍几种常用的方法。
一.层次分析法
层次分析法属于一种多决策方法,通过建立层次结构模型,将不同层次间进行比较,最终确定决策依据。主要分为目标层、准则层、方案层。
相关例图
针对每一准则和方案,构建判断矩阵。成对比较矩阵通常采用1-标度进行取值。
下面简单给一个例子:
对角线属于自己与自己比较,默认为1,其余则是根据重要程度进行取值。
然后则是通过判断矩阵计算权重向量,通常是求取判断矩阵的特征值和特征向量,进行归一化处理。
import numpy as np
# 定义一个矩阵A
A = np.array([[...], [...]])
# 计算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(A)
# 输出特征值和特征向量
print("特征值:", eigenvalues)
print("特征向量:\n", eigenvectors)
# 找到最大特征值对应的特征向量
max_index = np.argmax(eigenvalues)
max_eigenvector = eigenvectors[:, max_index]
# 归一化特征向量
weights = max_eigenvector / np.sum(max_eigenvector)
# 输出权重
print(weights)
最后是进行一致性检验,常用CR法进行检验,这里给出公式:
RI参考(n为标准数):
最终可以求得
若CR值<0.1,对于判断矩阵的权重是可以接受的。我们将通过CR值来评价每种方案,最终获取最优规划。
二.熵权分析法
熵权分析法是一种客观赋权的方法,它基于信息熵的概念,通过计算每个指标的信息熵来衡量该指标的离散程度,简单的说就是,信息熵越大,其对应权重较小,反之,权重较大。
首先需要对原始数据进行标准化处理或者正向化处理,使数据的标准方向一致。之后计算每个指标的比重,计算每个指标的熵值,计算每个指标的差异系数,最后获取权重系数,可参考如下代码:
import numpy as np
# 示例数据,m个方案,n个指标
data = np.array([
[2, 3, 5],
[1, 2, 4],
[3, 1, 2],
# 添加更多的方案...
])
# 步骤1:数据标准化
# 这里使用极差标准化方法
data_normalized = (data - np.min(data, axis=0)) / (np.max(data, axis=0) - np.min(data, axis=0))
# 步骤2:计算每个指标的比重
sum_per_column = np.sum(data_normalized, axis=0)
proportion = data_normalized / sum_per_column.reshape(1, -1)
# 步骤3:计算每个指标的熵值
ln_m = np.log(np.shape(data_normalized)[0])
entropy = -np.sum(proportion * np.log(proportion + 1e-10), axis=0) / ln_m # 1e-10 用于避免对数的0值
# 步骤4:计算每个指标的差异系数
difference_coefficient = 1 - entropy
# 步骤5:确定每个指标的权重
weights = difference_coefficient / np.sum(difference_coefficient)
# 打印权重
print("权重:", weights)
# 步骤6:计算综合得分(示例)
# 假设有一个方案的得分是data_normalized的行向量
example_score = data_normalized[0, :]
comprehensive_score = np.dot(example_score, weights)
print("综合得分:", comprehensive_score)
熵权分析法客观性较强,且权重可以随着数据的改变而改变,能够动态地反映各个指标的重要程度。适用于多指标评价问题。
三、主成分分析法(PCA)
通过正交变换将一组可能相关的变量转化为一组线性不相关(线性相关变量需排除,避免出现一种变量能被其他变量表示的情况)的变量,不相关的变量称为主成分。常用于降维、数据压缩。下面主要介绍具体步骤,以便初学者使用。
1.标准化数据
2.计算协方差矩阵(反映数据的相关性)
3.计算特征值和特征向量(通过特征值表示主成分的贡献度)
4.选择主成分(根据特征值进行选择)
5.构造特征空间
import numpy as np
import pandas as pd
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
# 假设df是一个Pandas DataFrame,包含多列数据
data = {
'Feature1': np.random.randn(100),
'Feature2': np.random.randn(100),
'Feature3': np.random.randn(100)
}
df = pd.DataFrame(data)
# 标准化数据
# 这里将数据转换为均值为0,标准差为1的准正态分布
scaler = StandardScaler()
df_scaled = scaler.fit_transform(df)
# 计算协方差矩阵
cov_matrix = np.cov(df_scaled, rowvar=False)
# 计算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eigh(cov_matrix)
# 选择主成分
num_components = 2 # 假设我们选择前两个主成分
selected_eigenvectors = eigenvectors[:, :num_components]
# 构造新的特征空间
pca_data = df_scaled.dot(selected_eigenvectors)
# 打印结果
print("原始数据的协方差矩阵:")
print(cov_matrix)
print("\n特征值:", eigenvalues)
print("\n选择的主成分(特征向量):")
print(selected_eigenvectors)
print("\nPCA转换后的数据:")
print(pca_data)
如果数据不符合正态分布可采用其他标准化方法,具体参考:
这里仅告诉使用方法,如果想深度了解主成分分析(PCA)可参考:
我们通过特征值确定主成分实际上将特征值进行归一化处理便可获取对应主成分的权重,最终将权重乘以主成分便可获取评价得分。可以看出PCA利用矩阵的特殊性质解决了很多数据特征问题,实际过程中很多方法最够都回归于一个处理步骤,主要是方法导向不同,最后基本都会与特征值和特征向量相关联,可见矩阵的力量还是很强大的(线代一定要学好)。
还有其他多种评价模型的方法,如模糊综合分析法、数据包络分析法(CRR和BRR)、秩和比分析法等,有些方法过于复杂,这里就不进行介绍了。希望以上几种方法能帮助读者解决相关的实际建模问题。