Объясните и продемонстрируйте взаимную информацию, критерий хи-квадрат, F-критерий ANOVA, t-критерий регрессии и проверку дисперсии для выбора характеристик модели

Полные методы выбора функций

  1. Статистический тест и анализ
  2. Корреляционный анализ
  3. Уменьшение размера
  4. На основе модели

Взаимная информация (MI)

В статистике взаимная информация (MI) двух случайных величин является мерой взаимной зависимости между двумя переменными. MI равен нулю, если две случайные величины независимы, а более высокие значения означают более высокую зависимость.

Для выбора функции мы можем использовать MI для измерения зависимости переменной функции и целевой переменной. MI можно представить следующим образом:

I(x , y) = H(y) - H(y|x)

H - энтропия

Интуиция для I (x, y) такова: если мы используем y для целевой переменной и x для переменной функции, то I (x, y) показывает, насколько уменьшилась целевая неопределенность (энтропия), если нам известна функция x.

I (x, y) также вызывает получение информации, если мы знаем, что x предсказывает y.

В следующем примере используются предварительно подготовленные Титанические данные для демонстрации того, как рассчитать MI для выбора функции.

Чтобы проверить действительность MI, я добавляю случайную функцию, которая предположительно не имеет отношения к цели, и ее значение MI должно быть 0.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import preprocessing
from sklearn import feature_selection as fs
%matplotlib inline

training_df = pd.read_csv('Titanic_Preprocessed.csv')
# Change the categorical feature value into numeric value
sex_map = {'male':0, 'female':1}
training_df['Sex'] = training_df['Sex'].map(sex_map)
embarked_map = {'C':0, 'Q':1, 'S':2}
training_df['Embarked'] = training_df['Embarked'].map(embarked_map)
deck_map = {'A':1,'B':2,'C':3,'D':4,'E':5,'F':6,'G':7,'T':8,'Unknown':9}
training_df['Deck'] = training_df['Deck'].map(deck_map)
le = preprocessing.LabelEncoder()
training_df['Title'] = le.fit_transform(training_df['Title'])
# Add a random feature to verify MI
training_df['Random'] = np.random.randint(1, 5, training_df.shape[0])
training_df.head(10)

mi_score = fs.mutual_info_classif(
    data, 
    target, 
    n_neighbors=10,
    random_state=22)
sorted_idx = np.argsort(mi_score)
mi_scoredf = pd.DataFrame(
    mi_score[sorted_idx[::-1]], 
    index=data.columns[sorted_idx[::-1]], 
    columns=['mi_score'])
plt.barh(
    data.columns[sorted_idx], 
    mi_score[sorted_idx])
plt.xlabel("Mutual Information Score")

Как и ожидалось, случайная функция (добавляемая вручную функция со случайным значением) оценка MI очень близка к 0, и на основе оценки MI всех функций мы можем выбрать лучшие K-функции.

Тест на зависимость хи-квадрат

При выборе функции мы можем использовать критерий независимости хи-квадрат, чтобы определить, существует ли зависимость между категориальной переменной признака и категориальной целевой переменной.

Тест на зависимость хи-квадрат - это тест гипотез, поэтому ниже мы установили два исключительных предположения:

  1. Нулевая гипотеза H₀: предполагается, что между двумя переменными нет зависимости, две переменные полностью независимы.
  2. Альтернативная гипотеза Hₐ: предполагается, что между двумя переменными существует зависимость.

При проверке гипотез хи-квадрат нам нужно сравнить следующие результаты

  1. Ожидаемый результат - мы вычисляем результат, исходя из предположения H₀.
  2. Наблюдаемый результат - это то, что представляют данные тестирования (обучения).

Давайте воспользуемся тестом хи-квадрат, чтобы проверить, есть ли какая-либо зависимость между полом и выживанием в данных тренировок Титаника.

Первый - создание наблюдаемой таблицы сопряженности из данных обучения, данные обучения - это наблюдаемые данные (Titanic data).

Второе. Основываясь на предположении H₀, переменная пола и выжившего не имеет отношения зависимости, мы можем рассчитать ожидаемую статистику.

Количество выживших самцов будет (342/891) * 577 = 221,47.

Количество не выживших самцов будет (549/891) * 577 = 355,53.

Тот же способ расчета для женщин, поэтому мы можем получить таблицу ожидаемых непредвиденных обстоятельств.

Формула значения хи-квадрат приведена ниже.

В нашем примере значение хи-квадрат равно

X² = (109–221.47)²/221.47 + (468–355.53)²/355.53 + (233–120.53)²/120.53+ (81–193.47)²/193.47=57.12 +35.58 + 104.95 + 65.38= 263.03

Степени свободы (DF): (2–1) * (2–1) = 1

