








<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500">#########################伪代码###########################</span>
<span style="color:#aa5500"># 导入必要的库</span>
Import libraries
<span style="color:#aa5500"># 定义函数</span>
Function discretize(theta):
<span style="color:#aa5500"># 初始化二进制矩阵 YT</span>
Initialize YT as a zero matrix with the same shape as theta
For each row i <span style="color:#770088">in</span> theta:
Find the maximum value <span style="color:#770088">in</span> row i
For each column j <span style="color:#770088">in</span> row i:
If the difference between the max value and theta[i][j] is less than <span style="color:#116644">1</span>/K:
Set YT[i][j] to <span style="color:#116644">1</span>
Else:
Set YT[i][j] to <span style="color:#116644">0</span>
Return YT
Function convert_to_one_hot(data):
<span style="color:#aa5500"># 获取唯一值和类别数</span>
Find unique values <span style="color:#770088">in</span> data
Initialize one_hot_encoded as a zero matrix
For each value <span style="color:#770088">in</span> data:
Find the index of the value <span style="color:#770088">in</span> unique values
Set the corresponding position <span style="color:#770088">in</span> one_hot_encoded to <span style="color:#116644">1</span>
Return one_hot_encoded
Function lda(labels, n):
<span style="color:#aa5500"># 进行潜在狄利克雷分配(LDA)</span>
Initialize LDA model with n components
Fit and transform labels using LDA model
Discretize the transformed data
Return the discretized data
Function metric_cal(test, pred):
<span style="color:#aa5500"># 计算并打印评估指标</span>
Calculate accuracy, precision, recall, F1 score, and AUC
Print the calculated metrics
<span style="color:#aa5500"># 主程序</span>
If __name__ <span style="color:#981a1a">==</span> <span style="color:#aa1111">"__main__"</span>:
<span style="color:#aa5500"># 加载数据</span>
Load data from Excel file
<span style="color:#aa5500"># 定义标签列和特征</span>
Define label_cols and features
Convert features and labels to NumPy arrays
<span style="color:#aa5500"># 设置主题数</span>
Set n to <span style="color:#116644">6</span>
<span style="color:#aa5500"># 对标签进行LDA</span>
Call lda <span style="color:#770088">function</span> to <span style="color:#3300aa">get</span> Y_T
<span style="color:#aa5500"># 将特征与离散化的标签组合</span>
Concatenate features and Y_T to <span style="color:#3300aa">get</span> XYT
<span style="color:#aa5500"># 划分训练集和测试集</span>
Split XYT and labels into X_train, X_test, y_train, y_test
<span style="color:#aa5500"># 初始化多标签分类器</span>
Initialize MT_classifier as RankSVM
<span style="color:#aa5500"># 从训练集和测试集中提取主题</span>
Extract yt_train and yt_test from X_train and X_test
Remove last n columns from X_train and X_test
<span style="color:#aa5500"># 训练多标签分类器</span>
Fit MT_classifier using X_train and yt_train
<span style="color:#aa5500"># 预测测试集的主题</span>
Predict yt_proba and yt_pred using MT_classifier on X_test
Convert yt_pred to integer
<span style="color:#aa5500"># 使用预测的主题扩展训练集和测试集</span>
Concatenate X_train with yt_train to <span style="color:#3300aa">get</span> X_train_aug
Concatenate X_test with yt_pred to <span style="color:#3300aa">get</span> X_test_aug
<span style="color:#aa5500"># 初始化并训练二进制相关性分类器</span>
Initialize base_classifier as MLPClassifier
Initialize clf as BinaryRelevance with base_classifier
Fit clf using X_train_aug and y_train
<span style="color:#aa5500"># 预测测试集的标签</span>
Predict y_pred and y_score using clf on X_test_aug
<span style="color:#aa5500"># 计算评估指标</span>
Calculate hamming loss, ranking loss, coverage error, and average precision
Print calculated metrics
<span style="color:#aa5500"># 对每个标签计算并打印评估指标</span>
For each label i:
Extract test and pred <span style="color:#770088">for</span> label i
Call metric_cal <span style="color:#770088">function</span> to calculate and print metrics
Print separator
Print final separator</span></span><span style="background-color:#f8f8f8"><span style="color:#333333"># 定义LIFTClassifier类,继承自BaseEstimator和ClassifierMixin
class LIFTClassifier(BaseEstimator, ClassifierMixin):
# 初始化函数,接受一个基本分类器作为参数
def __init__(self, base_classifier=DecisionTreeClassifier()):
设置base_classifier为传入的参数
初始化classifiers字典
# 训练模型函数
def fit(self, X, y):
获取标签数量
遍历每个标签
对每个标签训练一个分类器
将训练好的分类器存入classifiers字典
返回self
# 预测函数
def predict(self, X):
获取标签数量
初始化预测结果矩阵
遍历每个标签
使用对应的分类器进行预测
将预测结果存入预测结果矩阵
返回预测结果矩阵
# 预测概率函数
def predict_proba(self, X):
获取标签数量
初始化概率预测结果矩阵
遍历每个标签
使用对应的分类器进行概率预测
将预测概率结果存入概率预测结果矩阵
返回概率预测结果矩阵
# 定义MLkNN类
class MLkNN:
# 初始化函数,接受一个k值作为参数
def __init__(self, k=3):
设置k值
初始化k近邻模型
# 训练模型函数
def fit(self, X, y):
保存训练数据X和y
使用X训练k近邻模型
# 预测函数
def predict(self, X):
获取样本数量
初始化预测结果矩阵
遍历每个样本
获取样本的k+1个最近邻
排除样本自身
计算邻居标签的和
根据标签和判断最终预测结果
返回预测结果矩阵
# 预测概率函数
def predict_proba(self, X):
获取样本数量
初始化概率预测结果矩阵
遍历每个样本
获取样本的k+1个最近邻
排除样本自身
计算每个标签的概率
返回概率预测结果矩阵
# 定义RankSVM类,继承自BaseEstimator和ClassifierMixin
class RankSVM(BaseEstimator, ClassifierMixin):
# 初始化函数,接受参数C, kernel, gamma
def __init__(self, C=1.0, kernel='rbf', gamma='scale'):
设置C, kernel, gamma值
初始化模型列表
初始化多标签二值化器
# 训练模型函数
def fit(self, X, y):
使用多标签二值化器转换y
获取标签数量
遍历每个标签
将当前标签转换为二值格式
使用SVM训练二值化后的标签
将训练好的SVM模型加入模型列表
# 预测函数
def predict(self, X):
初始化预测结果矩阵
遍历每个SVM模型
使用模型进行预测
将预测结果存入预测结果矩阵
返回预测结果矩阵
# 预测概率函数
def predict_proba(self, X):
初始化概率预测结果矩阵
遍历每个SVM模型
使用模型进行概率预测
将预测概率结果存入概率预测结果矩阵
返回概率预测结果矩阵
# 定义MultiLabelDecisionTree类
class MultiLabelDecisionTree:
# 初始化函数,接受参数max_depth, random_state
def __init__(self, max_depth=None, random_state=None):
设置max_depth, random_state值
初始化标签幂集转换器
初始化决策树分类器
# 训练模型函数
def fit(self, X, y):
使用标签幂集转换器转换y
使用转换后的y训练决策树分类器
# 预测概率函数
def predict_proba(self, X):
使用决策树分类器进行概率预测
将预测概率结果转换为原始标签格式
返回概率预测结果
# 预测函数
def predict(self, X):
使用决策树分类器进行预测
将预测结果转换为原始标签格式
返回预测结果
# 定义MLP神经网络类,继承自nn.Module
class MLP(nn.Module):
# 初始化函数,接受输入大小、隐藏层大小和输出大小作为参数
def __init__(self, input_size, hidden_size, output_size):
调用父类的初始化函数
初始化全连接层1
初始化ReLU激活函数
初始化全连接层2
初始化Sigmoid激活函数
# 前向传播函数
def forward(self, x):
通过全连接层1
通过ReLU激活函数
通过全连接层2
通过Sigmoid激活函数
返回输出
# 定义BPMLL类,继承自BaseEstimator和ClassifierMixin
class BPMLL(BaseEstimator, ClassifierMixin):
# 初始化函数,接受参数input_size, hidden_size, output_size, epochs, lr
def __init__(self, input_size, hidden_size, output_size, epochs=10, lr=0.0001):
设置输入大小、隐藏层大小、输出大小、训练轮数、学习率
初始化MLP模型
初始化优化器
初始化损失函数
# 训练模型函数
def fit(self, X_train, X_val, y_train, y_val):
将训练数据和验证数据转换为张量
创建训练数据集和数据加载器
遍历每个训练轮次
设置模型为训练模式
遍历训练数据加载器
清零梯度
前向传播
计算损失
反向传播
更新参数
设置模型为评估模式
计算验证损失并打印
# 预测概率函数
def predict_proba(self, X):
设置模型为评估模式
禁用梯度计算
进行前向传播
返回预测概率结果
# 预测函数
def predict(self, X, threshold=0.5):
获取预测概率结果
根据阈值判断最终预测结果
返回预测结果
# 定义RandomKLabelsetsClassifier类,继承自BaseEstimator和ClassifierMixin
class RandomKLabelsetsClassifier(BaseEstimator, ClassifierMixin):
# 初始化函数,接受参数base_classifier, labelset_size, model_count
def __init__(self, base_classifier=None, labelset_size=3, model_count=10):
设置基本分类器、标签集大小、模型数量
初始化RakelD模型
# 训练模型函数
def fit(self, X, y):
使用RakelD模型训练数据
返回self
# 预测函数
def predict(self, X):
使用RakelD模型进行预测
返回预测结果
# 预测概率函数
def predict_proba(self, X):
使用RakelD模型进行概率预测
返回概率预测结果</span></span>同时我在文件multi_label_learning.py中定义了多种不同的多标签学习分类模型,大家可以自行调用相应的函数来进行实验以验证LDAML算法的有效性,使用方法我会在本文对应的视频中进行讲解。
调用LDAML算法的方法放在main.py文件中,首先我们需要将文件路径修改成自己所要使用的数据集路径。这里我使用的文件路径为’./测试数据.xlsx’,供大家一键运行熟悉项目。然后大家需要将自己的标签列名称提取变量label_cols中,用于对数据集划分特征集合与标签集合。

