머신 러닝 및 신경망 - 페이지 69

 

5.2 기본 데이터 처리(L05: Scikit-Learn을 사용한 기계 학습)



5.2 기본 데이터 처리(L05: Scikit-Learn을 사용한 기계 학습)

이전 비디오에서는 테이블 형식의 텍스트 파일을 데이터 세트로 읽는 방법에 대해 설명했습니다. 특히 CSV 파일, 특히 Iris 데이터 세트 작업에 중점을 두었습니다. CSV 파일에서 Pandas DataFrame으로 Iris 데이터 세트를 가져왔습니다.

이 비디오에서는 scikit-learn을 사용하여 기계 학습에 적합한 형식으로 데이터를 준비하는 방법을 자세히 살펴봅니다. Pandas 및 NumPy를 사용하여 데이터를 기계 학습에 적합한 형식으로 변환하는 기본 데이터 처리 기술을 살펴봅니다. 그러나 진행하기 전에 Pandas DataFrame에서 값 변환을 논의할 때 유용할 Python 함수의 개념을 간략하게 요약해 보겠습니다.

여기에는 "some_func"라는 간단한 Python 함수가 있습니다. 단일 입력 인수 "x"를 사용하여 문자열로 변환합니다. 그런 다음 변환된 값을 고정 문자열 "hello world"와 연결합니다. 123과 같은 정수를 입력으로 제공하면 문자열("123")로 변환되고 "hello world"와 연결되어 최종 문자열이 됩니다. 이것은 Python 함수가 작동하는 방식에 대한 기본 개요입니다. 콜론은 함수의 본문을 나타내고 반환 문은 출력을 지정합니다. 함수 내에 여러 줄의 코드가 있을 수 있지만 return 문은 끝을 표시합니다.

언급할 가치가 있는 또 다른 개념은 람다 함수입니다. Lambda 함수는 명시적으로 이름을 지정하지 않고 작은 함수를 정의하는 속기 방법입니다. 코드 줄을 저장하고 함수를 빠르게 작성해야 할 때 일반적으로 사용됩니다. Pandas 열의 데이터 변환 컨텍스트에서 람다 함수가 자주 사용됩니다. 람다 함수는 보다 간결한 구문을 제공하지만 기본적으로 일반 함수와 동일한 작업을 수행합니다. Pandas DataFrame 열의 적용 방법과 결합할 때 특히 유용합니다.

이전 강의에서는 CSV 파일에서 Iris 데이터셋을 Pandas DataFrame으로 읽어 들였습니다. Iris 데이터셋은 150개의 행으로 구성되어 있지만 간결성을 위해 처음 5개 행만 표시합니다. 데이터 세트에는 필수가 아닌 ID 열과 디자인 매트릭스 X로 표시되는 기능이 포함되어 있습니다. 일반적으로 y로 표시되는 클래스 레이블도 있습니다. 전통적으로 scikit-learn 및 기타 라이브러리는 문자열 변수를 클래스 레이블로 처리하지 않았으므로 문자열 변수를 정수로 변환하는 것이 일반적이었습니다. 예를 들어 "Iris setosa"는 정수 0으로, "Iris versicolor"는 1로, "Iris virginica"는 2로 변환됩니다. 많은 알고리즘이 문자열 레이블이 아닌 정수 클래스 레이블과 함께 작동하도록 설계되었기 때문에 이 변환이 필요했습니다.

그러나 scikit-learn은 이제 대부분의 함수에서 문자열 클래스 레이블을 지원하므로 명시적인 변환이 필요하지 않습니다. 내부적으로 변환은 자동으로 처리됩니다. 그럼에도 불구하고 일부 도구는 문자열 데이터를 올바르게 처리하지 못할 수 있으므로 여전히 클래스 레이블을 정수로 변환하는 것이 좋습니다. 이렇게 하면 다양한 도구와의 호환성을 보장하고 오류 발생 가능성을 줄일 수 있습니다.

변환 프로세스를 설명하기 위해 적용 메서드와 함께 람다 함수를 사용합니다. DataFrame의 종 열에 람다 함수를 적용하여 문자열 클래스 레이블을 정수 레이블로 변환할 수 있습니다. 그러나 매핑 사전을 사용하는 것이 종종 더 나은 접근 방식이라는 점을 언급할 가치가 있습니다. 더 나은 가독성을 제공하고 클래스 레이블 변환을 더 쉽게 해석할 수 있습니다. 또한 나중에 원래 클래스 레이블을 검색해야 하는 경우 역방향 사전을 정의하고 이를 사용하여 정수 레이블을 원래 문자열 표현으로 다시 매핑할 수 있습니다.

변환을 시연하기 위해 데이터 세트를 원래 상태로 다시 로드합니다. 그런 다음 적용을 사용하는 대신 map 함수를 활용하여 매핑 사전을 사용하여 문자열 레이블을 정수로 변환합니다. 기본 NumPy 배열에 액세스하는 values 특성의 사용도 보여줍니다. NumPy 배열 작업.

NumPy 어레이로 작업하는 것은 여러 가지 이유로 유익할 수 있습니다. NumPy 배열은 Pandas DataFrames에 비해 메모리 효율적이므로 대규모 데이터 세트에 이상적입니다. 또한 scikit-learn의 많은 기계 학습 알고리즘은 입력 데이터가 NumPy 배열 형식일 것으로 예상합니다.

Pandas DataFrame을 NumPy 배열로 변환하려면 간단히 DataFrame의 values 특성에 액세스하면 됩니다. 예를 보자:

import pandas as pd
import numpy as np

# Reload the Iris dataset
iris_df = pd.read_csv( 'iris.csv' )

# Convert the features (X) into a NumPy array
X = iris_df.drop([ 'species' ], axis= 1 ).values

# Convert the class labels (y) into a NumPy array
y = iris_df[ 'species' ].values
이 예제에서는 DataFrame의 drop 메서드를 사용하여 'species' 열을 제거하고 기능을 DataFrame으로 가져옵니다. 그런 다음 values 속성에 액세스하여 기능을 NumPy 배열로 변환하고 변수 X에 할당합니다.

마찬가지로 인덱싱 연산자 []를 사용하여 DataFrame의 'species' 열에 액세스하고 NumPy 배열로 변환하여 변수 y에 할당합니다.

이제 X 변수는 NumPy 배열로 기능 행렬을 포함하고 y 변수는 NumPy 배열로 클래스 레이블을 포함합니다. 이러한 배열을 다양한 기계 학습 알고리즘의 입력으로 사용할 수 있습니다.

모델 평가를 위해 데이터 세트를 교육 및 테스트 세트로 분할한다고 가정해 보겠습니다. Scikit-learn은 이 작업을 쉽게 해주는 train_test_split이라는 유틸리티 함수를 제공합니다. 예를 들면 다음과 같습니다.

 from sklearn.model_selection import train_test_split

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size= 0.2 , random_state= 42 )
이 예에서는 sklearn.model_selection 모듈에서 train_test_split 함수를 가져옵니다. 테스트를 위해 할당할 데이터 세트의 비율(이 경우 20%)을 지정하는 test_size 매개 변수와 함께 X 및 y 배열을 함수의 인수로 전달합니다. random_state 매개변수는 분할의 재현성을 보장합니다.

train_test_split을 호출한 후 4개의 배열을 얻습니다. X_train 및 y_train에는 훈련 데이터가 포함되고 X_test 및 y_test에는 테스트 데이터가 포함됩니다.

이제 X_train 및 y_train 배열을 사용하여 기계 학습 모델을 교육하고 X_test 및 y_test 배열을 사용하여 성능을 평가할 수 있습니다.

요약하면 Pandas DataFrame을 NumPy 배열로 변환하면 메모리 효율성 및 기계 학습 알고리즘과의 호환성과 같은 NumPy의 이점을 활용할 수 있습니다. 또한 scikit-learn은 데이터를 교육 및 테스트 세트로 분할하기 위한 train_test_split과 같은 편리한 기능을 제공합니다.

 

5.3 객체 지향 프로그래밍 및 Python 클래스(L05: Scikit-Learn을 사용한 기계 학습)



5.3 객체 지향 프로그래밍 및 Python 클래스(L05: Scikit-Learn을 사용한 기계 학습)

다음 강의에서 scikit-learn을 사용한 머신 러닝 주제를 탐구하기 전에 잠시 시간을 내어 객체 지향 프로그래밍, 특히 Python 클래스에 대해 논의해 봅시다. 클래스를 이해하는 것은 scikit-learn이 객체 지향 프로그래밍 개념에 크게 의존하기 때문에 관련성이 높습니다. 이 비디오의 끝 부분에서 scikit-learn API를 사용하여 K-최근접 이웃 구현을 시연할 것입니다. 이는 scikit-learn이 분류자와 같은 추정기를 구현하는 데 사용하는 접근 방식입니다.

이제 Python 클래스에 대해 논의하는 것으로 시작하겠습니다. scikit-learn API를 더 잘 이해하려면 클래스의 기본 사항을 이해하는 것이 중요합니다. 간단히 말해서 클래스는 개체를 만들기 위한 청사진으로 생각할 수 있습니다. 개체는 클래스의 인스턴스이며 쿠키를 만드는 데 사용되는 동일한 쿠키 커터 모양의 다양한 변형으로 시각화할 수 있습니다. 클래스 자체는 쿠키 커터 템플릿 역할을 하는 반면 쿠키는 클래스에서 생성된 개체를 나타냅니다.

Python에서는 class 키워드와 클래스 이름을 사용하여 클래스를 정의합니다. 클래스 내에서 다양한 클래스 메서드를 정의합니다. 클래스 메서드는 함수와 유사하지만 객체 자체를 참조하는 self라는 필수 첫 번째 인수가 있습니다. 이 자체 인수를 사용하면 개체의 특성과 메서드에 액세스할 수 있습니다. 즉, 개체의 데이터 및 동작과 상호 작용할 수 있습니다.

차량 예제와 관련하여 간단한 순진한 차량 클래스를 고려해 보겠습니다. 이 클래스는 자동차, 오토바이 또는 트럭과 같은 다양한 유형의 차량을 나타냅니다. 클래스에는 동작을 정의하는 다양한 메서드가 있습니다. 첫 번째 방법은 생성자라고도 하는 __init__ 방법입니다. 이 메서드는 클래스에서 새 객체가 생성될 때 자동으로 실행됩니다. 자체 인수와 개체를 초기화하는 데 필요한 추가 인수를 허용합니다.

