Как вычислить информацию, переданную в сообщении для данной выборки данных

Вопрос или проблема

введите описание изображения здесьДанные наборы.

Тестовый набор

Место,цвет,Модель,Категория,Локация,вес,Разновидность,Материал,Объем
1,6,4,4,4,1,1,1,6
2,5,4,4,4,2,6,1,1
1,6,2,1,4,1,4,2,4
1,6,2,1,4,1,2,1,2
2,6,5,5,5,2,2,1,2
1,5,4,4,4,1,6,2,2
1,3,3,3,3,1,6,2,2

Обучающий набор

Место,цвет,Модель,Категория,Локация,вес,Разновидность,Материал,Объем
2,6,4,4,4,2,2,1,1
1,2,4,4,4,1,6,2,6
1,5,4,4,4,1,2,1,6
2,4,4,4,4,2,6,1,4
1,4,4,4,4,1,2,2,2
2,4,3,3,3,2,1,1,1
1,5,2,1,4,1,6,2,6
1,2,3,3,3,1,2,1,6
2,6,4,4,4,2,3,1,1

Я хотел бы рассчитать передаваемое сообщение/полученную информацию через
MC = -p1*log2(p1)-p2*log(p2), где p1 и p2 - вероятности назначения класса 1 или класса 2. В идеале, я хотел бы сделать это для n классов MC = -p1log2(p1) - p2*log2(p2)-...-pn*log2(pn)

Шаг для этого расчета на Шаг 1

from numpy.core.defchararray import count
import pandas as pd
import numpy as np
import numpy as np
from math import ceil, floor, log2
from sklearn.decomposition import PCA
from numpy import linalg as LA
from sklearn.tree import DecisionTreeClassifier

def calculate_metrics(tp, tn, fn, p, n, fp):
    # рассчитать точность, уровень ошибок, чувствительность, специфичность и точность для выбранного классификатора относительно соответствующего тестового набора.
    accuracy = tp + tn /(p+n)
    error_rate = fp + fn /(p + n)
    sensitivity = tp/ p
    precision = tp/ (tp+fp)
    specificity = tn/n

    display_metrics(accuracy, error_rate, sensitivity, precision, specificity)

def display_metrics(accuracy, error_rate, sensitivity, precision, specificity):
    print(f'Точность: {accuracy}, Уровень ошибок:{error_rate}, Чувствительность:{sensitivity}, Точность:{precision}, специфичность:{specificity}')

def ID3(threshold,g):
    # использовать обучающий набор для предсказания тестового набора.
    # использовать Задание 2--Обучающий набор для извлечения правил и проверки качества извлеченных правил на Задании 2--Тестовом наборе для ID3.
    test_set = pd.read_csv("Assignment 2--Test set for ID3.csv")
    training_set = pd.read_csv("Assignment 2--Training set for ID3.csv")

    print(f'test_set: {test_set}')
    print(f'training_set: {training_set}')

    # Шаг 1 - Рассчитать (Передаваемое сообщение) для данного набора данных относительно атрибута класса
    # MC = -p1*log2(p1) - p2*log2(p2)
    # Для n классов MC = -p1log2(p1) - p2*log2(p2)-...-pn*log2(pn)

    # лист, созданный из дерева решений.
    F1 = 0

    # определить c1 количество записей с доминирующим классом в F1
    # Как определить количество записей с доминирующим классом в F1?
    c1 = 0

    # alpha = c1/ |F1|
    # F1 - одно из уникальных значений данного атрибута.
    alpha = c1/ abs(F1)

    # количество записей в тестовом наборе, которые правильно классифицированы правилами, извлеченными из дерева до удаления.
    # Как определить количество записей в тестовом наборе, которые правильно классифицированы правилами, извлеченными из дерева до удаления?
    N = 0

    # количество записей в тестовом наборе, которые правильно классифицированы правилами, извлеченными из дерева.
    # Как определить количество записей в тестовом наборе, которые правильно классифицированы правилами, извлеченными из дерева?
    M = 0

    # параметр и 0 <= g <= 0.15
    g = 0

    if g < 0 or g > 0.15:
        exit()

    # k - общее количество ветвей в поддереве
    # Как определить общее количество ветвей в поддереве?
    k = 0

    if alpha > threshold:
        # остановить разбиение дерева

    # Как применить предварительную обрезку к данным?

    # Для постобрезки используйте критерии ниже
    if (N-M)/Q < g*k:
        # удалить поддерево

    # истинно положительное
    tp = 0 
    # истинно отрицательное
    tn = 0
    # положительное
    p  = 0
    # отрицательное
    n  = 0
    # ложно положительное
    fp = 0

    calculate_metrics(tp, tn, p, n, fp)