构建想要的多标签学习分类算法,这里我给大家复现了多种经典的多标签分类器,如LIFT、MlkNN和RankSVM等,并帮大家配置好了参数,大家可以将想要使用的算法对应行的注释删掉即可(MTM T 和M都是一样)。

设置好这些外在参数后,我们就可以运行代码,主文件将自动调用第三方库和multi_label_learn.py文件中的函数来进行训练和测试。下面是我选取的几种测试指标,分别会输出模型对整体的多标签分类性能指标(Hamming loss、Ranking loss、Coverage error和Average precision)和对单一标签的分类指标(Accuracy、Precision、Recall、F1 Score和AUC)。

下面是在测试数据集上模型的表现:

以上是模型多标签学习分类的性能,Hamming Loss为0.051228070175438595,Ranking Loss为0.016737120579225842,Coverage Error为2.3263157894736843,Average Precision为0.7500066243540565


我这里把数据列成表这样大家可以更直观的看到,我换用了不同的多标签学习算法结合LDAML,并比较了它们在Accuracy、AUC和F1-score上的表现。在上面的情况上来看,使用BPMLL在整体对单一标签进行分类时效果相比其他算法更好,但也会在某些标签下弱于其他模型。
潜在语义分析(Latent Semantic Analysis,LSA)是一种用于分析大规模文本数据的统计方法,旨在发现文本中的潜在语义结构并提取其语义信息。LSA假设文本中存在一些潜在的语义结构,即使在词语表达方式不同的情况下,这些结构也会保持一定的稳定性。其基本思想是将文本数据表示为一个矩阵,其中行代表文档,列代表词语,而矩阵中的元素则可以是词频、TF-IDF权重等。接下来,通过奇异值分解(Singular Value Decomposition,SVD)将这个矩阵分解为三个矩阵的乘积: 其中,A是原始文本矩阵,U是文档-概念矩阵,Σ是奇异值矩阵,是词语-概念矩阵的转置。LSA通过保留最重要的奇异值及其对应的左右奇异向量,将文本数据的维度降低到一个更小的空间,从而发现潜在的语义结构,并提取出文本数据的语义信息。
LSA在面对大规模文本数据时,能够有效地提取出其中的潜在语义信息。并且,LSA能发现文本数据中的主题结构并提取出其中的主题信息。受此启发,我们使用LSA对膝骨关节炎标记集合中的十个标记进行相关性计算并提取主题,从而获得标记集合中的高阶信息。相比之下,LSA比LDA更加灵活和简单。LDA对于大规模数据的处理速度较慢,因为它需要对每个词项和主题进行迭代推断,对主题分布和词项分布的先验参数进行设定,而LSA只需进行奇异值分解,不需要对先验参数进行设置,因此更容易实现和调试。LSA在语义上也更为易懂。LDA通过抽样方法从文档中抽取主题,它的主题在语义上可能难以解释,LSA通过奇异值分解从标签数据中提取主题,可以更直观地解释这些主题的含义,更好地反映标签之间的语义关系。
接下来是不是有可能将LSA融入到目前的框架中,或者直接基于LSA开发一种标记相关性提取的算法都是可以尝试的方向,可以留给大家一起去学习探索!

希望对你有帮助!加油!
若您认为本文内容有益,请不吝赐予赞同并订阅,以便持续接收有价值的信息。衷心感谢您的关注和支持!