__init__ 메서드에서 우리는 horsepower라는 속성을 정의하며, 여기에는 인수로 제공된 값이 할당됩니다. 이 속성은 차량의 마력을 나타냅니다. 새 객체가 생성되면 마력 값을 검색하기 위해 액세스할 수 있는 마력 속성을 갖게 됩니다.

__init__ 메서드 외에도 객체의 속성을 수정하는 다른 메서드를 정의할 수 있습니다. 예를 들어, tune_motor 메서드는 모터 튠업을 시뮬레이션하여 차량의 마력 속성을 두 배로 늘립니다. 차량 개체에서 이 메서드를 호출하면 그에 따라 마력 속성이 수정됩니다.

또한 개체의 특성을 기반으로 값을 반환하는 메서드를 정의할 수 있습니다. 예제에서 horsepower_to_torque 메소드는 객체의 마력과 제공된 RPM 값을 기반으로 토크 값을 계산합니다. 이 메서드는 객체의 속성을 활용하여 계산을 수행하고 유용한 결과를 반환하는 방법을 보여줍니다.

Python에는 메서드의 가시성을 나타내는 규칙이 있다는 점은 주목할 가치가 있습니다. _private_method와 같은 단일 밑줄 접두사가 있는 메서드는 비공개로 간주되며 클래스 사용자가 직접 사용할 수 없습니다. 그러나 일반적으로 권장되지는 않지만 사용자는 여전히 이러한 메서드에 액세스하고 호출할 수 있습니다. __very_private_method와 같이 이중 밑줄 접두사가 있는 메서드는 훨씬 더 제한적이며 액세스하려면 특정 구문이 필요합니다.

또한 Python은 클래스 상속을 지원하므로 부모 클래스에서 속성과 메서드를 상속하는 자식 클래스를 만들 수 있습니다. 이 개념을 사용하면 부모 클래스에 정의된 기존 기능을 활용하면서 추가 특성 및 동작이 있는 특수 클래스를 만들 수 있습니다. 예를 들어 Vehicle 클래스에서 상속하고 자동차에 대해 특별히 number_of_wheels 특성을 추가하는 특수 Car 클래스를 만들 수 있습니다.

논의된 개념을 설명하기 위해 K-최근접 이웃 분류기의 예가 제공됩니다. 이 구현은 scikit-learn API 규칙을 따르고 scikit-learn에서 추정기 클래스의 사용을 보여줍니다. 단순화된 구현은 다음과 같습니다.

 class KNNClassifier:

    def __init__( self , k):
         self .k = k
         self .X_train = None
         self .y_train = None
    
    def fit( self , X_train, y_train):
         self .X_train = X_train
         self .y_train = y_train
    
    def predict( self , X_test):
        predictions = []
         for x in X_test:
            distances = []
             for i, x_train in enumerate( self .X_train):
                distance = self ._calculate_distance(x, x_train)
                distances.append((distance, self .y_train[i]))
            distances.sort()
            k_nearest = distances[: self .k]
            prediction = self ._majority_vote(k_nearest)
            predictions.append(prediction)
         return predictions
    
    def _calculate_distance( self , x1, x2):
         # Calculate the distance between two data points
         # (e.g., Euclidean distance)
        pass
    
    def _majority_vote( self , neighbors):
         # Determine the majority class among the nearest neighbors
        pass

이 예에서 KNNClassifier는 K-최근접 이웃 분류자를 나타내는 클래스입니다. 생성자는 고려할 가장 가까운 이웃의 수를 지정하는 매개변수 k를 사용합니다.

적합 방법은 분류기를 훈련하는 데 사용됩니다. X_train(훈련 데이터) 및 y_train(해당 레이블)의 두 인수를 사용합니다. 이 방법은 단순히 나중에 사용할 수 있도록 개체의 속성에 훈련 데이터와 레이블을 저장합니다.

예측 방법은 새로운 데이터에 대한 예측을 만드는 데 사용됩니다. X_test(테스트 데이터)를 인수로 사용하고 테스트 데이터에 대해 예측된 레이블을 반환합니다. X_test의 각 데이터 포인트에 대해 메서드는 _calculate_distance 메서드를 사용하여 훈련 세트의 모든 데이터 포인트까지의 거리를 계산합니다. 그런 다음 k개의 가장 가까운 이웃을 선택하고 _majority_vote 메서드를 사용하여 다수 클래스를 결정합니다. 예측 레이블이 예측 목록에 추가됩니다.

_calculate_distance 메서드는 두 데이터 포인트 사이의 거리를 계산하는 전용 메서드(앞에 밑줄로 표시됨)입니다. 이것은 유클리드 거리 또는 문제에 적합한 다른 거리 메트릭이 될 수 있습니다.

_majority_vote 메서드는 이웃 집합 중에서 다수 클래스를 결정하는 또 다른 전용 메서드입니다. 이는 각 클래스 레이블의 발생 횟수를 세고 가장 높은 수의 레이블을 선택하여 수행할 수 있습니다.

이 예제는 scikit-learn에서 추정기 클래스의 기본 구조를 보여줍니다. 물론 scikit-learn은 KNeighborsClassifier 클래스에서 K-최근접 이웃의 보다 정교하고 최적화된 구현을 제공하지만 이 단순화된 버전은 기본 원칙을 보여줍니다.

 

5.4 Scikit-learn 소개(L05: Scikit-Learn을 사용한 기계 학습)



5.4 Scikit-learn 소개(L05: Scikit-Learn을 사용한 기계 학습)

비교적 짧은 이 비디오에서 목표는 scikit-learn을 사용한 기계 학습을 소개하는 것입니다. Scikit-learn은 Python에서 널리 사용되는 기계 학습 라이브러리로 다양한 기계 학습 작업을 위한 포괄적인 도구 및 알고리즘 세트를 제공합니다. 이전에 KNN(K-Nearest Neighbor) 강의 맥락에서 scikit-learn을 본 적이 있을 수 있지만 이 비디오는 한발 물러서서 라이브러리를 제대로 소개하는 것을 목표로 합니다.

이 짧은 비디오 후에 scikit-learn을 사용하여 교육 데이터 세트를 준비하는 방법에 대해 자세히 설명하는 긴 비디오가 있습니다. 여기에는 기존 접근 방식에 비해 데이터 준비를 보다 편리하고 효율적으로 만드는 기술과 도구가 포함됩니다.

다음 비디오에서는 scikit-learn 파이프라인을 사용하여 사전 처리 기술, 기계 학습 분류자 피팅 및 교육을 결합하는 것과 같은 scikit-learn의 몇 가지 멋진 개념을 살펴봅니다. 이를 통해 보다 간소화되고 효율적인 작업 흐름이 가능합니다.

이제 scikit-learn을 사용한 기계 학습에 대해 자세히 논의해 보겠습니다. Scikit-learn은 확립된 평판, 대규모 사용자 기반 및 사용자 친화적인 특성으로 인해 Python용 주요 기계 학습 라이브러리로 널리 간주됩니다. 일관되고 직관적인 API를 제공하는 잘 설계된 라이브러리입니다. Scikit-learn은 또한 적극적으로 유지 관리되고 정기적으로 업데이트되며, 많은 기여자들이 기계 학습 작업을 위한 강력하고 신뢰할 수 있는 선택이 되도록 합니다.

scikit-learn은 주로 전통적인 기계 학습 기술에 초점을 맞추고 있으며 딥 러닝을 위한 것이 아니라는 점에 유의해야 합니다. 딥 러닝은 자체 전문 라이브러리가 있는 별도의 분야입니다. 딥 러닝의 경우 TensorFlow 또는 PyTorch와 같은 다른 라이브러리가 일반적으로 사용됩니다. 그러나 전통적인 기계 학습 작업의 경우 scikit-learn이 자주 사용되는 라이브러리입니다.

Scikit-learn은 2007년으로 거슬러 올라가 초기 릴리스와 함께 한동안 사용되었습니다. 나이에도 불구하고 여전히 인기 있고 활발하게 유지 관리되는 라이브러리입니다. David Cournapeau의 Google Summer of Code 프로젝트로 시작하여 시간이 지남에 따라 다른 많은 개발자의 기여를 얻었습니다. GitHub의 1,875명 이상의 기여자와 거의 150,000명의 사용자를 통해 scikit-learn이 상당한 커뮤니티 지원을 제공하는 높은 평가를 받는 라이브러리임이 분명합니다.

설명서, 자습서 및 기타 유용한 리소스가 포함된 scikit-learn의 공식 웹 사이트를 찾을 수 있습니다. 연구 프로젝트에서 scikit-learn을 사용하는 경우 라이브러리를 참조로 인용하여 개발에 쏟은 노력을 인정하는 것이 좋습니다.

scikit-learn의 Estimator API를 이해하기 위해 주요 구성요소를 자세히 살펴보겠습니다. Estimator API는 지도 학습 작업에 사용되며 회귀 분석을 위한 회귀자 및 분류 작업을 위한 분류자를 포함합니다. scikit-learn을 사용할 때 일반적으로 클래스의 생성자에 설정된 특정 하이퍼파라미터로 추정기를 초기화합니다.

피팅 프로세스는 추정자에게 매우 중요합니다. 초기화 후에는 교육 데이터(특성) 및 해당 레이블을 제공하여 fit 메서드를 호출해야 합니다. 적합 방법은 주어진 데이터에 대해 추정기를 훈련하여 나중에 예측할 수 있도록 합니다. 피팅 프로세스 중에 특정 속성이 추정기에 할당되며 후행 밑줄로 표시되어 모델 피팅 중에 생성되었음을 나타냅니다.

모델이 적합해지면 예측 방법을 사용하여 새 데이터에 대한 예측을 수행할 수 있습니다. 예측 방법은 테스트 데이터(훈련 데이터와 동일한 기능 포함)를 입력으로 사용하고 예측된 레이블을 반환합니다.

또한 scikit-learn은 모델의 성능을 계산하는 점수 방법을 제공합니다. 분류자의 경우 정확도를 나타내는 경우가 많고 회귀자의 경우 일반적으로 결정 계수(R^2 점수)를 계산합니다. 이 방법은 모델의 성능을 평가하는 편리한 방법입니다.

이러한 핵심 구성 요소 외에도 scikit-learn은 머신 러닝 워크플로우를 향상시키는 광범위한 사전 처리 기술과 유틸리티를 제공합니다.

