scikit-learn에는 정방향 선택 / 단계별 회귀 알고리즘이 있습니까?


36

너무 많은 기능을 사용하여 문제를 해결하고 있으며 모델 훈련에 시간이 오래 걸립니다. 기능을 선택하기 위해 정방향 선택 알고리즘을 구현했습니다.

그러나 scikit-learn이 앞으로 선택 / 단계별 회귀 알고리즘을 가지고 있는지 궁금합니다.


나는 그것을 위해 나 자신의 수업을 만들었지 만 sklearn에없는 것이 매우 놀랐습니다.
Maksud

1
가설 검정을 사용하는 것은 끔찍한 피처 선택 방법입니다. 당신은 그것들을 많이해야 할 것입니다. 물론, 많은 거짓 긍정과 부정을 얻게 될 것입니다.
Ricardo Cruz

답변:


21

아니요, sklearn에는 정방향 선택 알고리즘이없는 것 같습니다. 그러나 재귀 적 기능 제거를 제공합니다.이 기능은 순차적 역방향 선택과 유사한 욕심 많은 기능 제거 알고리즘입니다. 여기에서 설명서를 참조하십시오 :

http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.RFE.html


3
좋은 제안이지만 sci-kit 구현의 문제는 모델 중요도, 즉 모델에 coef_인터페이스 가있는 경우 기능 중요도가 수량화된다는 것 입니다. 이것은 트리 기반 방법 등을 배제 할 것입니다. 그러나 @Maksud가 요청한 것은 James의 "통계 학습 입문"에 설명되어있는 것입니다. 유효성 설정 세트 정확도로 수량화 한 중요성에 따라 기능이 재귀 적으로 추가 / 제거되는 기능 . 이를 통해 선형 파라 메트릭 모델이 아닌 모든 모델 유형에서 기능을 선택할 수 있습니다.
eggie5

9

Sklearn DOS에는 scikit-learn에서 호출되지는 않지만 정방향 선택 알고리즘이 있습니다. 라는 기능 선택 방법 F_regression 것이다 배울 scikit에 순차적가 될 때까지 모델을 최대한 향상 기능이 포함 K모델의 기능 (K가 입력).

각 피처의 레이블을 개별적으로 회귀 한 다음 F- 통계량을 사용하여 모델을 가장 개선 한 피처를 관찰합니다. 그런 다음 우승 기능을 모델에 통합합니다. 그런 다음 나머지 기능을 반복하여 F- 통계량 또는 F 테스트를 사용하여 모델을 가장 개선하는 다음 기능을 찾습니다. 모델에 K 피쳐가있을 때까지이 작업을 수행합니다.

모형에 포함 된 형상과 관련이있는 나머지 형상은 잔차와 상관 관계가 없기 때문에 선택되지 않을 수 있습니다 (라벨과 잘 상관 될 수 있음). 이는 다중 공선 성을 방지하는 데 도움이됩니다.



1
당신은 의미합니까 선택 K-최선을 ?
니트로

예. 또한 stats.stackexchange.com/questions/204141/…을 읽어보십시오 .
Candic3

2
그것은 일종의 전진 선택입니다. 그러나 일반적인 것은 아닙니다. 선형 회귀 모델에만 해당되는 반면, 일반적으로 순방향 선택은 RFE와 마찬가지로 모든 모델 (모델에 무관)에서 작동하며 분류 또는 회귀 문제를 처리 할 수 ​​있습니다. 그러나 대부분의 사람들 이이 사용 사례를 찾고 있다고 생각하며 여기에 언급하는 것이 좋습니다.
시몬

2
각 p- 값은 다른 모든 공변량과는 독립적으로 일 변량 회귀에 대해 계산되므로 STEPWISE 선택은 아닙니다.
David Dale

8

Scikit-learn은 실제로 단계적 회귀를 지원하지 않습니다. 일반적으로 '단계별 회귀'라고 알려진 것은 선형 회귀 계수의 p- 값에 기반한 알고리즘이기 때문에 scikit-learn은 모델 학습에 대한 추론 적 접근 (의 의성 테스트 등)을 의도적으로 피하기 때문입니다. 더욱이 순수한 OLS는 수많은 회귀 알고리즘 중 하나 일 뿐이며, scikit-learn 관점에서는 그다지 중요하지도 않고 최고도 아닙니다.

그러나 선형 모델을 사용하여 피쳐를 선택하는 데 여전히 좋은 방법이 필요한 사람들을위한 몇 가지 조언이 있습니다.

  1. ElasticNet또는 과 같은 희소 모델을 사용하십시오 Lasso.
  2. 로 기능을 정규화 StandardScaler한 다음 바로 기능을 주문하십시오 model.coef_. 완전 독립 공변량의 경우 p- 값으로 정렬하는 것과 같습니다. 수업 sklearn.feature_selection.RFE은 귀하를 대신 RFECV하여 최적의 기능 수를 평가할 것입니다.
  3. 와 함께 작동 하는 조정 된 로 순방향 선택 구현 을 사용하십시오 .R2statsmodels
  4. 교차 검증에서 선호하는 메트릭을 최대화하려면 무차별 강제 전진 또는 후진 선택을 수행하십시오 (공변량의 수에 약 2 차 시간이 걸릴 수 있음). scikit-learn 호환 mlxtend패키지 모든 추정기 및 메트릭에 대해이 접근 방식을 지원합니다 .
  5. 바닐라 단계적 회귀를 계속 원하면 statsmodels이 패키지가 p- 값을 계산하므로이를 기반으로하는 것이 더 쉽습니다 . 기본적인 전진 후진 선택은 다음과 같습니다.

