Как использовать sklearn (chi-square или ANOVA) для удаления лишних функций - PullRequest
1 голос
/ 10 апреля 2020

На этапе выбора функции мы хотим идентифицировать соответствующие функции и удалить избыточные функции.

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

Мой вопрос касается удаления избыточных функций с помощью sklearn и тестов ANOVA / хи-квадрат.

Из того, что я прочитал (и видел примеры) мы используем SelectKBest или SelectPercentile, чтобы оставить лучшие функции, которые зависят от цели (y)

Но можем ли мы использовать эти методы с chi2, f_classif для удаления зависимые функции?

Другими словами, я хочу удалить избыточные функции с помощью методов sklearn. Как мы можем это сделать?

1 Ответ

1 голос
/ 10 апреля 2020

Вы можете использовать SelectKBest, чтобы оценить функции, используя предоставленную функцию (например, хи-квадрат), и получить N функций с наибольшим количеством очков. Например, чтобы сохранить 10 лучших функций, вы можете использовать следующее:

from sklearn.feature_selection import SelectKBest, chi2, f_classif

# chi-square
top_10_features = SelectKBest(chi2, k=10).fit_transform(X, y)

# or ANOVA
top_10_features = SelectKBest(f_classif, k=10).fit_transform(X, y)

Однако, как правило, существует множество методов и техник, которые полезны в контексте сокращения возможностей. Обычно вам нужно решить, какие методы использовать, основываясь на ваших данных, модели, которую вы обучаете, и результатах, которые вы хотите предсказать. Например, даже если у вас получится 20 объектов, вам также необходимо проверить, какова корреляция между каждой парой объектов, и удалить один из них в случае их высокой корреляции.

Следующая функция даст вам наивысшую коррелированные особенности. Вы можете использовать эти выходные данные для дальнейшего сокращения текущего списка переменных:

def get_feature_correlation(df, top_n=None, corr_method='spearman',
                            remove_duplicates=True, remove_self_correlations=True):
    """
    Compute the feature correlation and sort feature pairs based on their correlation

    :param df: The dataframe with the predictor variables
    :type df: pandas.core.frame.DataFrame
    :param top_n: Top N feature pairs to be reported (if None, all of the pairs will be returned)
    :param corr_method: Correlation compuation method
    :type corr_method: str
    :param remove_duplicates: Indicates whether duplicate features must be removed
    :type remove_duplicates: bool
    :param remove_self_correlations: Indicates whether self correlations will be removed
    :type remove_self_correlations: bool

    :return: pandas.core.frame.DataFrame
    """
    corr_matrix_abs = df.corr(method=corr_method).abs()
    corr_matrix_abs_us = corr_matrix_abs.unstack()
    sorted_correlated_features = corr_matrix_abs_us \
        .sort_values(kind="quicksort", ascending=False) \
        .reset_index()

    # Remove comparisons of the same feature
    if remove_self_correlations:
        sorted_correlated_features = sorted_correlated_features[
            (sorted_correlated_features.level_0 != sorted_correlated_features.level_1)
        ]

    # Remove duplicates
    if remove_duplicates:
        sorted_correlated_features = sorted_correlated_features.iloc[:-2:2]

    # Create meaningful names for the columns
    sorted_correlated_features.columns = ['Feature 1', 'Feature 2', 'Correlation (abs)'] 

    if top_n:
        return sorted_correlated_features[:top_n]

    return sorted_correlated_features

Другие параметры могут быть:

  • Процент пропущенных значений
  • Корреляция с целевой переменной
  • Включите некоторые случайные переменные и посмотрите, попадут ли они в последующие списки сокращенных переменных
  • Стабильность свойства во времени
  • et c.

Как я уже говорил, это зависит от того, чего вы пытаетесь достичь.

...