기계 학습의 중요한 측면 중 하나는 원시 데이터를 모델 교육에 적합한 형식으로 변환하는 데이터 전처리입니다. Scikit-learn은 기능 크기 조정, 누락된 값 처리, 범주형 변수 인코딩 등과 같은 작업을 처리할 수 있는 다양한 전처리 모듈을 제공합니다.

예를 들어 StandardScaler 클래스는 평균을 빼고 단위 분산으로 조정하여 기능을 표준화하는 데 사용할 수 있습니다. 이는 알고리즘이 더 빠르게 수렴하고 더 정확한 결과를 생성하는 데 도움이 되므로 척도가 다른 기능으로 작업할 때 중요합니다.

또 다른 유용한 전처리 기술은 누락된 값을 처리하는 것입니다. SimpleImputer 클래스는 누락된 값을 해당 기능의 평균, 중앙값 또는 가장 빈번한 값을 사용하는 것과 같은 적절한 대안으로 대체하는 전략을 제공합니다.

범주형 변수를 다룰 때 scikit-learn은 OneHotEncoder 및 LabelEncoder 클래스를 제공합니다. LabelEncoder는 범주형 레이블을 숫자 값으로 변환하는 반면 OneHotEncoder는 범주형 기능을 이진 벡터 표현으로 변환하여 알고리즘이 범주형 데이터와 효과적으로 작동할 수 있도록 합니다.

기계 학습 워크플로를 간소화하기 위해 scikit-learn은 파이프라인이라는 강력한 도구를 제공합니다. 파이프라인은 여러 전처리 단계와 기계 학습 모델을 단일 개체로 결합하여 전체 워크플로를 일관되게 관리하고 적용하기가 더 쉽습니다.

파이프라인은 동일한 사전 처리 단계가 교육 및 테스트 데이터 세트 모두에 일관되게 적용되도록 하여 데이터 유출 및 잠재적 오류를 방지합니다. 또한 전체 파이프라인 개체를 저장하고 개별 사전 처리 단계에 대해 걱정할 필요 없이 새 데이터에서 재사용할 수 있으므로 배포 프로세스를 단순화합니다.

scikit-learn의 파이프라인 기능을 사용하면 원하는 기계 학습 모델을 사용하여 크기 조정, 누락된 값 대치, 범주형 변수 인코딩과 같은 여러 전처리 기술을 함께 연결할 수 있습니다. 그 결과 더 능률적이고 효율적인 워크플로가 가능해져서 기계 학습 프로젝트의 핵심 측면에 집중할 수 있습니다.

Scikit-learn은 선형 회귀, 로지스틱 회귀, 서포트 벡터 머신, 의사 결정 트리, 랜덤 포레스트, 그래디언트 부스팅 등을 포함한 광범위한 기계 학습 알고리즘을 지원합니다. 각 알고리즘은 적합, 예측 및 점수와 같은 일관된 방법을 사용하여 추정기 클래스로 구현됩니다.

작업에 적합한 알고리즘을 선택하기 위해 scikit-learn은 모델 선택 및 평가를 위한 다양한 도구를 제공합니다. 여기에는 교차 유효성 검사, 하이퍼파라미터 튜닝 및 모델 평가 메트릭을 위한 기술이 포함됩니다. 교차 유효성 검사는 데이터를 여러 훈련 테스트 분할로 분할하고 데이터의 서로 다른 하위 집합에서 모델을 교육 및 평가하여 모델의 성능을 평가하는 데 도움이 됩니다.

하이퍼파라미터 튜닝은 모델의 하이퍼파라미터에 대한 최적의 값을 찾는 것인데, 이는 데이터로부터 학습되지는 않지만 훈련 전에 설정되는 파라미터입니다. Scikit-learn은 최적의 하이퍼파라미터 값을 찾는 프로세스를 자동화하기 위해 그리드 검색 및 무작위 검색과 같은 방법을 제공합니다.

정확도, 정밀도, 재현율, F1 점수, ROC 곡선 아래 영역과 같은 모델 평가 메트릭은 다양한 작업에서 모델의 성능을 평가하는 데 중요합니다. Scikit-learn은 쉽게 계산하고 비교할 수 있는 광범위한 메트릭을 제공합니다.

Scikit-learn은 다양한 기계 학습 작업을 위한 광범위한 도구와 알고리즘을 제공하는 Python의 강력하고 인기 있는 기계 학습 라이브러리입니다. 사용자 친화적인 API, 광범위한 문서 및 활발한 커뮤니티는 초보자와 숙련된 실무자 모두에게 탁월한 선택입니다. 데이터 전처리, 파이프라인 구축, 모델 선택 또는 성능 평가가 필요한 경우 scikit-learn은 작업을 효율적이고 효과적으로 수행하는 데 필요한 도구를 제공합니다.

 

5.5 Scikit-learn 변환기 API(L05: Scikit-Learn을 사용한 기계 학습)


5.5 Scikit-learn 변환기 API(L05: Scikit-Learn을 사용한 기계 학습)

영상에서 발표자는 scikit-learn의 유틸리티를 사용하여 훈련 데이터 세트를 준비하는 과정을 자세히 살펴보고 이전 영상에서 논의한 estimator API와 밀접하게 관련된 변환기 API를 소개합니다. Estimator API는 주로 분류자 및 회귀 분석 모델과 같은 감독 학습 모델에 사용되는 반면 Transformer API는 데이터 변환을 위해 설계되었습니다.

발표자는 데이터 세트를 일반적으로 교육 세트와 테스트 세트의 두 하위 집합으로 나누는 무작위 하위 샘플링과 관련된 문제를 해결하는 것으로 시작합니다. 데이터 세트를 무작위로 나누면 클래스 레이블 분포가 변경되어 훈련 세트와 테스트 세트 모두에서 클래스가 잘못 표시될 수 있다고 설명합니다. 이 문제를 극복하기 위해 발표자는 클래스 분포 또는 비율이 하위 집합에서 유지되도록 보장하는 층화 분할 사용을 제안합니다. 그들은 scikit-learn의 model_selection 하위 모듈에서 train_test_split 함수를 사용하여 층화 분할을 달성하는 방법을 시연합니다.

계속해서 발표자는 최소-최대 스케일링 및 표준화라는 두 가지 기술에 중점을 두고 데이터 정규화의 개념에 대해 자세히 설명합니다. 최소-최대 스케일링은 모든 값이 0에서 1 범위 내에 있도록 기능을 스케일링하는 것입니다. 발표자는 최소 기능 값으로 기능 열의 각 값을 뺀 다음 나누는 최소-최대 스케일링 공식을 제공합니다. 최대 특성 값과 최소 특성 값의 차이에 의해 결정됩니다.

대조적으로 표준화에는 평균이 0이고 표준 편차가 1이 되도록 기능을 변환하는 작업이 포함됩니다. 발표자는 특성 열의 각 값을 특성의 평균으로 뺀 다음 이를 특성의 표준편차로 나누는 표준화 공식에 대해 설명합니다. 그들은 표준화가 기계 학습에서 더 일반적으로 사용되며 특정 최적화 알고리즘에 특히 유용하다고 언급합니다.

최소-최대 스케일링 및 표준화의 실제 적용을 설명하기 위해 발표자는 장난감 기능 열을 사용하여 예제를 제공합니다. 그들은 특징이 중심에 있고 대략적인 단위 분산이 있는 한 샘플 사용 또는 모집단 표준 편차 사용 사이의 선택이 기계 학습 결과에 큰 영향을 미치지 않는다는 점을 강조합니다. 또한 유효성 검사 및 테스트 세트는 보이지 않는 데이터를 나타내므로 교육 세트에서 계산된 매개 변수(평균 및 표준 편차)를 사용하여 유효성 검사 및 테스트 세트의 크기를 조정하는 것의 중요성을 강조합니다.

비디오는 기계 학습에서 데이터 변환 및 처리를 위한 다양한 기술을 탐색합니다. 표준화와 같은 간단한 절차의 경우 별도의 라이브러리나 고급 기술에 의존하지 않고 수동으로 변환을 수행할 수 있음을 인정합니다. 그러나 기능 선택, 기능 차원 축소, 기능 추출과 같은 보다 복잡한 변환의 경우 Transformer API와 같은 도구를 사용하면 더 편리하고 효율적으로 사용할 수 있습니다.

다음으로 발표자는 범주형 데이터를 다루는 데 중점을 둡니다. 세 개의 기능 열과 하나의 레이블 열로 구성된 장난감 데이터 세트를 도입하여 범주형 변수를 순서형과 명목형의 두 가지 유형으로 분류할 수 있음을 강조합니다. 서수 변수에는 특정 순서 또는 계층이 있지만 명목 변수에는 없습니다. 예를 들어 M, L 및 XXL과 같은 티셔츠 크기가 명확한 순서를 나타내는 서수 변수로 "크기" 열을 강조 표시합니다. 서수 변수를 처리하기 위해 비디오는 매핑 사전을 사용하여 값을 숫자 표현으로 변환할 것을 권장합니다.

반면에 비디오는 명목 범주 데이터의 예로 클래스 레이블을 제공합니다. 클래스 레이블 간에 고유한 순서가 없기 때문에 발표자는 레이블 인코더를 사용하여 각 레이블에 고유한 정수 값을 할당할 것을 제안합니다. 레이블 인코더는 클래스 레이블 열에 맞춰 매핑 사전을 만든 다음 문자열 레이블을 정수 레이블로 변환하는 데 사용됩니다.

순서가 암시되지 않는 "색상"과 같은 명목 특성 열의 경우 레이블 인코더를 사용하면 오해의 소지가 있는 정보가 도입될 수 있습니다. 이러한 경우 동영상에서는 적절한 대안으로 원-핫 인코딩을 소개합니다. 이 기법은 명목 특성 열의 각 고유 값에 대해 새 특성 열을 만들고 특정 값의 존재 또는 부재를 나타내기 위해 0과 1을 할당하는 작업을 포함합니다. 결과 기능 열 중 하나를 삭제하면 필수 정보를 잃지 않고 중복을 제거할 수 있다고 언급됩니다.

