Машинное обучение, Программирование
Выбор функций в 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.