def BayesClassifier():
    # использовать задание 2-- обучающий набор для Байеса как обучающий набор для классификации записей тестового набора задания 2 для Байеса
    test_set = pd.read_csv("Assignment 2--Test set for Bayes.csv")
    training_set = pd.read_csv("Assignment 2--Training set for Bayes.csv")

# подсказываем пользователю выбрать классификатор ID3 или Байеса.
selection = input("Пожалуйста, выберите классификацию ID3 или Байес: ")
threshold = input("Пожалуйста, введите порог: ")
g         = input("Пожалуйста, введите значение для g: ")

if(selection == "ID3"):
    ID3(threshold,g)

if(selection == "Bayes"):
    BayesClassifier()

Любая помощь в этом будет очень ценна.

Я смог реализовать план обработки дерева

from numpy.core.defchararray import count
import pandas as pd
import numpy as np
import numpy as np
import math
from math import ceil, floor, log2
from sklearn.decomposition import PCA
from numpy import linalg as LA
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import GaussianNB

# Шаг 1- Рассчитать MC (Передаваемое сообщение) для данного набора данных (давайте назовем его файл TF) относительно атрибута класса 
# MC(TF) = -p1*log2(p1) - p2*log2(p2) 
def mc(classAttribute,attribute,training_set):
    column = training_set[classAttribute]

    if attribute:
        column = training_set[training_set[classAttribute] == attribute] 

    probs = column.value_counts(normalize=True)
    messageConveyed = -1*np.sum(np.log2(probs)*probs)
    return messageConveyed

def wmc(classAttribute,attribute,training_set):
    attributeCount = len(training_set[training_set[classAttribute] == attribute].index)
    total          = len(training_set[classAttribute].index)
    print(f'{attributeCount}/{total}')
    return attributeCount/total

def ID3(root,training_set,test_set):

    highestGainAttribute = ""
    highestGainValue     = -math.inf
    for classAttribute, values in training_set.iteritems():
        messageConveyed = mc(classAttribute, attribute=None, training_set=training_set)
        print(f"{classAttribute} mc: {messageConveyed}")

        attributes = training_set[classAttribute].unique()
        print(f"{classAttribute}\n")
        weightedMessageConveyed = 0
        for attribute in attributes:
            weight = wmc(classAttribute, attribute, training_set)
            messageConveyed = mc(classAttribute, attribute, training_set)
            print(f"wmc({attribute}) = {weight}")
            weightedMessageConveyed += weight*messageConveyed

        print(f'wmc({classAttribute}) = {weightedMessageConveyed}')
        gain = messageConveyed - weightedMessageConveyed
        print(f'MC - wmc({classAttribute}) = {messageConveyed} - {weightedMessageConveyed} = {gain}')
        if gain > highestGainValue:
            highestGainAttribute = classAttribute
            highestGainValue     = gain

    print(f'победитель - {highestGainAttribute} с выигрышем {highestGainValue}')
    root = highestGainAttribute
    leaves = training_set[root].unique()
    splits = {}
    for leaf in  leaves:
        print(f'листья: {leaf} корня: {root}')
        if training_set[training_set[root] == leaf][root].is_unique:
            print(f'все записи для листа: {leaf} одинаковые. НЕТ РАЗДЕЛЕНИЯ')
            splits.update({leaf:"no split"})
            return
        else:
            print(f'все записи для листа: {leaf} НЕ одинаковые. РАЗДЕЛЕНИЕ')
            splits.update({leaf:"split"})

    for leaf,split in splits.items():
        if split == "split":
            print(f"устанавливаем {leaf} как новый набор данных")
            if root in training_set:
                training_set = training_set[training_set[root] == leaf].drop(columns=root)
                ID3(root,training_set,test_set)