```

from sklearn.datasets import load_boston
import pandas as pd
import numpy as np
import statsmodels.api as sm

data = load_boston()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = data.target


def stepwise_selection(X, y, 
                       initial_list=[], 
                       threshold_in=0.01, 
                       threshold_out = 0.05, 
                       verbose=True):
    """ Perform a forward-backward feature selection 
    based on p-value from statsmodels.api.OLS
    Arguments:
        X - pandas.DataFrame with candidate features
        y - list-like with the target
        initial_list - list of features to start with (column names of X)
        threshold_in - include a feature if its p-value < threshold_in
        threshold_out - exclude a feature if its p-value > threshold_out
        verbose - whether to print the sequence of inclusions and exclusions
    Returns: list of selected features 
    Always set threshold_in < threshold_out to avoid infinite looping.
    See https://en.wikipedia.org/wiki/Stepwise_regression for the details
    """
    included = list(initial_list)
    while True:
        changed=False
        # forward step
        excluded = list(set(X.columns)-set(included))
        new_pval = pd.Series(index=excluded)
        for new_column in excluded:
            model = sm.OLS(y, sm.add_constant(pd.DataFrame(X[included+[new_column]]))).fit()
            new_pval[new_column] = model.pvalues[new_column]
        best_pval = new_pval.min()
        if best_pval < threshold_in:
            best_feature = new_pval.argmin()
            included.append(best_feature)
            changed=True
            if verbose:
                print('Add  {:30} with p-value {:.6}'.format(best_feature, best_pval))

        # backward step
        model = sm.OLS(y, sm.add_constant(pd.DataFrame(X[included]))).fit()
        # use all coefs except intercept
        pvalues = model.pvalues.iloc[1:]
        worst_pval = pvalues.max() # null if pvalues is empty
        if worst_pval > threshold_out:
            changed=True
            worst_feature = pvalues.argmax()
            included.remove(worst_feature)
            if verbose:
                print('Drop {:30} with p-value {:.6}'.format(worst_feature, worst_pval))
        if not changed:
            break
    return included

result = stepwise_selection(X, y)

print('resulting features:')
print(result)

이 예제는 다음 출력을 인쇄합니다.

Add  LSTAT                          with p-value 5.0811e-88
Add  RM                             with p-value 3.47226e-27
Add  PTRATIO                        with p-value 1.64466e-14
Add  DIS                            with p-value 1.66847e-05
Add  NOX                            with p-value 5.48815e-08
Add  CHAS                           with p-value 0.000265473
Add  B                              with p-value 0.000771946
Add  ZN                             with p-value 0.00465162
resulting features:
['LSTAT', 'RM', 'PTRATIO', 'DIS', 'NOX', 'CHAS', 'B', 'ZN']

게시 된 정방향 회귀 코드가 올바르게 작동하지 않습니다. 단계적 회귀에 대해 동일한 결과를 제공해야하지만 그렇지 않습니다. 회귀를 다시 실행할 때 p- 값이 임계 값보다 높은 요인을 반환합니다. 또한 STATA를 사용하여 동일한 데이터 세트를 실행하고 역으로 단계별로 동일한 임계 값을 사용하여 실질적으로 다른 결과를 얻었습니다. 기본적으로 사용하지 마십시오. 나는 그의 템플릿을 사용하여 자신의 뒤로 단계별 회귀 코드를 작성할 것입니다.
Michael Corley MBA LSSBB

전진 및 후진 단계적 회귀가 동일한 솔루션으로 수렴되는 것은 아닙니다. 그리고 내 솔루션에서 버그를 발견하면 코드를 첨부하여 재현하십시오.
David Dale

1

실제로 Statsmodels를 사용하고 모델에 변수를 점진적으로 추가하기 위해 고유 한 메트릭 (AIC, BIC, Adjusted-R-Squared 등)을 설정할 수있는 "Forward_Select"라는 멋진 알고리즘이 있습니다. 알고리즘은이 페이지의 댓글 섹션에서 찾을 수 있습니다. 아래로 스크롤하면 페이지 하단 근처에 표시됩니다.

https://planspace.org/20150423-forward_selection_with_statsmodels/

알고리즘에는 멋진 기능이 하나 더 있습니다. 분류 또는 회귀 문제에 적용 할 수 있습니다! 당신은 그것을 말해야합니다.

그것을 시도하고 직접 참조하십시오.


0

실제로 sklearn에는 순방향 선택 알고리즘 이 없으며 2017 년 4 월부터 Scikit-Learn 저장소에서 순방향 기능 선택 구현을 구현 하는 풀 요청 이 있다고 생각했습니다 .

대안으로 mlxtend 에는 한 단계 씩 앞뒤로 선택이 있습니다 . Sequential Feature Selector 에서 문서를 찾을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.