Машинное обучение, Программирование

Выбор функций в Python

Практический пример того, как можно выбрать самые важные функции

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

Будем работать с датасетом рак груди. Давайте начнем:

import pandas as pd
import numpy as np
from scipy import stats
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import SelectFpr, chi2, SelectKBest, SelectFwe, f_classif, SelectFdr
import matplotlib.pyplot as plt
%matplotlib inline
# https://www.kaggle.com/uciml/breast-cancer-wisconsin-data?select=data.csv
df = pd.read_csv("data.csv")
# replace M with 1 and B with 0
my_map = {
          'M':1,
          'B' :0
         }
df['diagnosis'] = df['diagnosis'].map(my_map)
# remove the id column
df.drop(['id'], axis=1, inplace=True)
df

Статистически значимые характеристики с t-критерием

Поскольку наша цель двоичная, мы можем сравнить значения независимых переменных для каждой группы (0,1), применив t-test.

my_important = []
for c in df.columns[1:]:
    pvalue = stats.ttest_ind(df.loc[df.diagnosis==1][c], df.loc[df.diagnosis==0][c])[1]
    if pvalue<0.05:
        my_important.append(c)
        print(f'The variable {c} is statistically significant with a pvalue = {pvalue:.2}')
    else:
        print(f'The variable {c} is NOT statistically significant')

И получаем:

The variable radius_mean is statistically significant with a pvalue = 8.5e-96
The variable texture_mean is statistically significant with a pvalue = 4.1e-25
The variable perimeter_mean is statistically significant with a pvalue = 8.4e-101
The variable area_mean is statistically significant with a pvalue = 4.7e-88
The variable smoothness_mean is statistically significant with a pvalue = 1.1e-18
The variable compactness_mean is statistically significant with a pvalue = 3.9e-56
The variable concavity_mean is statistically significant with a pvalue = 1e-83
The variable concave points_mean is statistically significant with a pvalue = 7.1e-116
The variable symmetry_mean is statistically significant with a pvalue = 5.7e-16
The variable fractal_dimension_mean is NOT statistically significant
The variable radius_se is statistically significant with a pvalue = 9.7e-50
The variable texture_se is NOT statistically significant
The variable perimeter_se is statistically significant with a pvalue = 1.7e-47
The variable area_se is statistically significant with a pvalue = 5.9e-46
The variable smoothness_se is NOT statistically significant
The variable compactness_se is statistically significant with a pvalue = 1e-12
The variable concavity_se is statistically significant with a pvalue = 8.3e-10
The variable concave points_se is statistically significant with a pvalue = 3.1e-24
The variable symmetry_se is NOT statistically significant
The variable fractal_dimension_se is NOT statistically significant
The variable radius_worst is statistically significant with a pvalue = 8.5e-116
The variable texture_worst is statistically significant with a pvalue = 1.1e-30
The variable perimeter_worst is statistically significant with a pvalue = 5.8e-119
The variable area_worst is statistically significant with a pvalue = 2.8e-97
The variable smoothness_worst is statistically significant with a pvalue = 6.6e-26
The variable compactness_worst is statistically significant with a pvalue = 7.1e-55
The variable concavity_worst is statistically significant with a pvalue = 2.5e-72
The variable concave points_worst is statistically significant with a pvalue = 2e-124
The variable symmetry_worst is statistically significant with a pvalue = 3e-25
The variable fractal_dimension_worst is statistically significant with a pvalue = 2.3e-15

Итак, статистически значимыми переменными являются:

my_important
['radius_mean',
 'texture_mean',
 'perimeter_mean',
 'area_mean',
 'smoothness_mean',
 'compactness_mean',
 'concavity_mean',
 'concave points_mean',
 'symmetry_mean',
 'radius_se',
 'perimeter_se',
 'area_se',
 'compactness_se',
 'concavity_se',
 'concave points_se',
 'radius_worst',
 'texture_worst',
 'perimeter_worst',
 'area_worst',
 'smoothness_worst',
 'compactness_worst',
 'concavity_worst',
 'concave points_worst',
 'symmetry_worst',
 'fractal_dimension_worst']

Важность функции случайного леса

Мы также можем запустить модель, например Random Forest, и посмотреть, какие функции являются наиболее важными.

clf = RandomForestClassifier( n_estimators=50)
X = df.drop(['diagnosis'], axis=1)
y = df.diagnosis
model = clf.fit(X,y)
feat_importances = pd.DataFrame(model.feature_importances_, index=X.columns, columns=["Importance"])
feat_importances.sort_values(by='Importance', ascending=False, inplace=True)
feat_importances.plot(kind='bar')