# используйте обучающий набор для предсказания тестового набора.
# используйте Задание 2--Обучающий набор для извлечения правил и проверки качества извлеченных правил на Задании 2--Тестовом наборе для ID3.
test_set_ID3 = pd.read_csv("Assignment 2--Test set for ID3.csv")
training_set_ID3 = pd.read_csv("Assignment 2--Training set for ID3.csv")

# подсказываем пользователю выбрать классификатор ID3 или Байеса.
selection = "ID3" #= input("Пожалуйста, выберите классификацию ID3 или Байес: ")
threshold = 0.9   #= input("Пожалуйста, введите порог: ")
g         = 0.05   #= input("Пожалуйста, введите значение для g: ")

root = ""
if(selection == "ID3"):
    print('***********************************')
    print('ОБУЧАЮЩИЙ НАБОР')
    print(training_set_ID3)
    print('***********************************')

    print('***********************************')
    print('ТЕСТОВЫЙ НАБОР')
    print(test_set_ID3)
    print('***********************************')
    ID3(root,training_set_ID3,test_set_ID3)
```

Ответ или решение

Для эффективного вычисления информации, переданной в сообщении в заданном наборе данных, необходимо понимать концепцию, основанную на вероятности и алгоритмах энтропии. Следующий подход позволяет вам рассчитать «Коэффициент Сообщения» (Message Conveyed - MC) с использованием формулы, основанной на вероятностях классов в вашем наборе данных.

Шаги для выполнения расчета

1. Подготовка данных

Включите необходимые библиотеки и загрузите ваши обучающие и тестовые наборы данных. Убедитесь, что данные очищены и готовы к анализу. Это обычно включает обработку отсутствующих значений и приведение столбцов к соответствующим типам.

import pandas as pd
import numpy as np

test_set = pd.read_csv("Assignment 2--Test set for ID3.csv")
training_set = pd.read_csv("Assignment 2--Training set for ID3.csv")

2. Расчет вероятностей

Чтобы вычислить количество информации, переданной сообщением, сначала необходимо определить вероятности классов. Это можно сделать с помощью функции, которая получает все уникальные значения классовой переменной и вычисляет их частоты в наборе данных.

def calculate_probabilities(classAttribute, dataset):
    probabilities = dataset[classAttribute].value_counts(normalize=True)
    return probabilities

3. Использование формулы для расчета MC

С помощью формулы вычисления сообщения MC = -Σ (p_i * log2(p_i)), где p_i — это вероятность класса i, вы можете сосчитать общую информацию, переданную с сообщениями.

def calculate_message_conveyed(classAttribute, dataset):
    probabilities = calculate_probabilities(classAttribute, dataset)
    message_conveyed = -np.sum(probabilities * np.log2(probabilities))
    return message_conveyed

Вызовите эту функцию для ваших наборов данных, указав класс-атрибут, который вы хотите анализировать. Это может быть любая из ваших переменных.

class_attribute = 'Model'  # Пример атрибута класса
mc_value = calculate_message_conveyed(class_attribute, training_set)
print(f"Message Conveyed for {class_attribute}: {mc_value}")

4. Интерпретация результатов

Результат вычисления MC даст вам представление о том, насколько класс-атрибут информативен. Чем выше значение MC, тем больше информация содержится в классе, что поможет в дальнейшем улучшении выборки данных и разработки эффективных моделей машинного обучения.

Заключение

Расчет информации, переданной сообщением, является важным шагом в анализе данных и машинном обучении. Понимание вероятностей классов и методологии вычисления энтропии не только помогает определить значимость данных, но и улучшает результаты предсказаний ваших моделей. Применяйте этот подход к вашему набору данных и адаптируйте его по мере необходимости для получения наилучших результатов анализа.

Оцените материал
Добавить комментарий

Капча загружается...