Python 및 Scikit-Learn PlatoBlockchain 데이터 인텔리전스를 사용하여 랜덤 포레스트에 대한 기능 중요도를 얻으십시오. 수직 검색. 일체 포함.

Python 및 Scikit-Learn으로 랜덤 포레스트에 대한 기능 중요도 얻기

개요

XNUMXD덴탈의 랜덤 포레스트 알고리즘은 데이터 포인트를 분류하거나 대략적인 값을 결정하기 위해 많은 의사결정 트리의 예측 앙상블을 사용하는 트리 기반 지도 학습 알고리즘입니다. 이는 분류 또는 회귀에 사용할 수 있음을 의미합니다.

분류를 적용할 때 데이터 포인트의 클래스는 트리에서 가장 많이 투표된 클래스를 기반으로 선택됩니다. 회귀에 적용될 때 데이터 포인트의 값은 트리에서 출력되는 모든 값의 평균입니다.

랜덤 포레스트를 사용할 때 기억해야 할 중요한 점은 트리의 수가 하이퍼파라미터이고 모델을 실행하기 전에 정의된다는 것입니다.

데이터 과학에서 작업할 때 특정 프로젝트에 대해 랜덤 포레스트 모델이 선택된 이유 중 하나는 앙상블 트리를 보고 이해하는 능력과 관련이 있을 수 있습니다. why 분류를 하였거나 why 값이 주어졌습니다 - 이것을 호출합니다 설명 가능성.

트리 기반 알고리즘을 고려할 때 각 트리를 표시하고 살펴봄으로써(모델에 200개 이상의 트리가 있는 경우 어려울 수 있음) 다음을 사용하여 모델을 설명하려는 시도는 여러 가지 방법으로 수행할 수 있습니다. Shapley(또는 SHAP) 값, 모델이 가장 많이 고려한 기능을 살펴보고, 라임 모델 입력과 출력 간의 관계 등을 조사합니다. 일반적으로 모든 방법의 조합이 사용됩니다.

이 빠른 가이드에서는 펭귄을 분류할 때 모델이 결정을 내리는 데 중요하다고 생각한 기능의 차트를 만드는 데 중점을 둘 것입니다. 이를 조사하는 것으로 알려져 있다. 기능 중요도, 그리고 팀의 다른 구성원(기술적 및 비기술적)에게 전달하여 의사 결정 방법을 엿볼 수 있습니다.

이를 위해 필요한 라이브러리를 가져오고, Palmer Penguins 데이터 세트를 로드하고, 데이터를 분할하고, 모델을 생성하고, 기능 중요도를 얻고, Seaborn을 사용하여 플롯합니다! 데이터, EDA 또는 모델 자체에 대해서는 자세히 다루지 않을 것입니다. 이는 전용 가이드의 주제입니다.

참고 : 에서 데이터 셋을 다운로드 할 수 있습니다 GitHub의 또는 코드에서 직접.

라이브러리 가져 오기

사용할 몇 가지 라이브러리를 가져오는 것으로 시작하겠습니다.


import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier


raw_data_url = "https://gist.githubusercontent.com/cassiasamp/197b4e070f5f4da890ca4d226d088d1f/raw/38c9d4906ed121481b4dc201fa2004f2b3d0065f/penguins.csv"
df = pd.read_csv(raw_data_url)

데이터 분할

학습 및 테스트를 위해 데이터를 분할해 보겠습니다.


df = df.dropna().drop("rowid", axis=1)


y = df["species"]
X = df[["bill_length_mm", "bill_depth_mm", "flipper_length_mm"]]


X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

기능 중요도 얻기

마지막으로 다음을 사용하여 모델을 훈련하고 기능 중요도를 내보낼 수 있습니다.


rf = RandomForestClassifier()


rf.fit(X_train, y_train)


rf.feature_importances_

이 결과는 다음과 같습니다.

array([0.41267633, 0.30107056, 0.28625311])

기능 이름을 보려면 다음을 실행하십시오.