이 비디오는 누락된 데이터를 간략하게 다루고 이를 처리하기 위한 몇 가지 기본 접근 방식을 제안합니다. 한 가지 전략은 누락된 값이 무작위로 발생하고 체계적인 문제를 나타내지 않는 경우 누락된 값이 포함된 행이나 열을 삭제하는 것입니다. 이는 pandas 라이브러리의 dropna() 메서드를 사용하여 수행할 수 있습니다. 또 다른 접근 방식은 SimpleImputer 변환기와 같은 도구를 사용하여 평균 또는 중앙값과 같은 통계적 측정값으로 간격을 채워 누락된 데이터를 대체하는 것입니다. 그러나 비디오는 전가가 의도하지 않은 편견을 유발할 수 있으므로 신중하게 고려해야 한다고 경고합니다.

또한 비디오는 감독 학습 작업으로 문제를 처리하여 누락된 값을 예측할 수 있는 가능성을 언급합니다. 이 시나리오에서는 누락된 특성 열을 대상 변수로 간주할 수 있으며 누락된 데이터가 없는 행은 회귀 모델에 적합하도록 훈련 데이터로 활용할 수 있습니다.

이 비디오는 학습 데이터 세트 준비의 중요성, 층화 분할 적용, 최소-최대 스케일링 및 표준화를 사용한 데이터 정규화를 포함하여 데이터 변환 기술에 대한 포괄적인 개요를 제공합니다. 또한 범주형 데이터 처리, 서수 변수와 명목 변수 간의 구별을 다루고 사전 매핑, 레이블 인코더 및 원-핫 인코딩과 같은 기술을 소개합니다. 또한 비디오는 누락된 데이터를 간략하게 다루고 누락된 값을 삭제하거나 대치하는 것과 같은 접근 방식을 설명하는 동시에 지도 학습을 통해 누락된 값을 예측할 수 있는 가능성에 대해서도 언급합니다.

 

5.6 Scikit-Learn 파이프라인(L05: Scikit-Learn을 사용한 기계 학습)



5.6 Scikit-Learn 파이프라인(L05: Scikit-Learn을 사용한 기계 학습)

자, 여러분, 드디어 강의 5의 마지막 부분에 도달했습니다. 제 생각에는 가장 흥미로운 부분인 신성한 학습 파이프라인입니다. 이러한 파이프라인은 데이터 처리 및 예측 단계를 원활하게 결합할 수 있게 해주는 매우 유용한 개체 또는 클래스입니다. 개요를 제공하기 위해 파이프라인이 작동하는 방식에 대한 순서도를 제시하겠습니다. 아직 모든 세부 사항을 자세히 다루지는 않겠습니다.

파이프라인을 변환기 API가 있는 추정기로 생각하십시오. 추정기와 유사하게 파이프라인에는 교육 세트에서 사용할 수 있는 적합 방법이 있습니다. 내부적으로 파이프라인은 여러 맞춤 및 변환 단계를 거쳐 최종 맞춤 단계에 도달합니다. 파이프라인에서 정의한 내용에 따라 데이터 스케일링(예: 표준화 또는 최소-최대 스케일링), 차원 축소, 학습 알고리즘 교육, 테스트 세트에서 사용할 수 있는 예측 모델 반환과 같은 다양한 작업을 수행할 수 있습니다. .

추정기 API와 마찬가지로 테스트 세트에서 예측 메서드를 호출하면 파이프라인은 내부적으로 변환 단계를 사용하여 훈련 세트에서 수행된 것과 동일한 크기 조정을 적용합니다. 이것은 데이터 처리의 일관성을 보장합니다. 마지막으로 파이프라인은 적합 모델을 사용하여 분류자의 경우 클래스 레이블을 반환하는 것과 같은 예측을 수행합니다.

파이프라인의 간단한 코드 예제를 통해 이를 설명하겠습니다. 여기서는 Sacred Learn의 sklearn.pipeline 하위 모듈에서 make_pipeline 함수를 사용하여 파이프라인을 만들고 있습니다. 이것은 파이프라인을 생성하는 편리한 방법입니다. 이 예제에서는 표준 스케일러와 K-최근접 이웃 분류기로 구성된 기본 파이프라인을 구축하고 있습니다. 이전 비디오에서 논의한 대로 표준 스케일러는 평균이 0이고 분산이 단위가 되도록 데이터를 표준화합니다. 표준 스케일러와 K-최근접 이웃 분류기를 파이프라인의 구성 요소로 초기화합니다.

파이프라인이 생성되면 fit 메서드를 사용하여 훈련 데이터에서 파이프라인을 훈련할 수 있습니다. 그런 다음 예측 방법을 사용하여 테스트 세트에 대한 예측을 할 수 있습니다. fit을 호출하면 파이프라인은 먼저 표준 스케일러를 적용하여 교육 데이터에서 평균 및 표준 편차를 학습합니다. 그런 다음 이 정보를 사용하여 데이터를 확장하고 다음 단계인 K-최근접 이웃 분류기로 전달합니다. 분류기는 표준화된 트레이닝 세트를 수신하고 학습 알고리즘을 수행합니다.

예측 중에 맞춤 단계가 필요하지 않다는 점을 제외하면 동일한 프로세스가 발생합니다. 파이프라인은 학습 중에 학습된 통계를 재사용하여 테스트 데이터를 확장하고 학습된 분류기를 적용하여 예측을 수행합니다.

요약하면 파이프라인을 사용하면 변환기 및 추정기와 같은 여러 개체를 함께 연결하여 응집력 있는 워크플로를 생성할 수 있습니다. 기계 학습 작업에서 데이터 처리 및 예측 단계를 처리하는 편리하고 효율적인 방법을 제공합니다.

이제 모델 선택을 위한 간단한 홀드아웃 방법을 적용하여 작동 중인 파이프라인을 살펴보겠습니다. 모델 선택에는 최상의 모델을 선택하기 위한 하이퍼파라미터 조정이 포함됩니다. 홀드아웃 방법에서는 데이터를 훈련 세트와 테스트 세트로 나눕니다. 교육 세트 내에서 학습을 위한 하위 집합과 검증을 위한 또 다른 하위 집합으로 분할하여 다양한 하이퍼파라미터 설정으로 다양한 모델을 평가합니다.

scikit-learn에서는 그리드 서치라는 방법을 사용하여 홀드아웃 방법과 하이퍼파라미터 튜닝을 수행할 수 있습니다. 그리드 검색에는 평가하려는 하이퍼파라미터 조합을 정의하는 파라미터 그리드 생성이 포함됩니다. 예를 들어, k-최근접 이웃의 경우 이웃 수(k)와 거리 메트릭(p)에 대해 서로 다른 값을 고려할 수 있습니다. 그리드 검색은 가능한 모든 조합을 반복하여 훈련 세트에 모델을 맞추고 검증 세트에서 모델을 평가합니다.

그리드 검색은 일반적으로 K-겹 교차 검증과 함께 사용되지만 이 예에서는 홀드아웃 방법에 중점을 둘 것입니다. 파이프라인을 사용하여 홀드아웃 방법과 그리드 검색을 적용하려면 scikit-learn의 GridSearchCV 클래스를 활용할 수 있습니다. 이 클래스를 사용하면 매개변수 그리드와 파이프라인을 정의할 수 있으며 모델을 피팅하고 평가하는 프로세스를 처리합니다.

다음은 GridSearchCV를 파이프라인과 함께 사용하는 방법을 보여주는 예제 코드 스니펫입니다.

 from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.pipeline import make_pipeline

# Load the iris dataset
iris = load_iris()
X = iris.data
y = iris.target

# Split the data into training and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size= 0.2 , random_state= 42 )

# Create a pipeline
pipeline = make_pipeline(StandardScaler(), KNeighborsClassifier())

# Define the parameter grid for grid search
param_grid = { 'kneighborsclassifier__n_neighbors' : [ 3 , 5 , 7 ],
               'kneighborsclassifier__weights' : [ 'uniform' , 'distance' ]}

# Create a GridSearchCV object
grid_search = GridSearchCV(pipeline, param_grid, cv= 5 )

# Fit the models and perform grid search
grid_search.fit(X_train, y_train)

# Print the best parameters and best score
print( "Best Parameters: " , grid_search.best_params_)
print( "Best Score: " , grid_search.best_score_)

# Evaluate the best model on the test set
best_model = grid_search.best_estimator_
accuracy = best_model.score(X_test, y_test)
print( "Test Accuracy: " , accuracy)
이 예에서는 Iris 데이터 세트를 로드하고 train_test_split 함수를 사용하여 훈련 및 테스트 세트로 분할하는 것으로 시작합니다. 그런 다음 데이터 스케일링을 위한 StandardScaler와 추정기로 KNeighborsClassifier로 구성된 make_pipeline을 사용하여 파이프라인을 만듭니다.

다음으로 평가하려는 다양한 하이퍼파라미터 조합을 지정하는 파라미터 그리드 param_grid를 정의합니다. 이 경우 K-최근접 이웃 분류기에 대한 이웃 수(n_neighbors)와 가중치 함수(가중치)를 변경합니다. 그리드의 매개변수 이름에는 이중 밑줄(__)이 뒤에 오는 파이프라인 구성 요소의 이름이 접두사로 붙습니다.

우리는 GridSearchCV 개체를 만들고 파이프라인, 매개 변수 그리드 및 원하는 교차 유효성 검사 폴드(cv) 수를 전달합니다. GridSearchCV 클래스는 교육 데이터에 파이프라인을 맞추고 검증 세트에서 모델을 평가하여 그리드 검색을 자동으로 수행합니다.

그리드 검색이 완료되면 GridSearchCV 객체의 best_params_ 및 best_score_ 속성을 사용하여 최고의 매개변수와 최고 점수에 액세스할 수 있습니다. 이 값을 출력하여 어떤 하이퍼파라미터 조합이 최고의 성능을 내는지 확인합니다.

마지막으로 GridSearchCV 개체의 best_estimator_ 속성에서 액세스하고 score 메서드를 사용하여 정확도를 계산하여 테스트 세트에서 최상의 모델을 평가합니다.

이 예는 파이프라인과 그리드 검색을 활용하여 다양한 하이퍼파라미터 설정을 효율적으로 탐색하고 홀드아웃 방법을 사용하여 최상의 모델을 선택하는 방법을 보여줍니다. 파이프라인 내에서 데이터 처리 단계와 모델 교육을 결합하여 기계 학습 워크플로를 간소화하고 다양한 구성 요소와 하이퍼파라미터를 쉽게 실험할 수 있습니다.

 

