Найти в Дзене
Степан Вещает

Метрики оценки качества классификации.

Оглавление

Для оценки качества кластеризации, такие как weighted accuracy и F-1 score, нам потребуется, чтобы у нас были как истинные метки кластеров, так и предсказанные метки кластеров. Мы будем использовать scikit-learn для вычисления этих метрик.

Вот как можно вычислить weighted accuracy и F-1 score для кластеризации:

import pandas as pd from sklearn.metrics
import accuracy_score, f1_score

# Пример DataFrame
data = {
'id': [1, 2, 3, 4, 5],
'category': ['A', 'B', 'A', 'C', 'B'],
'text': ['text1', 'text2', 'text3', 'text4', 'text5'],
'name': ['John Doe', 'Jane Smith', 'Alice Johnson', 'Bob Brown', 'Charlie White'],
'district': ['District 1', 'District 2', 'District 1', 'District 3', 'District 2'],
'true_cluster': [0, 1, 0, 2, 1], # Истинные метки кластеров
'predicted_cluster': [0, 1, 0, 2, 2] # Предсказанные метки кластеров
}

parsed_data = pd.DataFrame(data) # Истинные и предсказанные метки кластеров

true_labels = parsed_data['true_cluster']
predicted_labels = parsed_data['predicted_cluster']

# Вычисление accuracy
accuracy = accuracy_score(true_labels, predicted_labels)
print(f'Accuracy: {accuracy:.4f}')
# Вычисление F1-Score
f1 = f1_score(true_labels, predicted_labels, average='weighted')
print(f'Weighted F1-Score: {f1:.4f}')

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

  • Accuracy: Показывает, какой процент меток кластеров был правильно предсказан.
  • Weighted F1-Score: Учитывает как точность (precision), так и полноту (recall) для каждой кластеры и дает взвешенное среднее значение, что особенно полезно при наличии несбалансированных классов.

Если предсказанные метки не определены

import pandas as pd
from sklearn.cluster import DBSCAN
from sklearn.preprocessing import LabelEncoder, StandardScaler
from sklearn.metrics import accuracy_score, f1_score

# Пример данных
data = {
'id': [1, 2, 3, 4, 5],
'category': ['A', 'B', 'A', 'C', 'B'],
'text': ['text1', 'text2', 'text3', 'text4', 'text5'],
'name': ['John Doe', 'Jane Smith', 'Alice Johnson', 'Bob Brown', 'Charlie White'],
'district': ['District 1', 'District 2', 'District 1', 'District 3', 'District 2'],
'true_cluster': [0, 1, 0, 2, 1]
}

parsed_data = pd.DataFrame(data)

# Преобразование категориальных данных в числовые
label_encoders = {}
for column in ['category', 'text', 'name', 'district']:
le = LabelEncoder()
parsed_data[column] = le.fit_transform(parsed_data[column])
label_encoders[column] = le

# Использование только признаков для кластеризации
features = parsed_data[['category', 'text', 'name', 'district']]

# Стандартизация признаков
scaler = StandardScaler()
scaled_features = scaler.fit_transform(features)

# Инициализация и обучение модели DBSCAN
dbscan = DBSCAN(eps=0.5, min_samples=2)
parsed_data['predicted_cluster'] = dbscan.fit_predict(scaled_features)

# Фильтрация шумовых точек
non_noise_mask = parsed_data['predicted_cluster'] != -1
true_labels = parsed_data[non_noise_mask]['true_cluster']
predicted_labels = parsed_data[non_noise_mask]['predicted_cluster']

# Вычисление accuracy
accuracy = accuracy_score(true_labels, predicted_labels)
print(f'Accuracy: {accuracy:.4f}')

# Вычисление F1-Score
f1 = f1_score(true_labels, predicted_labels, average='weighted')
print(f'Weighted F1-Score: {f1:.4f}')