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

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

Что такое корреляция?

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

Например, две линейно зависимые переменные (скажем, x и y, которые зависят друг от друга как x = 2y) будут иметь более высокую корреляцию, чем две переменные, которые не являются -линейно зависимые (скажем, u и v, которые зависят друг от друга как u = v2)

Как корреляция помогает в выборе функций?

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

P-значение

Прежде чем мы попытаемся разобраться в p-значении, нам нужно узнать о нулевой гипотезе.

Нулевая гипотеза - это общее утверждение, что нет никакой связи между двумя измеряемыми явлениями.

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

Источник: Википедия

Для получения дополнительной информации о нулевой гипотезе ознакомьтесь с приведенной выше статьей в Википедии.

Что такое p-значение?

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

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

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

Как значение p помогает в выборе характеристик?

Удаление различных объектов из набора данных по-разному повлияет на значение p для набора данных. Мы можем удалить различные функции и измерить p-значение в каждом случае. Эти измеренные значения p можно использовать для принятия решения о сохранении объекта.

Реализация

Импортируйте необходимые библиотеки

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
import warnings
warnings.filterwarnings("ignore")
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import confusion_matrix
np.random.seed(123)

numpy.random.seed() делает случайные числа предсказуемыми и используется для воспроизводимости

Набор данных

Используемый здесь набор данных - Набор данных по раку молочной железы, штат Висконсин (диагностический).

Этот набор данных содержит 569 записей и 32 объекта (включая Id). Функции представляют собой различные параметры, которые могут быть полезны для прогнозирования злокачественной или доброкачественной опухоли.

Загрузка набора данных

data = pd.read_csv('../input/data.csv')

Удаление столбцов Id и Безымянный

data = data.iloc[:,1:-1]

Далее мы кодируем Категориальную переменную

label_encoder = LabelEncoder()
data.iloc[:,0] = label_encoder.fit_transform(data.iloc[:,0]).astype('float64')

Выбор функций на основе корреляции

Создание корреляционной матрицы

corr = data.corr()

Создание корреляционной тепловой карты

sns.heatmap(corr)

Затем мы сравниваем корреляцию между функциями и удаляем одну из двух функций, у которых корреляция выше 0,9.

columns = np.full((corr.shape[0],), True, dtype=bool)
for i in range(corr.shape[0]):
    for j in range(i+1, corr.shape[0]):
        if corr.iloc[i,j] >= 0.9:
            if columns[j]:
                columns[j] = False
selected_columns = data.columns[columns]
data = data[selected_columns]

Теперь в наборе данных есть только те столбцы с корреляцией менее 0,9.

Выбор столбцов на основе p-значения

Далее мы будем выбирать столбцы в зависимости от того, как они влияют на значение p. Мы удаляем столбец diagnosis, потому что это столбец, который мы пытаемся предсказать.

selected_columns = selected_columns[1:].values
import statsmodels.formula.api as sm
def backwardElimination(x, Y, sl, columns):
    numVars = len(x[0])
    for i in range(0, numVars):
        regressor_OLS = sm.OLS(Y, x).fit()
        maxVar = max(regressor_OLS.pvalues).astype(float)
        if maxVar > sl:
            for j in range(0, numVars - i):
                if (regressor_OLS.pvalues[j].astype(float) == maxVar):
                    x = np.delete(x, j, 1)
                    columns = np.delete(columns, j)
                    
    regressor_OLS.summary()
    return x, columns
SL = 0.05
data_modeled, selected_columns = backwardElimination(data.iloc[:,1:].values, data.iloc[:,0].values, SL, selected_columns)

Вот что мы делаем в приведенном выше блоке кода:

  • Мы принимаем нулевую гипотезу как «Выбранная комбинация зависимых переменных не оказывает никакого влияния на независимую переменную».
  • Затем мы строим небольшую регрессионную модель и вычисляем значения p.
  • Если значения p выше порогового значения, мы отбрасываем эту комбинацию функций.

Затем мы перемещаем результат в новый фрейм данных.

result = pd.DataFrame()
result['diagnosis'] = data.iloc[:,0]

Создание Dataframe со столбцами, выбранными с использованием p-значения и корреляции

data = pd.DataFrame(data = data_modeled, columns = selected_columns)

Визуализация выбранных функций

Построение данных для визуализации их распределения

fig = plt.figure(figsize = (20, 25))
j = 0
for i in data.columns:
    plt.subplot(6, 4, j+1)
    j += 1
    sns.distplot(data[i][result['diagnosis']==0], color='g', label = 'benign')
    sns.distplot(data[i][result['diagnosis']==1], color='r', label = 'malignant')
    plt.legend(loc='best')
fig.suptitle('Breast Cance Data Analysis')
fig.tight_layout()
fig.subplots_adjust(top=0.95)
plt.show()

Теперь разделим данные на набор для обучения и тестирования. 20% данных используется для создания тестовых данных и 80% для создания данных поезда.

x_train, x_test, y_train, y_test = train_test_split(data.values, result.values, test_size = 0.2)

Построение модели с выбранными элементами

Мы используем Классификатор опорных векторов с Ядром Гаусса, чтобы делать прогнозы. Мы обучим модель на данных нашего поезда и рассчитаем точность модели, используя тестовые данные.

svc=SVC() # The default kernel used by SVC is the gaussian kernel
svc.fit(x_train, y_train)

Прогнозы и расчет точности

prediction = svc.predict(x_test)

Здесь мы используем матрицу путаницы

cm = confusion_matrix(y_test, prediction)
sum = 0
for i in range(cm.shape[0]):
    sum += cm[i][i]
    
accuracy = sum/x_test.shape[0]
print(accuracy)

Полученная точность составила 0,9298245614035088.

Построение модели без выбора элементов и сравнение результатов

Затем мы повторяем все вышеперечисленные шаги, кроме выбора функции, а именно:

  • Загрузка данных
  • Удаление ненужных столбцов
  • Кодирование категориальной переменной
  • Разделение данных на поезд и тестовый набор
  • Подгонка данных к модели
  • Прогнозы и расчет точности
data = pd.read_csv('../input/data.csv')          
result = pd.DataFrame()
result['diagnosis'] = data.iloc[:,1]
data = data.iloc[:,2:-1]                         
label_encoder = LabelEncoder()              
data.iloc[:,0] = label_encoder.fit_transform(data.iloc[:,0]).astype('float64')    
x_train, x_test, y_train, y_test = train_test_split(data.values, result.values, test_size = 0.2)      
svc = SVC()
svc.fit(x_train, y_train)
prediction = svc.predict(x_test)
cm = confusion_matrix(y_test, prediction)
sum = 0
for i in range(cm.shape[0]):
    sum += cm[i][i]
    
accuracy = sum/x_test.shape[0]                
print(accuracy)

Полученная точность составила 0,7017543859649122.

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

Нажмите здесь, чтобы получить эту статью в виде портативного компьютера IPython.