6.1 결정 트리 소개(L06: 결정 트리)



6.1 결정 트리 소개(L06: 결정 트리)

마지막으로 의사 결정 트리라는 새로운 주제를 다룰 것입니다. 결정 트리 알고리즘은 분류기 및 회귀 모델에 대한 반복적인 하향식 구성 방법으로 간주될 수 있습니다. 비디오를 관리하기 쉽고 너무 길지 않게 유지하기 위해 강의를 7개 부분으로 나누었습니다.

첫 번째 부분에서는 의사 결정 트리, 개념 표현에 대한 간략한 개요를 제공하고 핵심 용어를 소개합니다. 다음으로 의사 결정 트리의 맥락에서 재귀 알고리즘에 대해 논의하고 재귀 알고리즘이 무엇인지 간략하게 설명합니다. 이러한 이해는 의사 결정 트리의 런타임 복잡성(Big O)을 분석하는 데 도움이 됩니다.

계속해서 다양한 유형의 의사 결정 트리를 살펴보겠습니다. 현재 두 번째 학습자는 Leo Breiman이 개발한 CART(Classification and Regression Trees) 결정 트리 알고리즘을 구현합니다. 그러나 ID3 및 C4.5와 같은 다른 알고리즘이 있으며 각각 고유한 장점과 단점이 있습니다. 우리는 이러한 다양한 방법을 다룰 것이며 ID3 결정 트리를 구현하는 숙제를 할 수도 있습니다.

강의 내에서 의사 결정 트리에 사용되는 다양한 분할 기준도 살펴봅니다. 현재 두 번째 학습자는 일반적으로 Gini 불순물을 기반으로 하는 CART를 사용합니다. 그러나 서로 다른 분할 기준을 혼합하고 일치시킬 수 있습니다. 이러한 분할 기준은 의사 결정 트리를 분할하기 위한 좋은 기능을 결정하는 데 사용되는 기능 또는 측정값을 나타냅니다. 우리는 지니 불순도 및 엔트로피 기준을 다루고 트리 성장 및 분할 품질을 평가할 때 오분류 오류보다 선호되는 이유에 대해 논의할 것입니다.

이러한 세부 사항을 다룬 후에는 계산 런타임 및 분류 정확도 측면에서 결정 트리를 보다 효율적으로 만들 수 있는 개선 사항에 대해 자세히 알아볼 것입니다. 또한 과대적합의 문제를 해결하고 이를 완화하기 위한 기술을 탐구합니다.

마지막으로 인기 있는 기계 학습 라이브러리인 scikit-learn에서 의사 결정 트리 작업을 보여주는 코드 예제를 제공합니다. 이 실용적인 예는 의사 결정 트리 및 구현에 대한 이해를 강화하는 데 도움이 됩니다.

이제 의사 결정 트리의 기본 개념에 대해 살펴보겠습니다. 엄격하게 기계 학습 문제는 아니지만 결정 트리는 의사 결정과 관련된 일상 생활 시나리오와 관련이 있습니다. 예를 들어, 우리는 주어진 순간에 무엇을 해야 하는지에 대한 결정을 고려할 수 있습니다. 우리가 할 일이 있다면, 우리는 안에 머물면서 그 일을 완수하기로 선택할 수 있습니다. 반대로 해야 할 일이 없다면 날씨 전망에 따라 밖에 나가는 것을 고려할 수 있습니다.

날씨가 화창하고 너무 춥지 않다면 해변에 가기로 선택할 수 있습니다. 그러나 날씨가 흐리면 달리기를 선택할 수도 있습니다. 비나 눈이 오는 경우 친구들에게 이용 가능 여부를 물어볼 수 있습니다. 친구들이 바쁘다면 우리는 안에 머물면서 책 읽기와 같은 활동에 참여하기로 결정할 수 있습니다. 반면에 친구가 한가하면 영화관에 가거나 온라인 비디오 게임을 하거나 온라인 채팅을 하는 것과 같은 옵션을 탐색할 수 있습니다.

이 기본 개요는 각 노드가 질문 또는 결정에 해당하고 가지가 다른 옵션으로 이어지는 의사 결정 트리를 나타냅니다. 루트 노드는 트리의 첫 번째 질문 또는 결정을 나타내고 리프 노드는 최종 출력입니다. 내부 노드는 트리의 흐름을 안내하는 중간 결정입니다.

또한 의사 결정 트리의 노드는 이진 또는 다중 범주 노드로 분류할 수 있습니다. 이진 노드는 두 가지 옵션만 제공하는 반면 다중 범주 노드는 두 개 이상의 옵션을 지원합니다. 그러나 다중 범주 분할은 앞에서 설명한 것처럼 이분법 분할로 변환할 수 있습니다.

결정 트리는 프로그래밍의 if-else 문과 유사한 규칙 집합으로 해석될 수도 있습니다. 실제로 역변환이 항상 가능한 것은 아니지만 결정 트리를 규칙 집합으로 변환할 수 있습니다. 의사 결정 트리의 이러한 특성은 의사 결정 트리를 해석 및 설명하기 쉽게 만듭니다. 이는 법률 및 의료 영역과 같이 해석 가능성과 설명 가능성이 중요한 영역에서 매우 중요합니다.

의사 결정 트리를 구성하려면 입력 및 해당 출력의 예가 포함된 데이터 세트가 필요합니다. 각 예는 특성(속성 또는 예측 변수라고도 함) 집합과 대상 변수(예측하려는 출력)로 구성됩니다. 의사 결정 트리 알고리즘은 데이터를 분할하고 예측하는 가장 좋은 방법을 결정하기 위해 기능과 해당 관계를 분석합니다.

의사 결정 트리를 구축하는 프로세스에는 각 노드에서 데이터를 분할하는 최상의 기능을 선택하는 작업이 포함됩니다. 목표는 분류 정확도 측면에서 가장 많은 정보 이득 또는 최상의 분할을 제공하는 기능을 찾는 것입니다. 이 프로세스는 일반적으로 루트 노드에서 시작하여 리프 노드까지 계속해서 재귀적으로 수행됩니다.

각 단계에서 알고리즘은 지니 불순도 또는 엔트로피와 같은 다양한 분할 기준을 평가합니다. 지니 불순도는 세트에서 임의로 선택한 요소를 잘못 분류할 확률을 측정하는 반면 엔트로피는 세트에서 임의로 선택한 요소의 클래스 레이블을 식별하는 데 필요한 평균 정보량을 측정합니다. 이러한 기준은 분할 후 결과 하위 집합의 순도를 결정하는 데 도움이 됩니다.

분할할 기능을 선택하면 가능한 기능 값에 따라 데이터가 하위 집합으로 나뉩니다. 이 프로세스는 중지 기준이 충족될 때까지 각 하위 집합에 대해 반복적으로 반복됩니다. 중지 기준은 최대 트리 깊이에 도달하거나 리프 노드에서 최소 샘플 수에 도달하거나 리프 노드에서 특정 수준의 순도를 달성하는 것일 수 있습니다.

훈련된 의사 결정 트리를 사용하여 새 인스턴스에 대한 대상 변수를 예측하기 위해 루트 노드에서 시작하여 인스턴스의 기능 값을 기반으로 적절한 분기를 따라 트리를 탐색합니다. 결국 예측된 출력을 제공하는 리프 노드에 도달합니다.

결정 트리에는 몇 가지 장점이 있습니다. 이해하고 해석하기 쉽기 때문에 의사 결정 프로세스를 시각화하고 설명하는 데 널리 사용됩니다. 숫자 및 범주 기능을 모두 처리할 수 있으며 분류 및 회귀 작업 모두에 사용할 수 있습니다. 결정 트리는 또한 분할 프로세스 중에 효과적으로 처리할 수 있으므로 누락된 값과 이상값에 강합니다.

그러나 결정 트리에도 몇 가지 제한 사항이 있습니다. 훈련 데이터를 쉽게 과대적합할 수 있으므로 보이지 않는 예에 대한 일반화가 좋지 않습니다. 이는 가지치기 기술을 사용하거나 랜덤 포레스트 또는 그래디언트 부스팅과 같은 앙상블 방법을 사용하여 완화할 수 있습니다. 결정 트리는 훈련 데이터의 작은 변화에도 민감하며 유사한 데이터 세트에 대해 서로 다른 분할이 생성될 수 있습니다. 또한 의사 결정 트리는 기능 간의 복잡한 관계를 캡처하는 데 어려움을 겪을 수 있습니다.

결론적으로 결정 트리는 분류 및 회귀 작업에 사용할 수 있는 강력하고 해석 가능한 모델입니다. 데이터를 노드와 분기가 있는 트리 구조로 나타내어 명확한 의사 결정 프레임워크를 제공합니다. 과적합을 처리하는 기술과 함께 분할 기준 및 중지 기준의 선택은 정확하고 강력한 의사 결정 트리를 구축하는 데 중요한 역할을 합니다.

 

6.2 재귀 알고리즘 및 Big-O(L06: 결정 트리)



6.2 재귀 알고리즘 및 Big-O(L06: 결정 트리)

이 비디오에서 우리의 토론은 분할 정복의 개념과 밀접하게 연결된 재귀 알고리즘을 중심으로 이루어집니다. 분할 정복에는 문제를 더 작은 하위 문제로 분해하고 개별적으로 해결한 다음 솔루션을 결합하는 작업이 포함됩니다. 의사 결정 트리 교육 및 예측은 물론 다양한 분할 및 정복 알고리즘이 이 개념과 연결됩니다. 재귀는 유일한 접근 방식은 아니지만 분할 및 정복 알고리즘을 구현하는 데 사용되는 일반적인 기술입니다.

재귀 개념을 이해하기 위해 Python에서 구현된 재귀 알고리즘의 예를 살펴보겠습니다. 토론을 위해 세부 사항을 살펴보기 전에 목적을 분석할 수 있도록 함수의 실제 이름을 의도적으로 숨겼습니다. 잠시 시간을 내어 이 기능이 무엇을 할 수 있는지 생각해 보시기 바랍니다. 동영상을 일시 중지하거나 Jupyter 노트북에서 실험하여 동작을 이해할 수도 있습니다.