Третье - проверьте правило принятия решения

Распределение хи-квадрат DF = 1 показано ниже.

Поскольку наш пример X ² = 263,03 ›3,84, который попадает в область отклонения p = 0,05, мы отклоняем H₀ и принимаем предположение Hₐ, поэтому на основании данных обучения мы считаем, что выживший имеет отношения зависимости с полом, и мы должны включить в модель половые признаки.

Для отклонения p = 0,05 простое обучение: на основе результатов тестирования (данных обучения) вероятность того, что предположение H₀ верное, составляет менее 5%, поэтому H₀ отвергается.

Библиотека Python scipy также предоставляет функцию для вычисления показателя хи-квадрат и соответствующего ему p-значения.

from scipy import stats
contingency_table = pd.crosstab(
    training_df.Sex,
    training_df.Survived,
    margins = False).values
chi2_stat, p_val, dof, ex = stats.chi2_contingency(
    contingency_table)
chi2_stat, p_val, dof
# (260.71702016732104, 1.1973570627755645e-58, 1)

Результатом будет X ² = 260,717 и значение p = 1,197e-58, поскольку значение p ‹ 0,05, поэтому мы не можем отказаться от предположения о независимости. (Существует небольшая разница X ² между 260,717 и моим вручную вычисленным результатом 263,03, потому что округление в моем расчет)

Давайте попробуем вычислить X ² для случайной функции (добавляемая вручную функция со случайным значением) и выживаемости

contingency_table = pd.crosstab(
    training_df.Random,
    training_df.Survived,
    margins = False).values
chi2_stat, p_val, dof, ex = stats.chi2_contingency(
    contingency_table)
chi2_stat, p_val, dof
# (3.8388816678946247, 0.2793958179574679, 3)

Выходное p-значение составляет 0,279, что составляет ›0,05, поэтому мы не можем отклонить предположение о независимости, поэтому мы можем исключить случайную функцию при моделировании, и это то, что мы ожидаем.

ANOVA F-тест

ANOVA означает дисперсионный анализ, основная цель ANOVA - проверить, значительно ли две или более группы отличаются друг от друга по одной или нескольким характеристикам. F-тест - это другое название ANOVA, который сравнивает только статистические средние в группах.

Для выбора характеристик мы специально используем односторонний тест ANOVA, и обычно тест применяется к категориальному признаку и числовой цели.

Интуиция при выборе функций ANOVA F-теста

Например, учитывая категориальную функцию «Класс», которая имеет три категории: A, B, C и числовое значение «Оценка»

Мы хотим знать, имеет ли функция «Класс» какую-либо прогностическую силу для целевого «Оценка»?

Решение ANOVA заключается в сравнении среднего значения оценки в каждой категории класса.

Давайте сравним две нижеприведенные крайние прямоугольные диаграммы Оценка для Класс категории A, B, C

Очевидно, что если распределение Оценка для категории Класс - это 2-й график, то функция Класс имеет очень хорошую предсказательную силу. , но на 1-м графике очень сложно предсказать балл по классу. Вывод: нам нужно, чтобы средние значения категорий были хорошо разделены, чтобы иметь лучшую предсказательную силу.

Основываясь на вышеупомянутой интуиции, ANOVA F-Test установил следующее предположение гипноза:

Нулевая гипотеза H₀: Средние значения всех категорий одинаковы (например, μ A = μ B = μ C)

Альтернативная гипотеза Hₐ: средние значения по крайней мере для одной из категорий отличаются

Если результат теста не может отклонить H₀, нам нужно отказаться от этой функции.

Ниже приведен пример использования Набор данных набора данных UCI Bike Sharing для иллюстрации процесса F-теста.

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
Bike_Sharing_df = pd.read_csv('Bike-Sharing-Dataset\day.csv')
Bike_Sharing_df['season'].replace(
    {1: 'winter', 2: 'spring', 3: 'summer', 4:'fall'}, 
    inplace= True)
# Add a random feature to verify ANOVA Test
Bike_Sharing_df['random'] = np.random.randint(
    1, 
    5, 
    Bike_Sharing_df.shape[0])
Bike_Sharing_df[["dteday","season","random","cnt"]].head()

Мы вручную рассчитаем оценку F-теста для функции (x) сезон и цели (y) cnt на основе приведенной ниже формулы F Score,

1. Вычислить SST - SST - это общая сумма квадратов.

grand_mean = Bike_Sharing_df['cnt'].mean()
SST = ((Bike_Sharing_df['cnt'] - grand_mean)**2).sum()

SST = 2739535392.0465117

2. Вычислить SSG - SSG - это сумма квадратов между группой (или категорией)

ssg_df = Bike_Sharing_df\
    .groupby('season')['cnt']\
    .agg({'count','mean'})\
    .reset_index()\
    .rename(columns={'mean':'category_mean'})