Давайте посмотрим на 10 самых важных функций по версии Random Forest:

feat_importances.index[0:10]

Мы получаем:

Index(['concave points_worst', 'perimeter_worst', 'radius_worst', 'concave points_mean', 'area_worst', 'perimeter_mean', 'area_mean', 'concavity_worst', 'area_se', 'perimeter_se'], dtype='object')

Выбор функций с помощью Scikit-Learn

Мы можем работать с scikit-learn. Более подробную информацию вы можете найти в документации. Приведем несколько примеров:

k-лучший

Он выбирает k наиболее важных функций. В нашем случае мы будем работать с тестом хи-квадрат. Имейте в виду, что новые_данные - это окончательные данные после того, как мы удалили незначимые переменные.

selector = SelectKBest(score_func=chi2, k=5)
new_data = selector.fit_transform(X, y)
mask = selector.get_support()
new_features = X.columns[mask]
new_features

Мы получаем:

Index(['perimeter_mean', 'area_mean', 'area_se', 'perimeter_worst', 'area_worst'], dtype='object')

Fwe

Это похоже на то, что мы делали в начале с t-тестом. Это можно сделать с помощью chi-square test или ANOVA (при этом двоичный регистр совпадает с t-тестом)

Хи-квадрат

# chi-ssquare
selector = SelectFwe(score_func=chi2, alpha=0.05)
new_data = selector.fit_transform(X, y)
mask = selector.get_support()
new_features = X.columns[mask]
new_features

Мы получаем:

Index(['radius_mean', 'texture_mean', 'perimeter_mean', 'area_mean',
       'concavity_mean', 'concave points_mean', 'radius_se', 'perimeter_se',
       'area_se', 'radius_worst', 'texture_worst', 'perimeter_worst',
       'area_worst', 'compactness_worst', 'concavity_worst',
       'concave points_worst'],
      dtype='object')

ANOVA

selector = SelectFwe(score_func=f_classif, alpha=0.05)
new_data = selector.fit_transform(X, y)
mask = selector.get_support()
new_features = X.columns[mask]
new_features

Мы получаем:

Index(['radius_mean', 'texture_mean', 'perimeter_mean', 'area_mean',
       'smoothness_mean', 'compactness_mean', 'concavity_mean',
       'concave points_mean', 'symmetry_mean', 'radius_se', 'perimeter_se',
       'area_se', 'compactness_se', 'concavity_se', 'concave points_se',
       'radius_worst', 'texture_worst', 'perimeter_worst', 'area_worst',
       'smoothness_worst', 'compactness_worst', 'concavity_worst',
       'concave points_worst', 'symmetry_worst', 'fractal_dimension_worst'],
      dtype='object')

FDR

Коэффициент ложного обнаружения (FDR) учитывает множественные сравнения.

selector = SelectFdr(chi2, alpha=0.05)
new_data = selector.fit_transform(X, y)
mask = selector.get_support()
new_features = X.columns[mask]
new_features

Мы получаем:

Index(['radius_mean', 'texture_mean', 'perimeter_mean', 'area_mean',
       'compactness_mean', 'concavity_mean', 'concave points_mean',
       'radius_se', 'perimeter_se', 'area_se', 'radius_worst', 'texture_worst',
       'perimeter_worst', 'area_worst', 'compactness_worst', 'concavity_worst',
       'concave points_worst'],
      dtype='object')

Из модели

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

from sklearn.feature_selection import SelectFromModel
selector = SelectFromModel(estimator=RandomForestClassifier(n_estimators=50)).fit(X, y)
mask = selector.get_support()
new_features = X.columns[mask]
new_features

Мы получаем:

ndex(['perimeter_mean', 'area_mean', 'concavity_mean', 'concave points_mean',
       'radius_worst', 'perimeter_worst', 'area_worst',
       'concave points_worst'],
      dtype='object')

Обсуждение

Это был пример того, как вы можете получить хорошее представление о том, какие переменные являются наиболее важными для вашей модели. Имейте в виду, что вы всегда должны проводить исследовательский анализ данных. Для двоичных случаев подходящим графиком всегда является прямоугольная диаграмма. Давайте посмотрим на прямоугольную диаграмму concave points_worst как для существующих, так и для злокачественных опухолей.

Наконец, вы можете найти подробное объяснение теста хи-квадрат.

Первоначально опубликовано на https://predictivehacks.com.