Вопрос или проблема
Я использовал 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) для нескольких моделей машинного обучения, вы можете воспользоваться следующими шагами. Прежде чем перейти к коду, убедитесь, что вы уже рассчитали значения метрик для каждой модели.
Шаги для построения столбчатых диаграмм:
-
Подготовьте данные: Убедитесь, что ваши данные о метриках находятся в удобном формате, например, в DataFrame. Для каждой модели создайте запись с соответствующими значениями precision, recall и f-measure.
-
Постройте визуализацию: Используя библиотеку
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()
Пояснение к коду:
- Загрузка данных: В примере используется набор данных по раку молочной железы, загружаемый из
sklearn.datasets
. - Определение моделей: Определяем несколько моделей, которые мы хотим протестировать.
- Расчет метрик: Для каждой модели рассчитываются метрики precision, recall и f-measure с использованием функции
classification_report
. - Подготовка данных для визуализации: Сохраняем метрики в DataFrame для удобного доступа.
- Построение графика: Используем
matplotlib
для создания столбчатой диаграммы, показывающей значения метрик для каждой модели.
Результаты:
После выполнения вышеуказанного кода, вы получите столбчатую диаграмму, которая визуально демонстрирует производительность ваших моделей по различным метрикам, что упрощает сравнение и оценку их эффективности.
Это даст вам хорошее представление о том, какие модели лучше справляются с вашей задачей на основе определенных метрик.