시간을 들여 분석했다고 가정하고 함수를 함께 탐색해 봅시다. 이 특정 함수는 Python 목록에서 작동합니다. 예를 들어 [1, 2, 3]과 같은 목록을 고려하십시오. 이 함수의 목적은 배열 또는 목록의 길이를 결정하는 것입니다. 어떻게 작동하는지 살펴보겠습니다. 이 함수는 여기서 'X'로 표시된 입력을 받고 두 가지 조건을 확인합니다. 먼저 목록이 비어 있는지 확인합니다. 그렇다면 빈 목록의 길이가 0이고 중지 조건으로 작동하기 때문에 함수는 0을 반환합니다. 그렇지 않고 목록이 비어 있지 않으면 함수는 1을 반환하고 더 작은 입력으로 자신을 호출합니다.

이것이 추상적으로 보인다면 단계별로 분석해 보겠습니다. [1, 2, 3]과 같은 완전한 목록으로 시작한다고 가정합니다. 처음에 함수는 목록이 비어 있는지 확인하지만 그렇지 않습니다. 결과적으로 'else' 문으로 진행하여 1을 반환하고 더 작은 입력으로 자신을 재귀적으로 호출합니다. 이 경우 원래 목록에서 첫 번째 요소를 제거하므로 입력은 [2, 3]이 됩니다. 프로세스를 반복합니다. 함수는 다시 1을 반환하고 새 입력 [3]으로 자신을 호출하고 궁극적으로 빈 목록으로 자신을 호출합니다.

빈 목록에 도달하면 함수는 'if' 조건을 다시 한 번 확인합니다. 이 조건은 이제 참입니다. 결과적으로 0을 반환합니다. 전체 표현식을 평가할 때 값 3을 얻습니다. 따라서 이 함수는 자체 정의 내에서 자신을 호출하는 재귀를 사용하여 배열의 길이를 계산합니다. 재귀는 컴퓨터 과학 이론에서 개념적으로 우아한 솔루션이지만 구현을 위한 가장 실용적인 접근 방식은 아닐 수 있습니다. Python에서 재귀는 자체 호출 수에 제한이 있으며 목록이 너무 크면 스택 오버플로 오류가 발생할 수 있습니다.

계속해서 재귀를 사용하는 다른 예를 살펴보겠습니다. 여기서는 퀵 정렬 알고리즘을 사용하여 분할 정복 문제(목록 또는 배열 정렬)를 해결합니다. 이전 함수와 유사하게 퀵 정렬은 재귀를 구현 수단으로 사용합니다. 알고리즘은 중지 조건을 사용하며 여기서 함수는 배열에 요소가 2개 미만인 경우 있는 그대로 배열을 반환합니다. 그렇지 않으면 알고리즘이 코드의 기본 섹션을 실행합니다.

퀵 정렬은 어떻게 작동합니까? 먼저 일반적으로 배열의 첫 번째 요소인 피벗을 선택합니다. 그런 다음 두 개의 새 목록을 만듭니다. 하나는 피벗보다 작은 요소를 보유하고 다른 하나는 피벗보다 큰 요소를 보유합니다. 피벗을 제외한 배열을 반복하고 피벗과의 비교를 기반으로 각 요소를 더 작거나 큰 목록에 배포합니다. 다음으로 피벗을 중앙 요소로 사용하여 더 작은 목록과 더 큰 목록 모두에서 재귀적으로 퀵 정렬을 호출합니다. 결국,

재귀 호출은 목록에 두 개 미만의 요소가 있는 경우 중지 조건에 도달합니다. 이 시점에서 함수는 단순히 정렬된 목록을 반환합니다.

프로세스를 이해하기 위해 예제를 살펴보겠습니다. 정렬되지 않은 목록 [7, 2, 5, 1, 9, 3]이 있다고 가정합니다. 퀵 정렬 알고리즘은 다음과 같이 진행됩니다.

  1. 피벗은 첫 번째 요소인 7로 선택됩니다.
  2. 크고 작은 두 개의 빈 목록이 만들어집니다.
  3. 피벗을 제외하고 목록을 반복합니다.
    • 2는 7보다 작으므로 더 작은 목록으로 이동합니다.
    • 5는 7보다 작으므로 더 작은 목록으로 이동합니다.
    • 1은 7보다 작으므로 더 작은 목록으로 이동합니다.
    • 9는 7보다 크므로 더 큰 목록으로 이동합니다.
    • 3은 7보다 작으므로 더 작은 목록으로 이동합니다.
  4. 더 작은 목록과 더 큰 목록 모두에서 재귀적으로 빠른 정렬을 호출합니다.
    • 작은 목록의 경우: [2, 5, 1, 3]
      • 2를 피벗으로 선택하고 빈 목록을 만듭니다.
      • 목록을 반복합니다.
        • 5는 2보다 크므로 더 큰 목록으로 이동합니다.
        • 1은 2보다 작으므로 더 작은 목록으로 이동합니다.
        • 3은 2보다 크므로 더 큰 목록으로 이동합니다.
      • 더 작은 목록과 더 큰 목록 모두에서 재귀적으로 빠른 정렬을 호출합니다.
        • 더 작은 목록의 경우: [1]
          • 목록에 2개 미만의 요소가 있으므로 있는 그대로 반환됩니다.
        • 더 큰 목록의 경우: [5, 3]
          • 5를 피벗으로 선택하고 빈 목록을 만듭니다.
          • 목록을 반복합니다.
            • 3은 5보다 작으므로 더 작은 목록으로 이동합니다.
          • 더 작은 목록과 더 큰 목록 모두에서 재귀적으로 빠른 정렬을 호출합니다.
            • 더 작은 목록: [3]
              • 목록에 2개 미만의 요소가 있으므로 있는 그대로 반환됩니다.
            • 더 큰 목록: [5]
              • 목록에 2개 미만의 요소가 있으므로 있는 그대로 반환됩니다.
      • 최종 정렬된 더 작은 목록은 [1]입니다.
      • 최종 정렬된 더 큰 목록은 [3, 5]입니다.
    • 더 큰 목록: [9]
      • 목록에 2개 미만의 요소가 있으므로 있는 그대로 반환됩니다.
  5. 최종 정렬된 더 작은 목록은 [1]입니다.
  6. 최종 정렬된 더 큰 목록은 [3, 5, 9]입니다.
  7. 정렬된 더 작은 목록, 피벗(7) 및 정렬된 더 큰 목록을 연결합니다.
    • 정렬된 목록은 [1, 3, 5, 7, 9]가 됩니다.

목록을 더 작은 하위 목록으로 재귀적으로 나누고 정렬함으로써 퀵 정렬 알고리즘은 전체 목록을 효율적으로 정렬합니다.

결론적으로 재귀 알고리즘은 분할 정복 방식에서 중요한 역할을 합니다. 그들은 문제를 더 작은 하위 문제로 분해하고 개별적으로 해결하며 결국 솔루션을 결합하여 원래 문제를 해결합니다. 재귀 함수는 중지 조건에 도달할 때까지 더 작은 입력에 대해 반복적으로 작업하면서 자체 정의 내에서 자신을 호출합니다. 그러나 무한 재귀를 피하고 알고리즘이 솔루션으로 수렴되도록 종료 조건을 고려하는 것이 중요합니다.

 

6.3 의사결정나무의 종류(L06: 의사결정나무)



6.3 의사결정나무의 종류(L06: 의사결정나무)

이전 비디오에서는 결정 트리 및 재귀 알고리즘을 소개하는 데 중점을 두었습니다. 이제 다양한 유형의 의사 결정 트리를 살펴보겠습니다. 특정 디자인 선택을 변경하면 의사 결정 트리 알고리즘의 다른 구현으로 이어질 수 있는 방법을 살펴보겠습니다.

먼저 이전 비디오에서 논의한 의사 코드의 일반 의사 결정 트리 알고리즘을 요약해 보겠습니다. 클래스 레이블이 1과 0뿐인 이진 분류 문제를 처리했습니다. 트리는 이진 분할을 포함하는 이진 구조를 따랐습니다. 이는 각 노드가 정확히 두 개의 하위 노드로 분할되었음을 의미합니다. 또한 기능 값이 0 또는 1일 수 있는 이진 기능만 고려했습니다.

그러나 이전에 scikit-learn에서 의사 결정 트리 시각화를 사용하여 시연했듯이 연속 기능을 활용하고 이진 분할로 변환할 수도 있습니다. 예를 들어, 기능을 선택하고 xj라고 하고 't'로 표시된 임계값을 사용하여 두 부분으로 나눌 수 있습니다. 이 분할 기준은 t보다 작은 xj 또는 t보다 크거나 같은 xj로 정의될 수 있으며 이는 참 또는 거짓으로 표시될 수 있습니다. 이를 통해 분할 프로세스 중에 결정 임계값을 조정할 수 있으므로 연속 기능이 있는 경우에도 이진 분할을 수행할 수 있습니다. 숙제에서 그러한 분할 작업을 할 기회가 있습니다.

이제 결정 트리 알고리즘 구현에 초점을 맞추겠습니다. 의사 결정 트리의 각 노드에서 xj로 표시된 단일 기능을 고려합니다. 여기서 'j'의 범위는 1에서 m까지이며 최대 m 기능을 나타냅니다. 부모 노드를 두 개의 자식 노드로 분할할 때 자식 0과 자식 1이라고 가정하면 분할을 위해 선택할 기능을 결정해야 합니다. 연속 기능의 경우 xj가 특정 값 't'보다 크거나 같은지 비교하는 결정 임계값도 고려해야 합니다. 적절한 기능과 임계값을 선택하는 것이 중요하며 분할 품질을 평가하려면 양호도 측정이 필요합니다.

일반 트리 성장 알고리즘을 요약하기 위해 부모 노드가 분할될 때 가장 큰 정보 이득을 가져오는 기능을 선택합니다. 정보 획득은 분할에 대한 장점의 척도입니다. 정보 이득이 높을수록 연속 기능에 대한 분할 임계값을 포함하여 선택한 기능과 분할이 더 좋습니다. 다음 비디오에서는 분할의 양호함을 평가하기 위해 일반적으로 사용되는 두 가지 척도인 엔트로피와 지니 불순도에 대해 논의할 것입니다.

알고리즘은 특정 중지 조건을 따릅니다. 하위 노드가 순수하면 중지됩니다. 즉, 노드 내의 모든 데이터 포인트가 동일한 클래스 레이블을 갖습니다. 또는 정보 이득이 0보다 작거나 같으면 정지하여 개선이 없음을 나타냅니다. 순수한 노드에 도달하거나 진행에 실패하면 트리 성장을 더 이상 중지합니다.

