Вопрос или проблема
Я создал и проанализировал около 16 моделей машинного обучения, используя WEKA. В данный момент у меня есть CSV-файл, который показывает метрики моделей (такие как percent_correct, F-measure, recall, precision и т.д.). Я пытаюсь провести (модифицированный) t-тест Студента для этих моделей. Я могу провести один (согласно ЭТОЙ ссылке), где сравниваю только ОДНУ переменную, общую для только ДВУХ моделей. Я хочу провести (или несколько) t-тестов с МНОЖЕСТВОМ переменных и МНОЖЕСТВОМ моделей сразу.
Как было сказано, я могу провести тест с одной переменной (скажем, F-measure) среди двух моделей (скажем, таблица решений и нейронная сеть).
Вот код для этого. Я выполняю тест Колмогорова-Смирнова (модифицированный t):
from matplotlib import pyplot
from pandas import read_csv, DataFrame
from scipy.stats import ks_2samp
results = DataFrame()
results['A'] = read_csv('LMT (f-measure).csv', header=None).values[:, 0]
results['B'] = read_csv('LWL (f-measure).csv', header=None).values[:, 0]
print(results.describe())
results.boxplot()
pyplot.show()
results.hist()
pyplot.show()
value, pvalue = ks_2samp(results['A'], results['B'])
alpha = 0.05
print(value, pvalue)
if pvalue > alpha:
print('Выборки, вероятно, взяты из одних и тех же распределений (не отвергать H0)')
else:
print('Выборки, вероятно, взяты из разных распределений (отвергать H0)')
Какие идеи?
Это простое решение для моего вопроса. Оно касается только двух моделей и двух переменных, но вы можете легко создать списки с названиями классификаторов и метрик, которые вы хотите проанализировать. Для моих нужд я просто изменяю значения COI
, ROI_1
и ROI_2
соответственно.
ПРИМЕЧАНИЕ: Это решение также обобщаемо.
Как? Просто измените значения COI
, ROI_1
и ROI_2
и загрузите любой выбранный набор данных в df = pandas.read_csv("FILENAME.csv, ...)
. Если вы хотите другую визуализацию, просто измените настройки pyplot
ближе к концу.
Ключевым моментом было назначение нового DataFrame
исходному DataFrame
и реализация метода .loc["SOMESTRING"]
. Он удаляет все строки в данных, КРОМЕ указанной в качестве параметра.
Тем не менее, помните, что необходимо включить index_col=0
при чтении файла ИЛИ использовать какой-либо другой метод для установки индекса DataFrame
. Без этого ваши значения row
будут просто индексами, от 0 до MAX_INDEX
.
# Написано: 4 апреля 2019 г.
import pandas # для визуализаций
from matplotlib import pyplot # для визуализаций
from scipy.stats import ks_2samp # для 2-выборочного теста Колмогорова-Смирнова
import os # для удаления CSV-файлов
# Функции для изоляции DataFrame
def removeColumns(DataFrame, typeArray, stringOfInterest):
for i in range(0, len(typeArray)):
if typeArray[i].find(stringOfInterest) != -1:
continue
else:
DataFrame.drop(typeArray[i], axis = 1, inplace = True)
# Получить весь DataFrame
df = pandas.read_csv("ExperimentResultsCondensed.csv", index_col=0)
dfCopy = df
# Указанные метрики и модели для сравнения
COI = "Area_under_PRC"
ROI_1 = "weka.classifiers.meta.AdaBoostM1[DecisionTable]"
ROI_2 = "weka.classifiers.meta.AdaBoostM1[DecisionStump]"
# Списки заголовков и строк в dataFrame
# `rows` может вести себя странно
headers = list(df.dtypes.index)
rows = list(df.index)
# удалить несущественные строки
df1 = dfCopy.loc[ROI_1]
df2 = dfCopy.loc[ROI_2]
# удалить несущественные столбцы
removeColumns(df1, headers, COI)
removeColumns(df2, headers, COI)
# Создать CSV-файлы
df1.to_csv(str(ROI_1 + "-" + COI + ".csv"), index=False)
df2.to_csv(str(ROI_2 + "-" + COI) + ".csv", index=False)
results = pandas.DataFrame()
# Чтение CSV-файлов
# CSV-файлы могут быть любой метрики/показателя, F-measure используется в качестве примера
results[ROI_1] = pandas.read_csv(str(ROI_1 + "-" + COI + ".csv"), header=None).values[:, 0]
results[ROI_2] = pandas.read_csv(str(ROI_2 + "-" + COI + ".csv"), header=None).values[:, 0]
# Тест Колмогорова-Смирнова, так как у нас негармоничные, независимые, с отличительной дисперсией данные
# Конфигурации теста
value, pvalue = ks_2samp(results[ROI_1], results[ROI_2])
# Соответствующий уровень доверия: 95%
alpha = 0.05
# Вывод результатов
print('\n')
print('\033[1m' + '>>>ТЕСТОВАЯ СТАТИСТИКА: ')
print(value)
print(">>>P-ZНАЧЕНИЕ: ")
print(pvalue)
if pvalue > alpha:
print('\t>>Выборки, вероятно, взяты из одних и тех же распределений (не отвергать H0 - НЕ СУЩЕСТВЕННО)')
else:
print('\t>>Выборки, вероятно, взяты из разных распределений (отвергать H0 - СУЩЕСТВЕННО)')
# Построить графики
df1.plot.density()
pyplot.xlabel(str(COI + " Значения"))
pyplot.ylabel(str("Плотность"))
pyplot.title(str(COI + " Плотностное распределение " + ROI_1))
pyplot.show()
df2.plot.density()
pyplot.xlabel(str(COI + " Значения"))
pyplot.ylabel(str("Плотность"))
pyplot.title(str(COI + " Плотностное распределение " + ROI_2))
pyplot.show()
# Удалить файлы
os.remove(str(ROI_1 + "-" + COI + ".csv"))
os.remove(str(ROI_2 + "-" + COI + ".csv"))
Ответ или решение
Выполнение модифицированного t-теста для нескольких переменных и моделей в Python
Для выполнения модифицированного t-теста (например, теста Колмогорова-Смирнова) для нескольких переменных и моделей в Python вы можете использовать библиотеку pandas
для обработки данных и scipy.stats
для выполнения статистических тестов. В этом ответе будет представлен пример, как это сделать, а также объяснение каждого шага.
Шаг 1: Подготовка данных
Предположим, у вас есть CSV-файл, содержащий метрики разных моделей, например, точность (percent_correct), F-мера (F-measure), полнота (recall), точность (precision) и т.д. Для начала вам нужно будет загрузить этот файл и обработать данные.
import pandas as pd
# Загрузка данных
df = pd.read_csv('path_to_your_file.csv', index_col=0) # Убедитесь, что устанавливаете index_col
print(df.head()) # Просмотр первых нескольких строк данных
Шаг 2: Определение переменных и моделей для сравнений
Для выполнения тестов вам необходимо определить метрики и модели, которые вы хотите сравнить. Давайте создадим список метрик и моделей.
# Определение метрик и моделей
metrics = ['percent_correct', 'F-measure', 'recall', 'precision']
models = ['model1', 'model2', 'model3'] # Укажите свои модели здесь
Шаг 3: Выполнение тестов для всех модельных пар и метрик
Теперь вы можете создать вложенный цикл для перебора всех пар моделей и метрик. Например, вы можете использовать тест Колмогорова-Смирнова для каждой пары моделей и каждой метрики.
from scipy.stats import ks_2samp
results = []
for metric in metrics:
for i in range(len(models)):
for j in range(i + 1, len(models)):
model_a = models[i]
model_b = models[j]
data_a = df[df['model'] == model_a][metric]
data_b = df[df['model'] == model_b][metric]
# Выполнение теста Колмогорова-Смирнова
statistic, pvalue = ks_2samp(data_a, data_b)
alpha = 0.05
if pvalue > alpha:
results.append((metric, model_a, model_b, statistic, pvalue, 'Fail to reject H0 (similar distributions)'))
else:
results.append((metric, model_a, model_b, statistic, pvalue, 'Reject H0 (different distributions)'))
# Создание DataFrame для хранения результатов
results_df = pd.DataFrame(results, columns=['Metric', 'Model A', 'Model B', 'Test Statistic', 'P-value', 'Result'])
print(results_df)
Шаг 4: Визуализация результатов
После выполнения тестов вы можете визуализировать результаты. Например, ящики с усами (box plots) или графики плотности для наглядного сравнения распределений различных моделей.
import seaborn as sns
import matplotlib.pyplot as plt
# Визуализация
for metric in metrics:
plt.figure(figsize=(10, 6))
sns.boxplot(x='model', y=metric, data=df)
plt.title(f'Comparison of {metric} among models')
plt.show()
Заключение
В этом ответе мы рассмотрели, как выполнить модифицированный t-тест для нескольких переменных и моделей с использованием Python. Мы использовали CSV-файл с метриками моделей, применили тест Колмогорова-Смирнова для оценки распределений и визуализировали результаты.
Не забудьте заменить 'path_to_your_file.csv'
на путь к вашему файлу, а также убедиться, что названия моделей и метрик соответствуют тем, которые у вас в данных.