ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] Decision Tree 구성하기
    Python/Python 실습 2025. 8. 8. 16:38

    Decision Tree 정의

    Decision Tree (의사결정나무)는 직관적이고, 널리 쓰이는 지도 학습 알고리즘 중 하나다. 데이터를 분류하고 예측하는데 활용할 수 있다. 데이터를 기준 (Feature)로 질문을 계속하면서, 트리 형태로 분기해 나가는 알고리즘이다. 최종적으로 분류나 수치 예측 결과에 도달한다.

     

    Decision Tree 개념

    - Node : 하나의 질문 또는 분기점

    - Root Node : 맨 상위에 있는 Node, 첫 질문

    - Leaf Node : 맨 마지막, 자식이 없는 Node

    - Branch : 질문 결과에 따라 나뉘는 경로

    - Depth : 질문의 단계수. 너무 깊으면 과적합 위험

     

    Decision Tree 절차

    - 데이터를 나누는 질문을 선택할 때, 가능한 순수하게 만들기 위해 사용된다. 질문에 의해 분할된 클래스가 혼합되지 않도록 하는 것이 목적이다.

    - 범주형 결과 (Class)를 예측하는 분류 (Classification)과, 연속형 숫자를 예측하는 (Regression)이 있다.

     

    - 장점 : 이해하기 쉽고, 시각화 가능하다. 전처리가 거의 필요 없다.

    - 단점 : 과적합되기 쉽다. 약간의 데이터 변화에도 트리가 크게 달라질 수 있다. 일반화 성능이 떨어질 수 있다.

     

    Decision Tree 예제코드

    # 1. 라이브러리 불러오기
    from sklearn.datasets import load_iris
    from sklearn.model_selection import train_test_split
    from sklearn.tree import DecisionTreeClassifier, plot_tree
    import matplotlib.pyplot as plt
    import pandas as pd
    import os
    
    # 2. 데이터 로드
    iris = load_iris()
    X = iris.data          # 특성 (꽃받침 길이, 너비, 꽃잎 길이, 너비)
    y = iris.target        # 타겟 (0: setosa, 1: versicolor, 2: virginica)
    
    df = pd.DataFrame(iris.data, columns=iris.feature_names)
    df['target'] = iris.target
    df['target_name'] = df['target'].apply(lambda x: iris.target_names[x])
    
    save_path = "D:/PythonData"
    csv_filename = "iris_dataset.csv"
    full_path = os.path.join(save_path, csv_filename)
    os.makedirs(save_path, exist_ok=True)
    df.to_csv(full_path, index=False)
    
    # 3. 훈련용/테스트용 데이터 분할
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
    
    # 4. 모델 생성 및 훈련
    model = DecisionTreeClassifier(random_state=42)
    model.fit(X_train, y_train)
    
    # 5. 예측 및 정확도 평가
    accuracy = model.score(X_test, y_test)
    print(f"테스트 정확도: {accuracy:.2f}")
    
    # 6. 결정 트리 시각화
    plt.figure(figsize=(12, 8))
    plot_tree(model, feature_names=iris.feature_names, class_names=iris.target_names, filled=True)
    plt.show()

     

    1. 라이브러리 불러오기

    from sklearn.datasets import load_iris

    - scikit-learn에서 제공하는 붓꽃 데이터를 불러온다.

     

    from sklearn.model_selection import train_test_split

    - 데이터를 훈련셋과 테스트셋으로 나눌 때 사용한다.

    from sklearn.tree import DecisionTreeClassifier, plot_tree

    - Decision Tree 시각화를 위해 사용된다.

     

    2. 데이터 로드

    - load_iris() 함수를 통해 데이터를 라이브러리에서 불러온다.

    - iris.data, iris.target으로 구분하여 데이터를 받는다. 

     

    f = pd.DataFrame(iris.data, columns=iris.feature_names)
    df['target'] = iris.target
    df['target_name'] = df['target'].apply(lambda x: iris.target_names[x])

    save_path = "D:/PythonData"
    csv_filename = "iris_dataset.csv"
    full_path = os.path.join(save_path, csv_filename)
    os.makedirs(save_path, exist_ok=True)
    df.to_csv(full_path, index=False)

    - pandas 라이브러리를 통해, 불러온 데이터를 csv파일로 저장할 수 있다.

     

    저장된 붓꽃 데이터

     

    - pandas 라이브러리를 통해, 불러온 데이터를 csv파일로 저장할 수 있다.

    Sepal 꽃받침
    Petal 꽃잎
    Setosa 붓꽃 종류. 작고 귀엽게 생김
    Versicolor 붓꽃 종류. 중간 크기
    Virginica 붓꽃 종류. 가장 큼

     

    3. 데이터 분할

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

    - 모델이 훈련셋 데이터에 과하게 맞추는 걸 방지하기 위해, Train Set과 Test Set으로 나눈다.

     

    4. 모델 생성 및 학습

    model = DecisionTreeClassifier(random_state=42)
    model.fit(X_train, y_train)

    - 트리 기반 모델을 생성하고, Train 데이터를 통해 모델 학습을 수행한다.

     

    5. 정확도 평가

    accuracy = model.score(X_test, y_test)
    print(f"테스트 정확도: {accuracy:.2f}")

    - 학습된 모델이 테스트 데이터로 얼마나 잘 예측했는지 측정한다. 

     

    6. 시각화

    plt.figure(figsize=(12, 8))
    plot_tree(model, feature_names=iris.feature_names, class_names=iris.target_names, filled=True)
    plt.show()

    - 의사결정 트리를 시각적으로 나타내어 모델의 의사결정 과정을 볼 수 있다.

     

     

    결과

    붓꽃 Decision Tree 결과

    gini : 지니 불순도 gini = 0 : 오직 한 클래스만 있음 (완벽한 분류)
    gini = 0.5 : 두 클래스가 반반 섞여있음
    gini = 0.667 : 세 클래스가 1/3씩 섞임 (최악의 경우)
    samples 샘플수. 트리 분할이 진행될수록 sample 수는 줄어듬
    Value [setosa수, Versicolor수, Virginica수]. 각 클래스별 샘플 개수
    Class 해당 노드에서 가장 많은 빈도의 클래스를 예측값으로 선택
Designed by Tistory.