의사 결정 트리를 성장시킨 후 이를 사용하여 예측할 수 있습니다. 상위 노드와 리프 노드로 구성된 여러 수준의 트리가 있다고 가정합니다. 새 데이터 포인트의 클래스 레이블을 예측하기 위해 데이터 포인트의 특성 값을 기반으로 트리를 순회합니다. 각 노드에서 리프 노드에 도달할 때까지 기능 조건에 따라 해당 분기를 따릅니다. 리프 노드의 경우 다수결 방식을 사용하여 클래스 레이블을 결정합니다. 즉, 해당 리프 노드 내에서 가장 자주 나타나는 클래스 레이블을 예측합니다.

결정 트리는 이진 및 다중 클래스 분류 문제를 모두 처리할 수 있다는 점에 유의해야 합니다. 이전 슬라이드에서 논의한 의사 코드는 이진 분류에 중점을 두었지만 결정 트리는 임의의 수의 클래스 레이블을 처리할 수 있습니다. 다수결 방식은 클래스 수에 관계없이 적용됩니다.

의사 결정 트리 알고리즘을 개발할 때 다양한 디자인 선택 사항을 접하게 됩니다. 중요한 질문 중 하나는 노드를 분할하는 방법입니다. 분할 기준을 정의하고 서로 다른 분할을 비교하고 평가하는 방법을 결정해야 합니다. 분할의 품질을 평가하기 위해 일반적으로 사용되는 두 가지 척도는 엔트로피와 지니 불순도입니다.

엔트로피는 노드 내의 불순물 또는 무질서의 척도입니다. 해당 노드에 있는 데이터 포인트의 클래스 레이블과 관련된 불확실성을 정량화합니다. 노드의 엔트로피는 다음 공식을 사용하여 계산됩니다.

Entropy(node) = - sum(p(i) * log2(p(i))), 모든 클래스 i에 대해

여기서 p(i)는 클래스 i에 속하는 노드의 데이터 포인트 비율을 나타냅니다. 엔트로피 값의 범위는 0에서 1까지입니다. 여기서 0은 순수 노드(모든 데이터 포인트가 동일한 클래스에 속함)를 나타내고 1은 최대 불순도(모든 클래스에 걸쳐 데이터 포인트의 균등한 분포)를 나타냅니다.

분할 품질을 평가하기 위해 결과 자식 노드에 대한 엔트로피 값의 가중 평균을 계산합니다. 이것은 정보 획득으로 알려져 있습니다. 정보 이득은 다음과 같이 계산됩니다.

정보 이득 = 엔트로피(부모) - 합계((|Sv| / |S|) * 엔트로피(Sv)), 모든 자식 노드 v

여기서 Entropy(parent)는 부모 노드의 엔트로피 |Sv| 자식 노드 v의 데이터 포인트 수를 나타내며 |S| 상위 노드의 총 데이터 포인트 수입니다. 정보 이득은 특정 기능을 기반으로 노드를 분할하여 달성한 엔트로피 감소를 측정합니다.

지니 불순물은 분할 품질을 평가하는 데 사용되는 또 다른 척도입니다. 해당 노드의 클래스 레이블 분포를 기반으로 클래스 레이블을 할당하는 경우 노드에서 무작위로 선택된 데이터 포인트를 잘못 분류할 확률을 정량화합니다. 노드의 지니 불순도는 다음 공식을 사용하여 계산됩니다.

Gini(node) = 1 - sum(p(i)^2), 모든 클래스 i에 대해

여기서 p(i)는 클래스 i에 속하는 노드의 데이터 포인트 비율을 나타냅니다. 엔트로피와 유사하게 Gini 불순물 값의 범위는 0에서 1까지입니다. 여기서 0은 순수 노드를 나타내고 1은 최대 불순물을 나타냅니다.

분할 품질을 평가하기 위해 결과 자식 노드에 대한 Gini 불순도 값의 가중 평균을 계산합니다. 이것은 지니 불순도 지수로 알려져 있습니다. 지니 불순도 지수는 다음과 같이 계산됩니다.

지니 지수 = sum((|Sv| / |S|) * Gini(Sv)), 모든 자식 노드 v

여기서 |Sv| 자식 노드 v의 데이터 포인트 수를 나타내며 |S| 상위 노드의 총 데이터 포인트 수입니다. Gini 지수는 특정 기능을 기반으로 노드를 분할하여 달성한 Gini 불순물의 감소를 측정합니다.

엔트로피와 지니 불순도는 모두 의사 결정 트리 알고리즘에서 일반적으로 사용되며 둘 사이의 선택은 특정 문제 및 데이터 특성에 따라 다릅니다. scikit-learn에서 의사 결정 트리 모델을 구축할 때 'entropy' 또는 'gini'를 지정하는 기준 매개 변수를 선택할 수 있습니다.

다음 비디오에서는 이러한 측정값을 자세히 살펴보고 결정 트리 알고리즘에서 최상의 분할을 결정하는 데 사용하는 방법에 대해 설명합니다.

 

6.4 분할 기준(L06: 결정 트리)



6.4 분할 기준(L06: 결정 트리)

비디오에서 연사는 결정 트리의 복잡성을 탐구하고 이 프레임워크 내에서 기준 분할의 개념을 소개합니다. 분할 기준은 본질적으로 상위 노드를 하위 노드로 분할하는 데 가장 적합한 기능을 결정하는 데 사용되는 기준 또는 측정입니다. 일반적으로 데이터 세트는 x1, x2, x3, ..., xm으로 표시되는 여러 기능을 포함합니다. 여기서 j는 1에서 m까지의 값을 나타냅니다.

발표자는 의사 결정 트리의 각 노드에서 분할 프로세스에 사용할 기능에 대해 중요한 결정을 내려야 한다고 강조합니다. 최적의 기능을 식별하기 위해 특정 기준 또는 측정값을 정의하여 사용 가능한 기능을 비교하고 평가합니다. 목표는 더 나은 분할을 생성하는 기능을 선택하여 의사 결정 트리의 예측 정확도를 향상시키는 것입니다.

결정 트리의 작동을 설명하기 위해 발표자는 x1, x2, x3의 세 가지 기능과 클래스 레이블 y를 나타내는 열로 구성된 장난감 데이터 세트를 제시합니다. 이 데이터 세트의 클래스 레이블은 1 또는 0의 값을 취하는 이진수입니다. 화자는 두 가지 기능만 사용하면 이 특정 데이터 세트에 대해 100%의 교육 정확도를 달성할 수 있다고 말합니다.

발표자는 청중에게 100%의 교육 정확도로 이어질 수 있는 세 가지 기능을 기반으로 두 가지 규칙을 찾도록 유도합니다. 그들은 해결책을 고려하기 위해 비디오를 일시 중지할 것을 제안합니다. 그 후 발표자는 x1과 x2만이 관련성이 있고 유용한 기능인 반면 x3은 겉보기에 임의적이며 정확도에 기여하지 않는다고 설명하면서 솔루션을 공개합니다.

앞으로 화자는 그래프에 x1 및 x2 값을 플로팅하여 데이터 세트를 시각적으로 나타냅니다. 그래프의 빨간색 점은 클래스 레이블 1에 속하는 데이터 포인트를 나타내고 파란색 사각형은 0으로 레이블이 지정된 데이터 포인트를 나타냅니다. 데이터 포인트에서 관찰된 패턴을 기반으로 화자는 분할을 생성하여 결정 트리를 형성합니다.

초기 분할은 5.5보다 큰 x1을 기반으로 합니다. 이 분할은 데이터를 두 영역으로 분할합니다. 하나는 파란색으로 레이블이 지정되고 다른 하나는 빨간색으로 레이블이 지정됩니다. 화자는 이 분할이 일부 데이터 포인트를 올바르게 분류하지만 다른 데이터 포인트도 잘못 분류한다고 지적합니다. 후속 분할은 10.5보다 큰 x2를 기반으로 합니다. 이는 분류 프로세스를 더욱 세분화하고 궁극적으로 100% 훈련 정확도를 달성하는 결정 트리로 이어집니다.

명확성을 높이기 위해 스피커는 의사 결정 트리를 보다 명확하게 시각적으로 표현하여 각 노드와 관련된 정보를 설명합니다. 각 노드는 분할을 거쳐 자식 노드가 생성되는 부모 노드를 상징합니다. 각 노드에 대해 분할 값(특성 값 및 임계값으로 표시됨), 엔트로피(정보 콘텐츠 측정), 교육 예제(샘플) 수, 클래스 레이블 분포(장소) 및 다수 클래스가 표시됩니다.

의사 결정 트리는 상위 노드가 하위 노드를 생성하는 계층 구조로 표시됩니다. 발표자는 각 노드의 중요성을 강조하면서 결정 트리가 이러한 노드를 사용하여 입력 기능을 기반으로 예측을 수행한다는 점을 강조합니다.

마지막으로 화자는 기능 2만 활용하여 100% 교육 정확도를 달성하는 대안적 접근 방식을 언급합니다. 이들은 이 대체 접근 방식을 기반으로 하는 의사 결정 트리를 시연하여 기능 2를 값 7.5와 10에서 분할하여 데이터 포인트를 원하는 클래스로 정확하게 분리하는 방법을 보여줍니다.

연속 기능이 있고 임계값을 올바르게 설정하는 이상적인 시나리오에서는 앞서 언급한 개념이 적용될 것입니다. 변수 "V"를 사용하는 대신 임계값보다 작거나 같은 연속 기능을 나타내는 변수 xj를 사용합니다. 두 번째 하위 노드는 임계값보다 큰 값을 기호화합니다. 이 경우 연속적인 특징을 가지고 있다면 이전과 비슷한 수식을 사용할 수 있지만 이제 임계값을 함수에 통합해야 합니다. 값을 비교하여 임계값보다 크거나 같은지 확인할 수 있습니다.

따라서 CART(분류 및 회귀 트리)와 유사한 연속 기능 및 이진 트리가 있는 경우 여러 자식 노드 대신 두 개의 자식 노드에 대해서만 합산하면 됩니다. 하나의 자식 노드는 임계값보다 큰 값에 해당하고 다른 노드는 임계값보다 작거나 같은 값을 나타냅니다. 이 단순화는 임계값을 기반으로 두 가지 가능한 결과에 집중하므로 논리적입니다. 그럼에도 불구하고 이 설명이 복잡해 보일 수 있으며 여전히 누락된 중요한 측면이 엔트로피의 개념이라는 점을 인정하는 것이 중요합니다. 이에 대해서는 다음 슬라이드에서 살펴볼 것입니다.

