너무 많은 기능을 사용하여 문제를 해결하고 있으며 모델 훈련에 시간이 오래 걸립니다. 기능을 선택하기 위해 정방향 선택 알고리즘을 구현했습니다.
그러나 scikit-learn이 앞으로 선택 / 단계별 회귀 알고리즘을 가지고 있는지 궁금합니다.
너무 많은 기능을 사용하여 문제를 해결하고 있으며 모델 훈련에 시간이 오래 걸립니다. 기능을 선택하기 위해 정방향 선택 알고리즘을 구현했습니다.
그러나 scikit-learn이 앞으로 선택 / 단계별 회귀 알고리즘을 가지고 있는지 궁금합니다.
답변:
아니요, sklearn에는 정방향 선택 알고리즘이없는 것 같습니다. 그러나 재귀 적 기능 제거를 제공합니다.이 기능은 순차적 역방향 선택과 유사한 욕심 많은 기능 제거 알고리즘입니다. 여기에서 설명서를 참조하십시오 :
http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.RFE.html
coef_
인터페이스 가있는 경우 기능 중요도가 수량화된다는 것 입니다. 이것은 트리 기반 방법 등을 배제 할 것입니다. 그러나 @Maksud가 요청한 것은 James의 "통계 학습 입문"에 설명되어있는 것입니다. 유효성 설정 세트 정확도로 수량화 한 중요성에 따라 기능이 재귀 적으로 추가 / 제거되는 기능 . 이를 통해 선형 파라 메트릭 모델이 아닌 모든 모델 유형에서 기능을 선택할 수 있습니다.
Sklearn DOS에는 scikit-learn에서 호출되지는 않지만 정방향 선택 알고리즘이 있습니다. 라는 기능 선택 방법 F_regression 것이다 배울 scikit에 순차적가 될 때까지 모델을 최대한 향상 기능이 포함 K
모델의 기능 (K가 입력).
각 피처의 레이블을 개별적으로 회귀 한 다음 F- 통계량을 사용하여 모델을 가장 개선 한 피처를 관찰합니다. 그런 다음 우승 기능을 모델에 통합합니다. 그런 다음 나머지 기능을 반복하여 F- 통계량 또는 F 테스트를 사용하여 모델을 가장 개선하는 다음 기능을 찾습니다. 모델에 K 피쳐가있을 때까지이 작업을 수행합니다.
모형에 포함 된 형상과 관련이있는 나머지 형상은 잔차와 상관 관계가 없기 때문에 선택되지 않을 수 있습니다 (라벨과 잘 상관 될 수 있음). 이는 다중 공선 성을 방지하는 데 도움이됩니다.
Scikit-learn은 실제로 단계적 회귀를 지원하지 않습니다. 일반적으로 '단계별 회귀'라고 알려진 것은 선형 회귀 계수의 p- 값에 기반한 알고리즘이기 때문에 scikit-learn은 모델 학습에 대한 추론 적 접근 (의 의성 테스트 등)을 의도적으로 피하기 때문입니다. 더욱이 순수한 OLS는 수많은 회귀 알고리즘 중 하나 일 뿐이며, scikit-learn 관점에서는 그다지 중요하지도 않고 최고도 아닙니다.
그러나 선형 모델을 사용하여 피쳐를 선택하는 데 여전히 좋은 방법이 필요한 사람들을위한 몇 가지 조언이 있습니다.
ElasticNet
또는 과 같은 희소 모델을 사용하십시오 Lasso
.StandardScaler
한 다음 바로 기능을 주문하십시오 model.coef_
. 완전 독립 공변량의 경우 p- 값으로 정렬하는 것과 같습니다. 수업 sklearn.feature_selection.RFE
은 귀하를 대신 RFECV
하여 최적의 기능 수를 평가할 것입니다.statsmodels
mlxtend
패키지 는 모든 추정기 및 메트릭에 대해이 접근 방식을 지원합니다 .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']
실제로 Statsmodels를 사용하고 모델에 변수를 점진적으로 추가하기 위해 고유 한 메트릭 (AIC, BIC, Adjusted-R-Squared 등)을 설정할 수있는 "Forward_Select"라는 멋진 알고리즘이 있습니다. 알고리즘은이 페이지의 댓글 섹션에서 찾을 수 있습니다. 아래로 스크롤하면 페이지 하단 근처에 표시됩니다.
https://planspace.org/20150423-forward_selection_with_statsmodels/
알고리즘에는 멋진 기능이 하나 더 있습니다. 분류 또는 회귀 문제에 적용 할 수 있습니다! 당신은 그것을 말해야합니다.
그것을 시도하고 직접 참조하십시오.