rf.feature_names_in_

그러면 각 기능의 해당 이름이 생성됩니다.

array(['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm'],
      dtype=object)

이것은 이 특정 모델의 페귄 클래스를 결정하는 데 가장 중요한 기능이 bill_length_mm!

중요도는 각 노드 분할에서 데이터가 얼마나 잘 분리되는지에 대한 측정값과 관련이 있습니다. 이 경우 측정값은 다음과 같이 지정됩니다. 지니 인덱스 – gini 값은 다음을 사용할 때 분할된 행 수에 따라 가중치가 부여됩니다. bill_length_mm 앙상블에 있는 100그루 이상의 나무를 피처로 평균화했습니다. 이러한 단계의 결과는 다음을 설명합니다. 0.41267633, 또는 이 경우 40% 이상입니다.

기능 중요도 시각화

중요도 값을 나타내는 일반적인 방법은 막대 채팅을 사용하는 것입니다. 먼저 기능 이름과 해당 중요도를 사용하여 데이터 프레임을 만든 다음 Seaborn을 사용하여 시각화해 보겠습니다. barplot():


importances_df = pd.DataFrame({"feature_names" : rf.feature_names_in_, 
                               "importances" : rf.feature_importances_})
                             

g = sns.barplot(x=importances_df["feature_names"], 
                y=importances_df["importances"])
g.set_title("Feature importances", fontsize=14);                          

조언: 정보를 표시할 때 좋은 방법은 값을 오름차순 또는 내림차순으로 정렬하는 것입니다. 이 경우 데이터는 이미 정렬되어 있으며 첫 번째 값이 알고 싶은 첫 번째 값입니다. 그렇지 않은 경우 다음을 사용하여 데이터 프레임을 주문할 수 있습니다. sort_values. 이것은 오름차순 또는 내림차순으로 모든 열에서 수행할 수 있습니다. importances_df.sort_values(by="importances", ascending=False).

이 첫 번째 플롯을 보면 각 기능의 중요도 값을 해석하기가 더 어렵습니다. 청구서 길이가 다른 두 막대보다 큰 것은 분명하지만 정확히는 아닙니다. bill_depth_mm 에 해당하는 0.30107056그리고 flipper_length_mm 0.28625311입니다. 따라서 이 첫 번째 차트는 각 막대의 값을 표시하여 개선할 수 있습니다. 이것은 Seaborn's에 액세스하여 수행할 수 있습니다. containers 물체. 각 막대 정보를 저장하고 값을 막대 레이블로 전달합니다.

모범 사례, 업계에서 인정하는 표준 및 포함된 치트 시트가 포함된 Git 학습에 대한 실습 가이드를 확인하십시오. 인터넷 검색 Git 명령을 중지하고 실제로 배움 이것!

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
g.set_title("Feature importances", fontsize=14)
for value in g.containers:
    g.bar_label(value)

Python 및 Scikit-Learn PlatoBlockchain 데이터 인텔리전스를 사용하여 랜덤 포레스트에 대한 기능 중요도를 얻으십시오. 수직 검색. 일체 포함.

이제 각 중요도 값을 명확하게 또는 거의 명확하게 볼 수 있습니다. bill_length_mm 차트 외부 테두리의 일부인 세로선으로 값이 잘립니다. 경계는 더 많은 관심을 집중시키기 위한 수단으로 영역을 둘러싸는데 사용되지만, 이 경우에는 하나의 그래프만 있기 때문에 둘러쌀 필요가 없습니다. 테두리를 제거하고 숫자의 가독성을 개선해 보겠습니다.

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
                

sns.despine(bottom=True, left=True)
g.set_title("Feature importances", fontsize=14)
for value in g.containers:
    g.bar_label(value)

Python 및 Scikit-Learn PlatoBlockchain 데이터 인텔리전스를 사용하여 랜덤 포레스트에 대한 기능 중요도를 얻으십시오. 수직 검색. 일체 포함.