이러한 맥락에서 엔트로피는 정보 이론의 영역에서 Claude Shannon이 도입한 Shannon 엔트로피와 관련이 있습니다. 생물 물리학이나 열역학에서 사용되는 엔트로피와는 다릅니다. Shannon 엔트로피는 의사 결정 트리 내 하위 노드의 불순물 또는 장애를 정량화하기 위한 메트릭으로 사용됩니다. Bernoulli 분포와 유사한 두 가지 결과를 갖는 개별 무작위 변수에 의해 전달되는 정보의 양을 정량화합니다. Bernoulli 분포에서 p로 표시되는 확률 매개변수는 이벤트가 발생할 가능성을 나타냅니다.

Shannon은 정보를 값 1/p를 인코딩하는 데 필요한 비트 수로 정의했습니다. 간단히 말해서 이벤트와 관련된 확실성 또는 불확실성 수준을 측정합니다. 필요한 비트 수는 1/p의 대수 밑수 2로 계산할 수 있습니다. 확률 p가 증가함에 따라 필요한 비트 수가 줄어들어 확실성이 높아집니다. 반대로 확률이 0에 가까워지면 필요한 비트 수가 증가하여 불확실성이 높아집니다.

이 개념을 예시하기 위해 몇 가지 예를 살펴보겠습니다. 확률이 0.5인 경우 필요한 비트 수는 1이 됩니다. 확률이 0이면 필요한 비트 수는 무한대가 되어 절대 확실성을 나타냅니다. 반대로 확률이 1이면 필요한 비트 수가 0이 되어 완전한 불확실성을 나타냅니다. 따라서 항 -log2(p)의 값 범위는 마이너스 무한대에서 0까지입니다.

Shannon 엔트로피는 가능한 모든 이벤트에 대한 평균 정보로 계산됩니다. 각 이벤트와 관련된 정보의 가중 평균을 나타내며 가중치는 이벤트의 각 확률입니다. 의사 결정 트리의 경우 엔트로피 개념을 적용하여 자식 노드의 불순물을 측정할 수 있습니다. 노드가 클래스 레이블의 균형 잡힌 분포를 나타내는 경우 더 높은 엔트로피를 가지며 더 큰 불순도를 나타냅니다. 반대로 노드가 한 클래스가 우세한 왜곡된 분포를 표시하는 경우 엔트로피가 낮아 불순물이 낮음을 나타냅니다. 이 개념은 불순물이 높은 노드가 분류 목적으로 더 적은 정보를 제공하므로 직관적으로 정렬됩니다.

엔트로피는 의사 결정 트리의 하위 노드 내에서 불순물 또는 무질서를 측정하는 수단을 제공합니다. 클래스 레이블 분포를 기반으로 노드의 순도를 평가할 수 있습니다. 엔트로피가 높은 노드는 더 다양한 분포를 나타내는 반면 엔트로피가 낮은 노드는 더 균일한 분포를 나타냅니다. 자식 노드의 엔트로피를 고려하면 의사 결정 트리를 구성할 때 더 많은 정보에 입각한 결정을 내릴 수 있습니다.

 

6.5 지니 및 엔트로피 대 오분류 오류(L06: 결정 트리)


6.5 지니 및 엔트로피 대 오분류 오류(L06: 결정 트리)

이전 비디오에서는 의사 결정 트리를 성장시키는 데 사용할 수 있는 다양한 분할 기준에 대해 논의했습니다. 이제 두 가지 분할 기준인 지니 불순도와 엔트로피가 세 번째 기준인 오분류 오류보다 선호되는 이유를 살펴보겠습니다.

요약하자면 엔트로피, 스케일링된 엔트로피(지니 불순물과 비교하기 위해 0.5로 스케일링됨) 및 오분류 오류의 세 가지 불순물 측정이 있습니다. 이러한 불순물 측정의 모양은 다릅니다. 엔트로피는 오목함수로 나타나는 반면, 오분류 오류는 기울기가 선형인 0.5에서 날카로운 정점을 보입니다.

질문이 생깁니다. 성장하는 의사 결정 트리에 오분류 오류 대신 엔트로피와 지니 불순도를 사용하는 이유는 무엇입니까? 이 질문은 엔트로피뿐만 아니라 지니 불순도에도 적용됩니다. 이 비디오에서는 엔트로피에 초점을 맞추겠지만 이 개념은 지니 불순물에도 동일하게 적용됩니다.

정보 이득 방정식을 고려해 봅시다. 상위 노드에서 데이터 세트 D를 나타내는 상위 노드에 대한 불순물 함수가 있습니다. 특성 값을 기반으로 이 데이터 세트를 분할하면 다른 자식 노드가 생성됩니다. 이 개념은 범주 및 연속 기능 모두에 적용됩니다. 연속 기능의 경우 임계값을 기준으로 저장소를 만들어 분할할 수 있습니다.

불순물 측정은 부모 노드와 자식 노드 모두에 사용되며 부모 노드와 현재 자식 노드에서 원래 데이터 세트의 크기를 고려하여 합산합니다. 일반적으로 부모에 대해 하나의 불순도 측정을 선택하면 자식 노드에 대해서도 일관성을 유지합니다.

실제로는 오분류 오류가 단점이 있기 때문에 사용을 피하는 경향이 있는데, 이 비디오에서 다룰 것입니다. 엔트로피와 오분류 오류가 어떻게 계산되는지 간단히 다시 살펴보겠습니다. 엔트로피는 각 클래스에 대한 레이블 비율의 곱과 비율의 로그를 합산하여 계산됩니다. 반면 오분류 오류는 잘못 분류된 레이블의 비율을 측정하는 0/1 손실을 기반으로 합니다.

이제 엔트로피 대 오분류 오류에 초점을 맞추면 한 가지 주요 차이점은 모양입니다. 엔트로피는 오목하지만 오분류 오류는 그렇지 않습니다. 이 차이는 결정 트리 성장에 대한 오분류 오류보다 엔트로피가 선호되는 이유에 영향을 미칩니다.

이를 설명하기 위해 간단한 장난감 데이터 세트를 고려해 보겠습니다. 상위 노드에는 클래스 1의 예 40개와 클래스 0의 예 80개가 있습니다. 특성 값을 기준으로 데이터 세트를 분할하면 클래스 분포가 다른 자식 노드가 생깁니다. 이 분할이 부모에 비해 노드의 순도를 향상시키는지 평가해야 합니다.

부모 노드와 자식 노드의 엔트로피를 계산하면 자식 노드 2의 엔트로피가 부모 노드보다 낮아 순도가 향상되었음을 알 수 있습니다. 그러나 하위 노드 1은 상위 노드보다 나쁩니다. 평균적으로 분할이 유익한지 판단해야 합니다.

분할 품질을 측정하기 위해 부모 노드와 자식 노드의 엔트로피 값을 고려하는 정보 이득을 사용합니다. 정보 획득이 양수이면 분할이 양호함을 나타냅니다. 이 예에서 정보 이득은 양수이며 엔트로피를 기반으로 유리한 분할을 나타냅니다.

이제 오분류 오류를 사용하여 동일한 시나리오를 살펴보겠습니다. 부모, 자식 노드 1 및 자식 노드 2에 대한 오류는 잘못 분류된 레이블의 비율을 기반으로 계산됩니다. 이러한 오류 값을 정보 이득 공식에 대입하면 정보 이득이 0임을 알 수 있습니다. 제로 정보 이득은 분할이 유익하지 않음을 의미합니다. 결과적으로 이러한 노드는 존재하지 않으며 다른 기능을 고려해야 합니다.

결론적으로, 성장하는 의사 결정 트리에서 오분류 오류보다 엔트로피가 선호되는 주된 이유는 엔트로피가 데이터의 불확실성과 무질서를 보다 효과적으로 포착하기 때문입니다. 엔트로피의 오목한 모양은 서로 다른 클래스 분포 사이의 더 나은 구별을 허용하고 더 미묘한 불순물 측정을 제공합니다. 반면 오분류 오류는 오분류된 레이블의 비율만 고려하고 클래스의 불확실성과 분포를 포착하지 않는 보다 단순한 측정입니다.

엔트로피의 오목한 모양은 작은 클래스 불균형과 큰 클래스 불균형 모두에 페널티를 줄 수 있습니다. 클래스 비율의 변화에 민감하여 보다 고르게 분포된 클래스에 더 높은 가중치를 부여합니다. 이 속성은 클래스 분포가 불균형한 데이터 세트를 처리할 때 엔트로피를 특히 유용하게 만듭니다.

대조적으로, 오분류 오류는 0.5에서 날카로운 정점을 갖는 선형 형태를 가집니다. 모든 오분류를 동등하게 처리하고 다양한 오분류 정도를 구분하지 않습니다. 이로 인해 오분류 오류가 클래스 불균형에 더 민감해지고 불균형 데이터 세트가 있는 시나리오에서는 덜 효과적입니다.

또한 엔트로피와 오분류 오류의 모양 차이는 의사 결정 트리 학습 프로세스에 영향을 미칩니다. 결정 트리는 정보 획득을 최대화하거나 불순물을 줄이는 분할을 찾는 것을 목표로 합니다. 엔트로피는 불순도에 대한 보다 세분화된 측정을 제공하므로 의사 결정 트리가 보다 정보에 입각한 정확한 분할을 수행할 수 있습니다.

불순도 측정으로 엔트로피를 사용하여 결정 트리는 기능과 클래스 간의 복잡한 관계를 캡처할 수 있습니다. 연속 기능과 범주 기능을 모두 처리할 수 있으며 데이터에서 복잡한 패턴을 발견할 수 있습니다.

요약하면, 엔트로피는 데이터의 불확실성과 무질서를 보다 효과적으로 포착하기 때문에 결정 트리 성장을 위해 오분류 오류보다 선호됩니다. 오목한 모양 덕분에 다양한 클래스 분포를 더 잘 구분할 수 있으며 불균형 데이터 세트에 더 강력합니다. 엔트로피를 사용함으로써 의사 결정 트리는 더 많은 정보에 입각한 분할을 수행하고 기능과 클래스 간의 복잡한 관계를 캡처할 수 있습니다.

사유: