logo

의사결정나무 분류 알고리즘

  • 의사결정나무는 지도 학습 기술 분류 및 회귀 문제 모두에 사용할 수 있지만 대부분 분류 문제를 해결하는 데 선호됩니다. 트리 구조의 분류기입니다. 내부 노드는 데이터 세트의 기능을 나타내고 분기는 결정 규칙을 나타냅니다. 그리고 각 리프 노드는 결과를 나타냅니다.
  • 의사결정나무에는 두 개의 노드가 있습니다. 결정 노드 그리고 리프 노드. 결정 노드는 결정을 내리는 데 사용되며 여러 분기를 갖는 반면 리프 노드는 해당 결정의 출력이며 추가 분기를 포함하지 않습니다.
  • 결정이나 테스트는 주어진 데이터 세트의 기능을 기반으로 수행됩니다.
  • 주어진 조건을 기반으로 문제/결정에 대한 가능한 모든 솔루션을 얻기 위한 그래픽 표현입니다.
  • 트리와 유사하게 루트 노드에서 시작하여 추가 분기로 확장되어 트리와 같은 구조를 구성하기 때문에 의사결정 트리라고 합니다.
  • 트리를 만들기 위해 우리는 다음을 사용합니다. 카트 알고리즘, 이는 다음을 의미합니다. 분류 및 회귀 트리 알고리즘.
  • 의사결정 트리는 단순히 질문을 하고 대답(예/아니요)에 따라 트리를 하위 트리로 더 나눕니다.
  • 아래 다이어그램은 의사결정 트리의 일반적인 구조를 설명합니다.

참고: 의사결정 트리에는 숫자 데이터뿐만 아니라 범주형 데이터(YES/NO)도 포함될 수 있습니다.

의사결정나무 분류 알고리즘

의사결정나무를 사용하는 이유는 무엇입니까?

머신러닝에는 다양한 알고리즘이 있으므로, 주어진 데이터세트와 문제에 가장 적합한 알고리즘을 선택하는 것이 머신러닝 모델을 생성할 때 기억해야 할 주요 사항입니다. 다음은 의사결정나무를 사용하는 두 가지 이유입니다.

  • 의사결정나무는 일반적으로 의사결정을 내릴 때 인간의 사고 능력을 모방하므로 이해하기 쉽습니다.
  • 의사결정 트리의 논리는 트리와 같은 구조를 보여주기 때문에 쉽게 이해할 수 있습니다.

의사결정 트리 용어

루트 노드:루트 노드는 의사결정 트리가 시작되는 곳입니다. 이는 전체 데이터세트를 나타내며, 이는 두 개 이상의 동종 세트로 더 나뉩니다.리프 노드:리프 노드는 최종 출력 노드이며 리프 노드를 얻은 후에는 트리를 더 이상 분리할 수 없습니다.파편:분할은 주어진 조건에 따라 결정 노드/루트 노드를 하위 노드로 나누는 프로세스입니다.가지/하위 트리:나무가 쪼개져 형성된 나무.전정:가지치기는 나무에서 원하지 않는 가지를 제거하는 과정입니다.상위/하위 노드:트리의 루트 노드를 부모 노드라고 하고, 다른 노드를 자식 노드라고 합니다.

의사결정나무 알고리즘은 어떻게 작동하나요?

의사결정 트리에서 주어진 데이터 세트의 클래스를 예측하기 위해 알고리즘은 트리의 루트 노드에서 시작됩니다. 이 알고리즘은 루트 속성의 값을 레코드(실제 데이터 세트) 속성과 비교하고, 비교에 따라 분기를 따라가며 다음 노드로 점프합니다.

다음 노드의 경우 알고리즘은 속성 값을 다른 하위 노드와 다시 비교하고 더 멀리 이동합니다. 트리의 리프 노드에 도달할 때까지 프로세스를 계속합니다. 전체 프로세스는 아래 알고리즘을 사용하여 더 잘 이해할 수 있습니다.

    1 단계:전체 데이터 세트를 포함하는 루트 노드 S로 트리를 시작합니다.2 단계:다음을 사용하여 데이터세트에서 가장 적합한 속성을 찾습니다. 속성 선택 측정(ASM). 3단계:S를 최상의 속성에 대한 가능한 값을 포함하는 하위 집합으로 나눕니다.4단계:최상의 속성을 포함하는 의사결정 트리 노드를 생성합니다.5단계:-3단계에서 생성된 데이터세트의 하위 집합을 사용하여 새로운 의사결정 트리를 반복적으로 만듭니다. 노드를 더 이상 분류할 수 없고 최종 노드를 리프 노드라고 부르는 단계에 도달할 때까지 이 프로세스를 계속합니다.

