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

#python #pandas #data-visualization #t-test #hypothesis-test

#python #pandas #визуализация данных #t-тест #проверка гипотезы

Вопрос:

Я создал и проанализировал около 16 моделей машинного обучения с использованием WEKA. Прямо сейчас у меня есть CSV-файл, в котором отображаются показатели моделей (такие как percent_correct, F-measure, recall, precision и т.д.). Я пытаюсь провести (модифицированный) t-тест стьюдента для этих моделей. Я могу провести один (согласно ЭТОЙ ссылке), где я сравниваю только ОДНУ переменную, общую только для ДВУХ моделей. Я хочу выполнить (или несколько) t-тесты с НЕСКОЛЬКИМИ переменными и НЕСКОЛЬКИМИ моделями одновременно.

Как уже упоминалось, я могу выполнить тест только с одной переменной (скажем, F-мерой) среди двух моделей (скажем, таблица решений и нейронная сеть).

Вот код для этого. Я выполняю тест Колмогорова-Смирнова (модифицированный 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('Samples are likely drawn from the same distributions (fail to reject H0)')
else:
    print('Samples are likely drawn from different distributions (reject H0)')
  

Есть идеи?

Ответ №1:

Это простое решение моего вопроса. Он имеет дело только с двумя моделями и двумя переменными, но вы могли бы легко иметь списки с именами классификаторов и метриками, которые вы хотите проанализировать. Для моих целей я просто изменяю значения 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 to MAX_INDEX .

 # Written: April 4, 2019

import pandas                       # for visualizations
from matplotlib import pyplot       # for visualizations
from scipy.stats import ks_2samp    # for 2-sample Kolmogorov-Smirnov test
import os                           # for deleting CSV files

# Functions which isolates 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)

# Get the whole DataFrame
df = pandas.read_csv("ExperimentResultsCondensed.csv", index_col=0)
dfCopy = df

# Specified metrics and models for comparison
COI = "Area_under_PRC"
ROI_1 = "weka.classifiers.meta.AdaBoostM1[DecisionTable]"
ROI_2 = "weka.classifiers.meta.AdaBoostM1[DecisionStump]"

# Lists of header and row in dataFrame
#  `rows` may act strangely
headers = list(df.dtypes.index)
rows = list(df.index)

# remove irrelevant rows
df1 = dfCopy.loc[ROI_1]
df2 = dfCopy.loc[ROI_2]

# remove irrelevant columns
removeColumns(df1, headers, COI)
removeColumns(df2, headers, COI)

# Make CSV files
df1.to_csv(str(ROI_1   "-"   COI   ".csv"), index=False)
df2.to_csv(str(ROI_2   "-"   COI)   ".csv", index=False)

results = pandas.DataFrame()
# Read CSV files
# The CSV files can be of any netric/measure, F-measure is used as an example
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]

# Kolmogorov-Smirnov test since we have Non-Gaussian, independent, distinctive variance datasets
# Test configurations
value, pvalue = ks_2samp(results[ROI_1], results[ROI_2])
# Corresponding confidence level: 95%
alpha = 0.05

# Output the results
print('n')
print('33[1m'   '>>>TEST STATISTIC: ')
print(value)
print(">>>P-VALUE: ")
print(pvalue)
if pvalue > alpha:
    print('t>>Samples are likely drawn from the same distributions (fail to reject H0 - NOT SIGNIFICANT)')
else:
    print('t>>Samples are likely drawn from different distributions (reject H0 - SIGNIFICANT)')

# Plot files
df1.plot.density()
pyplot.xlabel(str(COI   " Values"))
pyplot.ylabel(str("Density"))
pyplot.title(str(COI   " Density Distribution of "   ROI_1))
pyplot.show()

df2.plot.density()
pyplot.xlabel(str(COI   " Values"))
pyplot.ylabel(str("Density"))
pyplot.title(str(COI   " Density Distribution of "   ROI_2))
pyplot.show()

# Delete Files
os.remove(str(ROI_1   "-"   COI   ".csv"))
os.remove(str(ROI_2   "-"   COI   ".csv"))