Как построить столбчатые диаграммы для точности, полноты и f-меры?

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

Я использовал 4 модели машинного обучения для задачи, и теперь я испытываю трудности с построением их столбчатых диаграмм, как показано на изображении ниже. Я печатаю отчет о классификации, чтобы получить точность, полноту и т. д. Мой код показан ниже:

def Statistics(data):
  # Отчет о классификации 
  print("Ниже представлен отчет о классификации")
  print(classification_report(data['actual labels'],data['predicted labels']))

  # Матрица путаницы
  print("Ниже представлена матрица путаницы")
  cm=confusion_matrix(data['actual labels'],data['predicted labels'])
  
  plt.figure(figsize=(10,7))
  sn.heatmap(cm, annot=True,cmap='Blues', fmt="g")
  plt.xlabel('Предсказанные')
  plt.ylabel('Истина')
Statistics(data)

Как я могу построить такой тип графика на Pythonвведите описание изображения здесь

Я сохранил свои фактические и предсказанные метки в CSV-файле. На данные были применены 4 модели. Поэтому я сохранил их фактические и предсказанные метки в CSV-файлы, как показано ниже:

path="/content/drive/MyDrive/CSVs/OriginalCensusRFmodel.csv"
def read_csv(path):
  # Чтение csv
  data=pd.read_csv(path)
  data=data.drop('Unnamed: 0',axis=1)
  return data
data=read_csv(path)

    def Statistics(data):
      # Отчет о классификации 
      print("Ниже представлен отчет о классификации")
      print(classification_report(data['actual labels'],data['predicted labels']))
    
      # Матрица путаницы
      print("Ниже представлена матрица путаницы")
      cm=confusion_matrix(data['actual labels'],data['predicted labels'])
      
      plt.figure(figsize=(10,7))
      sn.heatmap(cm, annot=True,cmap='Blues', fmt="g")
      plt.xlabel('Предсказанные')
      plt.ylabel('Истина')
    Statistics(data)

Попробуйте запустить метод ниже, который использует стратегию кросс-валидации для оценки производительности моделей по различным метрикам.

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

from functools import reduce

def _get_model_name(model):
    """
            Возвращает строку с именем модели sklearn
                model: класс оценщика Sklearn
    """
    if isinstance(model, Pipeline):
        estimator = model.steps[-1][1]
        name = "Pipeline_" + str(estimator)[:str(estimator).find("(")]
    else: 
        name = str(model)[:str(model).find("(")]
    return name
    
    
def plot_cv_score(X, y, models_list, cv = 5, scoring_list = None, refit = True, return_scores = False):
    """ 
            X: numpy_array/pandas dataframe n_rows, m_features
            y: numpy_array/pandas dataframe n_rows
            Строит min, max и avg kfold crosval_score для списка моделей
        
    """
    
    names, mean_score = list(), list()
    ldf = list()
    mnames = list()
    
    for i, model in enumerate(models_list):
        name = _get_model_name(model)
    
        if refit:
            model.fit(X, y)
                
        for metric in score_list:
            
            score = cross_val_score(model, X, y, cv = cv, scoring = metric, n_jobs= -1)
            mean_score.append(np.mean(score))
    
        tmp = pd.DataFrame({name: mean_score}, index = score_list)
        
        ldf.append(tmp)
        
        mean_score = list()
        
    frame_scores = reduce(lambda x,y: pd.merge(x,y, left_index = True, right_index = True), ldf).T
        
    fig, ax  = plt.subplots(1,1, figsize = (10,5))

    frame_scores.plot.bar(ax = ax, cmap = 'RdYlBu', edgecolor = "black")
    ax.legend(loc="best")
    ax.set_xlabel("Оценка")
    ax.set_title("Сравнительный анализ моделей с кросс-валидацией")

    if return_scores:    
        return frame_scores

Пример:

from sklearn.metrics import accuracy_score, f1_score, roc_auc_score
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import cross_val_score
from sklearn.svm import SVC
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.pipeline import Pipeline

X, y = load_breast_cancer(return_X_y= True)

models_list =[LogisticRegression(random_state= 42),
              SVC(probability= True),
              RandomForestClassifier(random_state = 42),
              GaussianNB()]

score_list = ["roc_auc", "accuracy", "f1", "precision", "recall"]

t = plot_cv_score(X = X, y = y, models_list = models_list, cv = 5, scoring_list = score_list, refit = True)

Выводы:

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

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

Для того чтобы построить столбчатые диаграммы для метрик точности (precision), полноты (recall) и f-меры (f-measure) для нескольких моделей машинного обучения, вы можете воспользоваться следующими шагами. Прежде чем перейти к коду, убедитесь, что вы уже рассчитали значения метрик для каждой модели.

Шаги для построения столбчатых диаграмм:

  1. Подготовьте данные: Убедитесь, что ваши данные о метриках находятся в удобном формате, например, в DataFrame. Для каждой модели создайте запись с соответствующими значениями precision, recall и f-measure.

  2. Постройте визуализацию: Используя библиотеку matplotlib, создайте столбчатую диаграмму, отображающую значения для каждой метрики.

Пример кода:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.model_selection import cross_val_predict
from sklearn.metrics import classification_report
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_breast_cancer

# Загрузим данные
X, y = load_breast_cancer(return_X_y=True)

# Список моделей
models = {
    'Logistic Regression': LogisticRegression(max_iter=1000),
    'Support Vector Classifier': SVC(probability=True),
    'Random Forest': RandomForestClassifier()
}

# Подготовка данных для хранения метрик
metrics = {}

# Обход каждой модели для вычисления метрик
for name, model in models.items():
    y_pred = cross_val_predict(model, X, y, cv=5)
    report = classification_report(y, y_pred, output_dict=True)

    metrics[name] = {
        'Precision': report['weighted avg']['precision'],
        'Recall': report['weighted avg']['recall'],
        'F-measure': report['weighted avg']['f1-score']
    }

# Преобразование в DataFrame
metrics_df = pd.DataFrame(metrics).T

# Построение столбчатой диаграммы
metrics_df.plot(kind='bar', figsize=(10, 6), colormap='viridis')
plt.title('Сравнение моделей по метрикам')
plt.ylabel('Значение метрики')
plt.xticks(rotation=45)
plt.grid(axis='y')

# Показать график
plt.tight_layout()
plt.show()

Пояснение к коду:

  1. Загрузка данных: В примере используется набор данных по раку молочной железы, загружаемый из sklearn.datasets.
  2. Определение моделей: Определяем несколько моделей, которые мы хотим протестировать.
  3. Расчет метрик: Для каждой модели рассчитываются метрики precision, recall и f-measure с использованием функции classification_report.
  4. Подготовка данных для визуализации: Сохраняем метрики в DataFrame для удобного доступа.
  5. Построение графика: Используем matplotlib для создания столбчатой диаграммы, показывающей значения метрик для каждой модели.

Результаты:

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

Это даст вам хорошее представление о том, какие модели лучше справляются с вашей задачей на основе определенных метрик.

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

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