예: 채용 제안을 받고 그 제안을 수락할지 여부를 결정하고 싶어하는 후보자가 있다고 가정해 보겠습니다. 따라서 이 문제를 해결하기 위해 의사결정 트리는 루트 노드(ASM의 급여 속성)로 시작합니다. 루트 노드는 해당 레이블을 기반으로 다음 결정 노드(사무실로부터의 거리)와 하나의 리프 노드로 더 분할됩니다. 다음 결정 노드는 하나의 결정 노드(Cab 시설)와 하나의 리프 노드로 더 분할됩니다. 마지막으로 결정 노드는 두 개의 리프 노드(수락된 제안 및 거부된 제안)로 분할됩니다. 아래 다이어그램을 고려하십시오.

의사결정나무 분류 알고리즘

속성 선택 측정

의사결정 트리를 구현하는 동안 루트 노드와 하위 노드에 가장 적합한 속성을 선택하는 방법에 대한 주요 문제가 발생합니다. 그래서 이러한 문제를 해결하기 위해 다음과 같은 기술이 있습니다. 속성 선택 측정값 또는 ASM. 이 측정을 통해 트리 노드에 가장 적합한 속성을 쉽게 선택할 수 있습니다. ASM에는 다음과 같은 두 가지 인기 있는 기술이 있습니다.

    정보 획득 지니지수