ssg_df['ssg'] = (ssg_df['category_mean'] - grand_mean)**2*ssg_df['count']
SSG = ssg_df['ssg'].sum()

SSG = 950595868.4582922

3. Вычислить SSE - SSE представляет собой сумму квадратов внутри групп

SSE = SST - SSG = 2739535392 - 950595868 = 1788939524

4. Вычислить dfG - dfG - это степени свободы между группами.

Bike_Sharing_df['season'].value_counts()

dfG = Количество групп - 1 = 4 - 1 = 3

5. Вычислить dfE - dfE - это сумма степеней свободы всех групп, свобода каждой группы - это количество экземпляров в этой группе минус 1

dfE = (188–1) + (184–1) + (181–1) + (178–1) = 727

6. Рассчитать оценку F

F = (SSG / dfG) / (SSE / dfE) = (950595868/3) / (1788939524/727)

F = 128.7696

7. Рассчитайте критическое значение с P-значением = 0,05 из одностороннего распределения F.

import scipy.stats
critical_value = scipy.stats.f.ppf(q=1-0.05, dfn=3, dfd=727)
critical_value

Критическое значение - 2,617.

Поскольку наш рейтинг F составляет 128,7696 ›2,617, поэтому мы отклоняем нулевую гипотезу H₀, поэтому нам может потребоваться включить сезон функций в моделирование.

Давайте посчитаем F-рейтинг для случайной характеристики (функция, которую мы добавляем со случайной категорией), и на этот раз мы будем использовать библиотеку Python для расчета F-Score.

import scipy.stats as stats
stats.f_oneway(
    Bike_Sharing_df['cnt'][Bike_Sharing_df['random'] == 1],
    Bike_Sharing_df['cnt'][Bike_Sharing_df['random'] == 2],
    Bike_Sharing_df['cnt'][Bike_Sharing_df['random'] == 3],
    Bike_Sharing_df['cnt'][Bike_Sharing_df['random'] == 4])

Выход для случайной функции

F_onewayResult(statistic=1.7111487734775328, pvalue=0.1632934027349846)

Оценка F составляет 1,71, а значение P составляет 0,16.

Поскольку P-значение 0,16> 0,05, поэтому нельзя отклонить нулевую гипотезу H₀, поэтому нам нужно исключить случайную характеристику как функцию модели, и это то, что мы ожидаем.

Т-тест линейной регрессии

Давайте посмотрим на пример линейной регрессии для Boston House

import numpy as np
import pandas as pd
import statsmodels.api as sm
from sklearn.datasets import load_boston
boston = load_boston()
X = pd.DataFrame(boston.data, columns=boston.feature_names)
y = boston.target
x_features = sm.add_constant(X)
ols_model = sm.OLS(y, x_features)
fit_results = ols_model.fit()
print(fit_results.summary())

Ниже приведены результаты регрессии.

Некоторая информация для приведенных выше результатов регрессии

  1. Значение коэффициента характеристики P рассчитывается на основе t-статистики в t-распределении.
  2. Нулевая гипотеза t-критерия H₀: Коэффициенты = 0

В таблице результатов функции INDUS и AGE имеют значение P больше 0,05, поэтому в t-тесте мы не можем отклонить гипотезу H₀ (коэффициенты = 0), поэтому нам нужно удалить две функции. из регрессионной модели.

Также для INDUS и AGE оба диапазона коэффициентов (с доверительной вероятностью 95%) включают 0, коэффициент равен 0 означает, что взаимосвязи нет, и его не следует включать в модель.

Таким образом, в регрессионной модели мы можем использовать значение коэффициента P для выбора (‹0,05) или отбрасывания (› 0,05) признаков.

Проверка отклонений

Проверка дисперсии для выбора функций предназначена для удаления всех функций с низкой дисперсией.

Разница - это информация

Если функция имеет постоянное значение или имеет очень низкую дисперсию, то она не может предоставить никакой информации для прогнозирования модели, и нам необходимо ее удалить.

Резюме

Эта история дает лишь базовое интуитивное представление об использовании статистического теста и анализа для выбора функций, один важный вопрос, который я не включаю, - это условия для этого статистического теста, поэтому будьте осторожны, когда используете эти тесты.

ССЫЛКА

  1. Логическая статистика (Coursera)
  2. Сбор информации и взаимная информация для машинного обучения
  3. Sklearn.feature_selection.mutual_info_classif
  4. Zedstatistics Тест хи-квадрат на независимость
  5. Логическая статистика (Coursera)
  6. Статистика как сделать
  7. Zedstatistics ANOVA: односторонний дисперсионный анализ
  8. ANOVA для выбора функций в машинном обучении