Как выполнить (модифицированный) t-тест для нескольких переменных и моделей в Python (машинное обучение)

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

Я создал и проанализировал около 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' на путь к вашему файлу, а также убедиться, что названия моделей и метрик соответствуют тем, которые у вас в данных.

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

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