1. 정보 획득:

  • 정보 이득은 속성을 기반으로 데이터 세트를 분할한 후 엔트로피 변화를 측정한 것입니다.
  • 기능이 클래스에 대해 얼마나 많은 정보를 제공하는지 계산합니다.
  • 정보 획득의 가치에 따라 노드를 분할하고 의사결정 트리를 구축합니다.
  • 의사결정 트리 알고리즘은 항상 정보 이득의 가치를 최대화하려고 시도하며, 정보 이득이 가장 높은 노드/속성이 먼저 분할됩니다. 아래 공식을 사용하여 계산할 수 있습니다.
 Information Gain= Entropy(S)- [(Weighted Avg) *Entropy(each feature) 

엔트로피: 엔트로피는 주어진 속성의 불순물을 측정하는 척도입니다. 데이터의 무작위성을 지정합니다. 엔트로피는 다음과 같이 계산할 수 있습니다.

Entropy(s)= -P(yes)log2 P(yes)- P(no) log2 P(no)

어디,

    S= 총 샘플 수 P(예)= 예일 확률 P(아니요)= 아니오일 확률

2. 지니 지수:

  • 지니 지수는 CART(분류 및 회귀 트리) 알고리즘에서 의사결정 트리를 생성할 때 사용되는 불순물 또는 순도를 측정하는 지표입니다.
  • 지니 지수가 높은 속성보다 지니 지수가 낮은 속성을 선호해야 합니다.
  • 바이너리 분할만 생성하며 CART 알고리즘은 Gini 인덱스를 사용하여 바이너리 분할을 생성합니다.
  • 지니 지수는 아래 공식을 사용하여 계산할 수 있습니다.
 Gini Index= 1- &#x2211;<sub>j</sub>P<sub>j</sub><sup>2</sup> 

가지치기: 최적의 의사결정나무 얻기

가지치기(pruning)는 최적의 의사결정나무를 얻기 위해 나무에서 불필요한 노드를 삭제하는 과정이다.

트리가 너무 크면 과적합 위험이 증가하고, 트리가 작으면 데이터 세트의 중요한 기능을 모두 포착하지 못할 수 있습니다. 따라서 정확도를 떨어뜨리지 않고 학습 트리의 크기를 줄이는 기술을 가지치기(Pruning)라고 합니다. 나무는 크게 두 종류가 있다 전정 사용된 기술:

    비용 복잡성 가지치기 오류 정리 감소.

의사결정나무의 장점

  • 인간이 실제 생활에서 어떤 결정을 내릴 때 따르는 것과 동일한 과정을 따르기 때문에 이해하기 쉽습니다.
  • 의사결정과 관련된 문제를 해결하는 데 매우 유용할 수 있습니다.
  • 문제에 대해 가능한 모든 결과를 생각하는 것은 도움이 됩니다.
  • 다른 알고리즘에 비해 데이터 정리 요구 사항이 적습니다.

의사결정나무의 단점

  • 의사결정 트리에는 많은 레이어가 포함되어 있어 복잡해집니다.
  • 과적합 문제가 있을 수 있으며, 이는 다음을 사용하여 해결할 수 있습니다. 랜덤 포레스트 알고리즘.
  • 더 많은 클래스 레이블의 경우 의사결정 트리의 계산 복잡성이 증가할 수 있습니다.

의사결정나무의 Python 구현

이제 Python을 사용하여 의사결정 트리를 구현하겠습니다. 이를 위해 데이터 세트 '를 사용합니다. user_data.csv ,' 이전 분류 모델에서 사용했던 것입니다. 동일한 데이터 세트를 사용하여 의사결정 트리 분류기를 다음과 같은 다른 분류 모델과 비교할 수 있습니다. KNN SVM, 로지스틱 회귀 등

'100개 중 10개'는 무엇인가요?

아래에 설명된 단계도 동일하게 유지됩니다.

    데이터 전처리 단계 훈련 세트에 의사결정 트리 알고리즘 맞추기 테스트 결과 예측 결과의 정확성 테스트(혼란행렬 생성) 테스트 세트 결과 시각화.

1. 데이터 전처리 단계:

다음은 전처리 단계의 코드입니다.

 # importing libraries import numpy as nm import matplotlib.pyplot as mtp import pandas as pd #importing datasets data_set= pd.read_csv(&apos;user_data.csv&apos;) #Extracting Independent and dependent Variable x= data_set.iloc[:, [2,3]].values y= data_set.iloc[:, 4].values # Splitting the dataset into training and test set. from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test= train_test_split(x, y, test_size= 0.25, random_state=0) #feature Scaling from sklearn.preprocessing import StandardScaler st_x= StandardScaler() x_train= st_x.fit_transform(x_train) x_test= st_x.transform(x_test) 

위의 코드에서는 데이터를 전처리했습니다. 데이터 세트를 로드한 위치는 다음과 같습니다.

의사결정나무 분류 알고리즘

2. 훈련 세트에 의사결정 트리 알고리즘 맞추기

이제 모델을 훈련 세트에 맞추겠습니다. 이를 위해 우리는 결정트리분류기 수업 sklearn.tree 도서관. 아래는 그에 대한 코드입니다:

 #Fitting Decision Tree classifier to the training set From sklearn.tree import DecisionTreeClassifier classifier= DecisionTreeClassifier(criterion=&apos;entropy&apos;, random_state=0) classifier.fit(x_train, y_train) 

위 코드에서는 두 가지 주요 매개변수를 전달한 분류자 개체를 만들었습니다.

    '기준='엔트로피':기준은 분할 품질을 측정하는 데 사용되며, 이는 엔트로피에 의해 제공되는 정보 이득으로 계산됩니다.무작위_상태=0':무작위 상태를 생성합니다.

이에 대한 출력은 다음과 같습니다.

 Out[8]: DecisionTreeClassifier(class_weight=None, criterion=&apos;entropy&apos;, max_depth=None, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort=False, random_state=0, splitter=&apos;best&apos;) 

3. 테스트 결과 예측

이제 테스트 세트 결과를 예측하겠습니다. 새로운 예측 벡터를 생성하겠습니다. y_pred. 아래는 그에 대한 코드입니다:

 #Predicting the test set result y_pred= classifier.predict(x_test) 

산출:

아래 출력 이미지에는 예측 출력과 실제 테스트 출력이 나와 있습니다. 예측 벡터에 실제 벡터 값과 다른 일부 값이 있음을 분명히 알 수 있습니다. 이는 예측 오류입니다.

의사결정나무 분류 알고리즘

4. 결과의 정확성 테스트(혼란 행렬 생성)

위 출력에서 ​​일부 잘못된 예측이 있음을 확인했습니다. 따라서 올바른 예측과 잘못된 예측의 수를 알고 싶다면 혼동 행렬을 사용해야 합니다. 아래는 그에 대한 코드입니다:

 #Creating the Confusion matrix from sklearn.metrics import confusion_matrix cm= confusion_matrix(y_test, y_pred) 

산출:

의사결정나무 분류 알고리즘

위의 출력 이미지에서 우리는 혼동 행렬을 볼 수 있습니다. 6+3= 9개의 잘못된 예측 그리고 62+29=91개의 정확한 예측. 따라서 다른 분류 모델에 비해 의사결정나무 분류기가 좋은 예측을 했다고 말할 수 있습니다.

5. 훈련 세트 결과 시각화:

여기서는 훈련 세트 결과를 시각화하겠습니다. 훈련 세트 결과를 시각화하기 위해 의사결정 트리 분류기에 대한 그래프를 그릴 것입니다. 분류자는 로지스틱 회귀 분석에서 했던 것처럼 SUV 차량을 구매했거나 구매하지 않은 사용자에 대해 예 또는 아니요를 예측합니다. 아래는 그에 대한 코드입니다:

 #Visulaizing the trianing set result from matplotlib.colors import ListedColormap x_set, y_set = x_train, y_train x1, x2 = nm.meshgrid(nm.arange(start = x_set[:, 0].min() - 1, stop = x_set[:, 0].max() + 1, step =0.01), nm.arange(start = x_set[:, 1].min() - 1, stop = x_set[:, 1].max() + 1, step = 0.01)) mtp.contourf(x1, x2, classifier.predict(nm.array([x1.ravel(), x2.ravel()]).T).reshape(x1.shape), alpha = 0.75, cmap = ListedColormap((&apos;purple&apos;,&apos;green&apos; ))) mtp.xlim(x1.min(), x1.max()) mtp.ylim(x2.min(), x2.max()) fori, j in enumerate(nm.unique(y_set)): mtp.scatter(x_set[y_set == j, 0], x_set[y_set == j, 1], c = ListedColormap((&apos;purple&apos;, &apos;green&apos;))(i), label = j) mtp.title(&apos;Decision Tree Algorithm (Training set)&apos;) mtp.xlabel(&apos;Age&apos;) mtp.ylabel(&apos;Estimated Salary&apos;) mtp.legend() mtp.show() 

산출:

의사결정나무 분류 알고리즘

위의 출력은 나머지 분류 모델과 완전히 다릅니다. 여기에는 연령 및 예상 급여 변수에 따라 데이터 세트를 분할하는 수직선과 수평선이 모두 있습니다.

보시다시피 트리는 각 데이터 세트를 캡처하려고 시도하고 있는데, 이는 과적합의 경우입니다.

6. 테스트 세트 결과 시각화:

테스트 세트 결과의 시각화는 훈련 세트가 테스트 세트로 대체된다는 점을 제외하면 훈련 세트의 시각화와 유사합니다.

 #Visulaizing the test set result from matplotlib.colors import ListedColormap x_set, y_set = x_test, y_test x1, x2 = nm.meshgrid(nm.arange(start = x_set[:, 0].min() - 1, stop = x_set[:, 0].max() + 1, step =0.01), nm.arange(start = x_set[:, 1].min() - 1, stop = x_set[:, 1].max() + 1, step = 0.01)) mtp.contourf(x1, x2, classifier.predict(nm.array([x1.ravel(), x2.ravel()]).T).reshape(x1.shape), alpha = 0.75, cmap = ListedColormap((&apos;purple&apos;,&apos;green&apos; ))) mtp.xlim(x1.min(), x1.max()) mtp.ylim(x2.min(), x2.max()) fori, j in enumerate(nm.unique(y_set)): mtp.scatter(x_set[y_set == j, 0], x_set[y_set == j, 1], c = ListedColormap((&apos;purple&apos;, &apos;green&apos;))(i), label = j) mtp.title(&apos;Decision Tree Algorithm(Test set)&apos;) mtp.xlabel(&apos;Age&apos;) mtp.ylabel(&apos;Estimated Salary&apos;) mtp.legend() mtp.show() 

산출:

의사결정나무 분류 알고리즘

위 이미지에서 볼 수 있듯이 보라색 영역 내에 녹색 데이터 포인트가 있고 그 반대의 경우도 마찬가지입니다. 따라서 이것은 우리가 혼동 행렬에서 논의한 잘못된 예측입니다.