python使用 ERF 模型对数据集进行分类,并通过 10 折交叉验证评估模型的性能

发布于:2025-02-10 ⋅ 阅读:(51) ⋅ 点赞:(0)
import numpy as np
import pandas as pd
import random
from sklearn.metrics import accuracy_score, matthews_corrcoef, confusion_matrix
from evidential_random_forest import ERF
from sklearn.model_selection import KFold
from utils import output_time
import fuzzy_feature_construct

ROUND_NUM = 1
FOLD_NUM = 10

def convert_to_mass(labels):
    unique_labels = sorted(list(set(labels)))

    num_classes = len(unique_labels)

    n = len(labels)

    mass_functions = []

    if n == 0:
        mass_function = np.full(num_classes, 1 / num_classes)
        mass_functions.append(mass_function)
    else:
        for label in labels:
            mass_function = np.zeros(num_classes + 1)
            if label in unique_labels:
                index = unique_labels.index(label)
                mass_function[index] = random.uniform(0.5, 1.0)
                mass_function[1 - index] = random.uniform(0, 0.5)
                mass_function[2] = (mass_function[0] + mass_function[1]) / 2
            mass_functions.append(mass_function)

    mass_functions = np.array(mass_functions)

    sums = np.sum(mass_functions, axis=1, keepdims=True)
    mass_functions_normalized_array = mass_functions / sums

    return mass_functions_normalized_array


def sen(Y_test, Y_pred):
    con_mat = confusion_matrix(Y_test, Y_pred)
    tp = con_mat[0][0]
    fn = con_mat[0][1]
    sen1 = tp / (tp + fn)
    return sen1


def spe(Y_test, Y_pred):
    con_mat = confusion_matrix(Y_test, Y_pred)
    fp = con_mat[1][0]
    tn = con_mat[1][1]
    spe1 = tn / (tn + fp)
    return spe1


def train_test(train_set, test_set):
    clf = ERF(n_estimators=100, min_samples_leaf=4, criterion="conflict", rf_max_features="sqrt", n_jobs=1)
    y_train_belief = convert_to_mass(train_set[:, 0])

    clf.fit(train_set[:, 1:], y_train_belief)

    An = []
    for row in test_set[

网站公告

今日签到

点亮在社区的每一天
去签到