Scikit-learn Random Forest의 기능 중요성은 매우 높은 표준 편차를 보여줍니다


13

scikit-learn Random Forest Classifier를 사용하고 있으며이 예제 와 같이 기능의 중요도를 그려보고 싶습니다 .

그러나 피처 중요도 표준 편차가 피처 중요도 자체보다 거의 항상 크다는 점에서 필자의 결과는 완전히 다릅니다 (첨부 된 이미지 참조).

기능의 중요성

그런 행동을하는 것이 가능합니까, 아니면 그것을 그릴 때 실수를 저지르고 있습니까?

내 코드는 다음과 같습니다

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier

clf = RandomForestClassifier()
clf.fit(predictors.values, outcome.values.ravel())

importance = clf.feature_importances_
importance = pd.DataFrame(importance, index=predictors.columns, 
                          columns=["Importance"])

importance["Std"] = np.std([tree.feature_importances_
                            for tree in clf.estimators_], axis=0)

x = range(importance.shape[0])
y = importance.ix[:, 0]
yerr = importance.ix[:, 1]

plt.bar(x, y, yerr=yerr, align="center")

plt.show()

IIUC 는 속성이 없기 때문에 열이 잘못된 개체를 참조하는 개체 를 predictors반환 합니다 . numpy arraypandas Dataframenumpy arrayscolumns
Nickil Maveli

코드의 오타였습니다. 예측 및 결과는 두 가지 pandas DataFrame모양 m x nm x 1. 지금은 분명해야합니다.
gc5

2
나는 얼마 전에 같은 결과를 보았습니다. 이것은 많은 기능이 중요하다는 사실 때문일 수 있지만 의사 결정 트리에서 기능이 높거나 낮을 수 있기 때문에 (분할 할 때 임의의 하위 집합 만 제공됨) 그 중요성은 트리마다 크게 다릅니다. 트리를 사용하면 표준 편차가 높아집니다.
Archie

좋은 포스트, 나는 당신이 그림에서 볼 수있는 것과 동일한 문제에 부딪쳤다. 패키지,이 tsfresh날 약 400 600에서 제 기능을 관련 기능을 식별하고 잘라 도움 ! [내 상위 35 기능 ( i.stack.imgur.com/0MROZ.png )에도 알고리즘이 잘 수행이와 나를 위해. 이진 분류, 성공 / 실패가 있습니다. 나는 사실상 잘못된 성공을 얻지 못하지만 상당한 성공률을 그리워합니다. 위의 모든 추측은 합리적으로 보입니다. 더 큰 훈련 및 테스트 세트가 필요할 수 있습니다. 나는 더 적은
슈퍼 히어로

답변:


3

기본 트리 수 (10)와 함께 RandomForest를 사용하고 있습니다. 약 30 개의 기능에 대해서는 너무 적습니다. 따라서 표준 편차가 큽니다. 적어도 100 개 또는 1000 개의 나무를 사용해보십시오.

clf = RandomForestClassifier(n_estimators=1000)

보다 정교한 분석을 위해 기능 간의 상관 관계가 얼마나 큰지 확인할 수도 있습니다.


죄송합니다. lanenok, 나무 수는 기본 트리가 아닙니다. min_samples_split작업중 인 데이터를 공개 할 수 없기 때문에 예제 코드를 넣습니다 (예 : 모든 매개 변수에 적용됨 ). 그러나 나무의 수와 다른 매개 변수 때문입니까? 아니면 여기에서 실수가 있습니까?
gc5

2

당신의 결과는 그렇게 이상하지 않습니다. 으로 lanenok의 상태, 당신은 첫 번째 단계에서이 기능의 importances에 관한 '통계'결과를 얻을 수 있는지 확인하기 위해 나무의 수를 늘려야합니다.

그러나,이 같은 종이 Genuer 외 알 의한. (2010)에 따르면 피처를 제거하기 위해 실제로 표준 편차를 사용할 수 있습니다. " 우리는 실제 변수 표준 편차가 0에 가까운 잡음이있는 변수에 비해 크다는 것을 알 수 있습니다. "


이 예에서 표준 편차를 사용하여 피처를 제거하면 모든 피처 가 제거 됩니다 . xD
Jorge Leitao

하하, 전 잘 모르겠습니다. 맨 오른쪽의 기능을 안전하게 버릴 수 있다고 생각하십니까? 어쨌든, 내가 만들고자하는 요점은 높은 표준 편차가 그렇게 이상하지 않으며 실제로 기능을 제거하기 위해 전략에서 사용할 수 있다는 것입니다.
Archie

1

시도하십시오 clf = RandomForestClassifier(max_features=None). 이 max_features매개 변수의 기본값 'auto'sqrt(n_features)입니다. max_features"최상의 분할을 찾을 때 고려해야 할 기능의 수"로 설명됩니다. 의사 결정 트리의 특정 시점에서 적은 수의 기능 만 보는 것은 단일 기능의 중요성이 많은 트리에 따라 크게 다를 수 있음을 의미합니다. 따라서 임의의 하위 집합을 보지 말고 트리의 모든 수준에서 모든 기능을 살펴보십시오.


1
이것은 일반 포장 된 나무와 동일합니다. 임의 포리스트의 "임의"는 각 스플릿에서 일반적으로 sqrt(n_features)또는 의 기능 중 임의의 하위 집합을 고려한다는 의미 log2(n_features)입니다. max_features=None더 이상 기능 의 임의 하위 집합을 고려하지 않습니다 . 이것이 위에서 제안한 솔루션에 영향을 미치는지 확실하지 않습니다. 하나의 가능성은 많은 지형지 물이 단순히 중요도가 높기 때문에 나무의 앙상블에 따라 크게 다를 수 있습니다. 또는 샘플이 충분하지 않아 리프에 도달 할 때 모든 기능이 고려되는 것은 아닙니다.
jamis

1

가장 일반적인 이유는 제공 한 (또는 기본값 인) 매개 변수 RandomForestClassifier가 데이터 세트에 적합하지 않기 때문입니다.

이 문제를 해결하는 일반적인 방법은 다음을 사용하여 하이퍼 파라미터 공간을 검색하는 것입니다 GridSearchCV.

from sklearn.model_selection import GridSearchCV
from sklearn.metrics import accuracy_score, make_scorer

param_grid = {'n_estimators': [10, 100, 1000], 'max_features': [5, 10, 20, 30]}
clf = GridSearchCV(RandomForestClassifier(), param_grid, cv=5, scoring=make_scorer(accuracy_score))

param_grid다음은 검색하려는 매개 변수의 순열이며, make_scorer(accuracy_score)는 최적화하려는 측정 값입니다.

참고 accuracy_score불균형 세트의 균형 세트에 적합하지만,하지 않습니다. 특정 목표에 적합한 측정 항목을 선택하십시오.


0

여러 가지 이유가있을 수 있습니다. 나무의 수와 깊이는 결과를 바꿀 수 있습니다. 매개 변수 (교차 유효성 검사 등)를 선택한 후 모델이 제대로 작동하지 않으면 지형지 물이 예측하기 어렵 기 때문에 거의 "임의로"선택되어 트리에서 트리로 높은 표준 편차가 발생합니다. 그러나 다른 가능성이 있습니다. 예를 들어 기능이 서로 밀접한 관련이있을 수도 있습니다. 조금 더 많은 정보가 도움이 될 것입니다.

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