programming/파이썬으로 배우는 통계학

[파이썬/머신러닝] sklearn.RandomForestClassifier로 다항분류 모델링하기

Jofresh 2024. 1. 7. 18:49
728x90
반응형

아래 코드는 RandomForestClassifier를 사용하여 Iris 데이터셋을 다루는 예시입니다. 다음은 코드의 주요 단계와 각 부분에 대한 설명입니다. 

 

# 필요한 라이브러리 불러오기
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report
from sklearn.preprocessing import LabelEncoder
from sklearn.tree import export_text

# Iris 데이터셋 불러오기
iris = load_iris()
X = iris.data
y = iris.target

# 레이블 인코딩
le = LabelEncoder()
y_encoded = le.fit_transform(y)

# 데이터 분할 (훈련 데이터와 테스트 데이터)
X_train, X_test, y_train, y_test = train_test_split(X, y_encoded, test_size=0.2, random_state=42)

# RandomForestClassifier 모델 생성 및 학습
clf = RandomForestClassifier(n_estimators=100, random_state=42)
clf.fit(X_train, y_train)

# 테스트 데이터에 대한 예측
y_pred = clf.predict(X_test)

# 정확도 평가
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")

# 분류 보고서 출력
print("Classification Report:\n", classification_report(y_test, y_pred))

# 모델의 각 트리에서 가장 중요한 특성 시각화
feature_names = iris.feature_names
feature_importances = clf.feature_importances_

plt.barh(range(X.shape[1]), feature_importances, align='center')
plt.yticks(np.arange(len(feature_names)), feature_names)
plt.xlabel('Feature Importance')
plt.title('RandomForestClassifier - Feature Importance')
plt.show()

# 모델의 각 트리 시각화
for i, tree in enumerate(clf.estimators_):
    tree_rules = export_text(tree, feature_names=feature_names)
    print(f"Decision Tree {i + 1}:\n{tree_rules}\n")

# 테스트 데이터의 예측 확률 시각화
probabilities = clf.predict_proba(X_test)

plt.figure(figsize=(12, 6))
for i in range(clf.n_classes_):
    plt.subplot(1, clf.n_classes_, i + 1)
    plt.hist(probabilities[:, i], bins=20, label=f'Class {i}', alpha=0.7)
    plt.title(f'Class {i} Probability Distribution')
    plt.xlabel('Probability')
    plt.ylabel('Frequency')
    plt.legend()

plt.tight_layout()
plt.show()
  1. 라이브러리 불러오기:
    • 필요한 라이브러리들을 불러옵니다. 주로 NumPy, Matplotlib, scikit-learn의 여러 모듈들을 사용합니다.
  2. Iris 데이터셋 불러오기:
    • load_iris 함수를 사용하여 Iris 데이터셋을 불러옵니다. 이 데이터셋은 꽃의 세 가지 품종에 대한 꽃받침과 꽃잎의 너비와 길이를 포함합니다.
  3. 레이블 인코딩:
    • LabelEncoder를 사용하여 품종을 숫자로 변환하여 레이블을 인코딩합니다.
  4. 데이터 분할:
    • train_test_split 함수를 사용하여 전체 데이터를 훈련 데이터와 테스트 데이터로 나눕니다.
  5. RandomForestClassifier 모델 학습:
    • RandomForestClassifier 모델을 생성하고 훈련 데이터로 학습시킵니다.
  6. 테스트 데이터 예측 및 정확도 평가:
    • 학습된 모델을 사용하여 테스트 데이터에 대한 예측을 수행하고, 이를 정확도로 평가합니다.
  7. 분류 보고서 출력:
    • classification_report 함수를 사용하여 정밀도, 재현율, F1 점수 등의 분류 보고서를 출력합니다.
  8. 각 트리에서 중요한 특성 시각화:
    • 각 트리에서 얻은 특성 중요도를 수집하고, 이를 수평 막대 그래프로 시각화합니다.
  9. 각 트리 시각화:
    • 모델의 각 결정 트리를 텍스트 형식으로 출력하여 트리의 규칙을 확인할 수 있습니다.
  10. 테스트 데이터의 예측 확률 시각화:
  • predict_proba 함수를 사용하여 테스트 데이터에 대한 각 클래스의 예측 확률을 히스토그램으로 시각화합니다.

 

 

이 코드는 RandomForestClassifier를 활용하여 모델을 학습하고, 학습된 모델의 다양한 측면을 시각적으로 탐색하는 예시입니다. 누구나 쉽게 이해할 수 있도록 iris 데이터셋으로 작업했으며, 데이터셋을 변경하셔서 본인 데이터로 변경해서 작업하시면 됩니다. 

 

만약 본인 데이터가 숫자로 전처리되어 있지 않다면 아래 이미지처럼 문자(str)를 숫자(int)형으로 변환해서 사용해주세요.


코드 실행 결과

 

classification_report함수로 시각화한 분류 보고서 출력 화면과 모델의 각 트리에서 가장 중요한 특성을 시각화했습니다.

 

모델의 각 트리 시각화입니다.


추가적으로 의사결정트리 시각화를 하고싶다면, 아래 코드를 추가 실행합니다.

import graphviz
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder

# Iris 데이터셋 불러오기
iris = load_iris()
X = iris.data
y = iris.target

# 레이블 인코딩
le = LabelEncoder()
y_encoded = le.fit_transform(y)

# 데이터 분할 (훈련 데이터와 테스트 데이터)
X_train, X_test, y_train, y_test = train_test_split(X, y_encoded, test_size=0.2, random_state=42)

# DecisionTreeClassifier 모델 생성 및 학습
clf = DecisionTreeClassifier(random_state=42)
clf.fit(X_train, y_train)

# 결정 트리를 DOT 형식의 문자열로 변환
dot_data = export_graphviz(clf, out_file=None, feature_names=iris.feature_names,
                           class_names=iris.target_names, filled=True, rounded=True, special_characters=True)

# DOT 형식의 문자열을 그래프로 변환
graph = graphviz.Source(dot_data)

# 그래프를 이미지 파일로 저장 (옵션)
graph.render("iris_decision_tree", format='png', cleanup=True)

# 그래프 표시
graph.view()

 

위 코드를 실행하면, 아래처럼 의사결정 트리 시각화가 png파일로 저장됩니다.

 

 

아무래도 sklearn에서 기본적으로 제공해주는 dataset인 iris로 모델링을 해서 그런지 정확도가 100%가 나옵니다.

모델링 연습은 sklearn에서 기본으로 다양하게 제공해주는 타이타닉,전복무게 등 다른 dataset으로 연습해보시기 바랍니다.

 

🔷INFO

Gini계수란..?


Gini 계수는 불순도(impurity)를 측정하는 지표 중 하나로, 결정 트리(Decision Tree) 알고리즘에서 주로 사용됩니다. 불순도란 해당 노드에 서로 다른 클래스의 데이터가 얼마나 섞여 있는지를 나타내는 지표로, Gini 계수가 낮을수록 노드의 불순도가 낮아진다는 의미입니다.

Decision Tree에서는 불순도를 최소화하는 방향으로 데이터를 분할하며, 이때 Gini 계수를 활용하여 어떤 특성과 값을 기준으로 분할할지를 결정합니다. Gini 계수가 낮을수록 해당 분할이 좋다고 판단하여 모델을 훈련합니다.

728x90
반응형