Объясните и продемонстрируйте взаимную информацию, критерий хи-квадрат, F-критерий ANOVA, t-критерий регрессии и проверку дисперсии для выбора характеристик модели
Полные методы выбора функций
- Статистический тест и анализ
- Корреляционный анализ
- Уменьшение размера
- На основе модели
Взаимная информация (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-функции.
Тест на зависимость хи-квадрат
При выборе функции мы можем использовать критерий независимости хи-квадрат, чтобы определить, существует ли зависимость между категориальной переменной признака и категориальной целевой переменной.
Тест на зависимость хи-квадрат - это тест гипотез, поэтому ниже мы установили два исключительных предположения:
- Нулевая гипотеза H₀: предполагается, что между двумя переменными нет зависимости, две переменные полностью независимы.
- Альтернативная гипотеза Hₐ: предполагается, что между двумя переменными существует зависимость.
При проверке гипотез хи-квадрат нам нужно сравнить следующие результаты
- Ожидаемый результат - мы вычисляем результат, исходя из предположения H₀.
- Наблюдаемый результат - это то, что представляют данные тестирования (обучения).
Давайте воспользуемся тестом хи-квадрат, чтобы проверить, есть ли какая-либо зависимость между полом и выживанием в данных тренировок Титаника.
Первый - создание наблюдаемой таблицы сопряженности из данных обучения, данные обучения - это наблюдаемые данные (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())
Ниже приведены результаты регрессии.
Некоторая информация для приведенных выше результатов регрессии
- Значение коэффициента характеристики P рассчитывается на основе t-статистики в t-распределении.
- Нулевая гипотеза t-критерия H₀: Коэффициенты = 0
В таблице результатов функции INDUS и AGE имеют значение P больше 0,05, поэтому в t-тесте мы не можем отклонить гипотезу H₀ (коэффициенты = 0), поэтому нам нужно удалить две функции. из регрессионной модели.
Также для INDUS и AGE оба диапазона коэффициентов (с доверительной вероятностью 95%) включают 0, коэффициент равен 0 означает, что взаимосвязи нет, и его не следует включать в модель.
Таким образом, в регрессионной модели мы можем использовать значение коэффициента P для выбора (‹0,05) или отбрасывания (› 0,05) признаков.
Проверка отклонений
Проверка дисперсии для выбора функций предназначена для удаления всех функций с низкой дисперсией.
Разница - это информация
Если функция имеет постоянное значение или имеет очень низкую дисперсию, то она не может предоставить никакой информации для прогнозирования модели, и нам необходимо ее удалить.
Резюме
Эта история дает лишь базовое интуитивное представление об использовании статистического теста и анализа для выбора функций, один важный вопрос, который я не включаю, - это условия для этого статистического теста, поэтому будьте осторожны, когда используете эти тесты.
ССЫЛКА
- Логическая статистика (Coursera)
- Сбор информации и взаимная информация для машинного обучения
- Sklearn.feature_selection.mutual_info_classif
- Zedstatistics Тест хи-квадрат на независимость
- Логическая статистика (Coursera)
- Статистика как сделать
- Zedstatistics ANOVA: односторонний дисперсионный анализ
- ANOVA для выбора функций в машинном обучении