차트를 읽기가 더 쉬워 보이지만 X축의 눈금이 떠 있는 것처럼 보이고 막대와 함께 이미 값이 있으므로 제거할 수 있습니다. xticks:

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
sns.despine(bottom=True, left=True)


g.set(xticks=[])
g.set_title("Feature importances", fontsize=14)
for value in g.containers:
    g.bar_label(value)

Python 및 Scikit-Learn PlatoBlockchain 데이터 인텔리전스를 사용하여 랜덤 포레스트에 대한 기능 중요도를 얻으십시오. 수직 검색. 일체 포함.

눈금을 제거한 후 Y 및 X 레이블을 읽기가 약간 어렵다는 점에 유의하십시오. Y 라벨, feature_names는 수직이고 X축에는 importances. 제목에 이미 차트가 있다고 명시되어 있기 때문에 기능 중요도, 축 레이블을 제거할 수도 있습니다.

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
sns.despine(bottom=True, left=True)
g.set_title("Feature importances", fontsize=14)
g.set(xticks=[])


g.set(xlabel=None)
g.set(ylabel=None)
for value in g.containers:
    g.bar_label(value)

Python 및 Scikit-Learn PlatoBlockchain 데이터 인텔리전스를 사용하여 랜덤 포레스트에 대한 기능 중요도를 얻으십시오. 수직 검색. 일체 포함.

첫 번째 차트와 비교할 때 이 차트가 얼마나 깨끗하고 읽기 쉽고 이해하기 쉬운지 알 수 있습니다. 아직 우리가 할 수 있는 일이 있습니다. 숫자가 막대에 정말 가깝다는 것을 관찰하십시오. 막대 사이에 공간이 조금 더 있으면 읽기가 더 쉬울 것입니다.

이 플롯의 또 다른 요소는 색상입니다. 대조되는 색상을 사용하면 분리의 개념을 전달하고, 반대로 유사한 색상을 사용하면 통일성 또는 전체의 일부에 대한 개념을 전달합니다. 기능은 모두 펭귄의 일부이므로 통일성을 유지하면서 각 막대를 구별하는 색상을 사용할 수 있습니다.

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names",
                
                
                palette="mako")
sns.despine(bottom=True, left=True)
g.set_title("Feature importances", fontsize=14)
g.set(xticks=[])
g.set(xlabel=None)
g.set(ylabel=None)
for value in g.containers:
    g.bar_label(value, 
                padding=2) 

Python 및 Scikit-Learn PlatoBlockchain 데이터 인텔리전스를 사용하여 랜덤 포레스트에 대한 기능 중요도를 얻으십시오. 수직 검색. 일체 포함.

결과를 더욱 직접적으로 만들고 싶다면 제목을 변경하고 결론을 추가할 수 있습니다. 알려진 것은 우리가 이전에 논의한 기준에 따라 청구서 길이가 가장 중요한 특징으로 간주되었다는 것입니다. 이것은 줄거리를 보는 누군가를 위한 첫 번째 정보가 될 수 있습니다. 펭귄의 부리 길이는 RF(Random Forest) 기본 모델에서 종 분류를 위한 가장 중요한 특징이었습니다. :

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names", 
                palette="mako")
sns.despine(bottom=True, left=True)
g.set_title("The penguin's bill length was the most important feature for species classification (RF base model)", fontsize=14)
g.set(xticks=[])
g.set(xlabel=None)
g.set(ylabel=None)
for value in g.containers:
    g.bar_label(value, padding=2)

다음은 기능 중요도 차트의 최종 결과입니다.

Python 및 Scikit-Learn PlatoBlockchain 데이터 인텔리전스를 사용하여 랜덤 포레스트에 대한 기능 중요도를 얻으십시오. 수직 검색. 일체 포함.

결론

이 가이드에서는(우리는 Random Forest Classifier를 구축했습니다) 설명 모델이 학습한 내용과 추론에 영향을 주는 요소.

타임 스탬프 :

더보기 스택카부스