AI

Lab - Decision Trees

Beomsu Koh 2023. 7. 10.

Lab - Decision Trees

Import the Following Libraries:

  • numpy (as np)
  • pandas
  • DecisionTreeClassifier from sklearn.tree
import piplite
await piplite.install(['pandas'])
await piplite.install(['matplotlib'])
await piplite.install(['numpy'])
await piplite.install(['scikit-learn'])

import numpy as np
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
import sklearn.tree as tree

from pyodide.http import pyfetch

async def download(url, filename):
    response = await pyfetch(url)
    if response.status == 200:
        with open(filename, "wb") as f:
            f.write(await response.bytes())

연구를 위해 데이터를 수집하는 의학 연구자라고 가정해 보십시오.
모든 환자가 동일한 질병을 앓고 있다는 데이터를 수집했습니다.
치료 과정에서 각 환자는 약물 A, 약물 B, 약물 c, 약물 x 및 y의 5가지 약물 중 하나에 반응했습니다.

당신의 일의 일부는 어떤 약이 같은 병을 가진 미래의 환자에게 적합한지 알아보기 위해 모델을 만드는 것입니다.
이 데이터 세트의 특징은 환자의 연령, 성별, 혈압 및 콜레스테롤이며, 대상은 각 환자가 반응한 약물입니다.

다중 클래스 분류기의 샘플이며, 데이터 세트의 교육 부분을 사용할 수 있습니다
의사 결정 트리를 만든 다음 이 트리를 사용하여 알려지지 않은 환자의 등급을 예측하거나 새로운 환자에게 약물을 처방합니다.

Downloading Data

my_data = pd.read_csv("drug200.csv", delimiter=",")
my_data[0:5]

Pre-Processing

Using my_data as the Drug.csv data read by pandas, declare the following variables:

  • X as the Feature Matrix (data of my_data)
  • y as the response vector (target)

타겟 변수 제거
데이터셋에서 타겟 변수(예측하고자 하는 변수)를 제거합니다.
이 변수는 숫자 값이 아니기 때문에 결정 트리 모델에 직접 사용할 수 없습니다.

주형 변수 변환
‘Sex’ 또는 'BP’와 같은 일부 특성은 범주형 변수입니다.

Scikit-learn의 결정 트리는 범주형 변수를 직접 처리할 수 없으므로, 이를 수치형 변수로 변환해야 합니다.
이를 위해 'LabelEncoder’를 사용하여 범주형 변수를 수치형 변수로 변환합니다.

# sklearn의 전처리(preprocessing) 모듈을 가져옵니다.
from sklearn import preprocessing

# 'Sex' 특성에 대한 레이블 인코더 객체를 생성합니다.
le_sex = preprocessing.LabelEncoder()

# 레이블 인코더를 'F'(Female)와 'M'(Male) 범주에 맞게 학습시킵니다.
le_sex.fit(['F','M'])

# 'Sex' 특성을 수치형으로 변환하여 원래의 범주형 데이터를 대체합니다.
X[:,1] = le_sex.transform(X[:,1]) 

# 'BP'(Blood Pressure) 특성에 대한 레이블 인코더 객체를 생성합니다.
le_BP = preprocessing.LabelEncoder()

# 레이블 인코더를 'LOW', 'NORMAL', 'HIGH' 범주에 맞게 학습시킵니다.
le_BP.fit([ 'LOW', 'NORMAL', 'HIGH'])

# 'BP' 특성을 수치형으로 변환하여 원래의 범주형 데이터를 대체합니다.
X[:,2] = le_BP.transform(X[:,2])

# 'Cholesterol' 특성에 대한 레이블 인코더 객체를 생성합니다.
le_Chol = preprocessing.LabelEncoder()

# 레이블 인코더를 'NORMAL', 'HIGH' 범주에 맞게 학습시킵니다.
le_Chol.fit([ 'NORMAL', 'HIGH'])

# 'Cholesterol' 특성을 수치형으로 변환하여 원래의 범주형 데이터를 대체합니다.
X[:,3] = le_Chol.transform(X[:,3]) 

# 변환된 데이터의 처음 5개 행을 출력합니다.
X[0:5]

이제, target 변수를 설정합니다

y = my_data["Drug"]
y[0:5]

Setting up the Decision Tree

훈련 테스트 분할(Train Test Split)으로 데이터를 만들 것이다.

from sklearn.model_selection import train_test_split
X_trainset, X_testset, y_trainset, y_testset = train_test_split(X, y, test_size=0.3, random_state=3)

print('Shape of X training set {}'.format(X_trainset.shape),'&',' Size of Y training set {}'.format(y_trainset.shape))
  • 결과 : Shape of X training set (140, 5) & Size of Y training set (140,)

Modeling

결정 트리 모델을 생성하고 훈련 데이터에 맞춰 모델을 학습한다

# DecisionTreeClassifier의 인스턴스를 생성합니다. 
# 'entropy'를 지정하여 각 노드의 정보 이득을 확인할 수 있습니다.
# 'max_depth'는 트리의 최대 깊이를 지정합니다.
drugTree = DecisionTreeClassifier(criterion="entropy", max_depth = 4)

# 인스턴스를 출력하여 기본 매개변수를 확인합니다.
drugTree 

# 이제 학습용 특성 행렬 X_trainset와 학습용 반응 벡터 y_trainset을 사용하여 모델을 학습시킵니다.
drugTree.fit(X_trainset,y_trainset)

예측

# 모델을 사용하여 테스트 데이터 세트에 대한 예측을 수행하고 결과를 predTree 변수에 저장합니다.
predTree = drugTree.predict(X_testset)

# predTree와 y_testset을 출력하여 예측값과 실제 값을 시각적으로 비교할 수 있습니다.
print (predTree [0:5])
print (y_testset [0:5])

결과는 아래와 같습니다

['drugY' 'drugX' 'drugX' 'drugX' 'drugX']
40     drugY
51     drugX
139    drugX
197    drugX
170    drugX
Name: Drug, dtype: object

평가

위의 코드는 모델의 정확도를 확인하는 과정입니다.
정확도는 예측된 결과가 실제 결과와 얼마나 잘 일치하는지를 나타내는 지표입니다.

# sklearn 라이브러리에서 metrics 모듈을 가져옵니다.
from sklearn import metrics
# 데이터를 시각화하기 위해 matplotlib.pyplot를 가져옵니다.
import matplotlib.pyplot as plt

# 모델의 정확도를 계산하고 출력합니다. 이는 예측 결과(predTree)와 실제 결과(y_testset) 사이의 일치도를 나타냅니다.
print("DecisionTrees's Accuracy: ", metrics.accuracy_score(y_testset, predTree))

metrics.accuracy_score(y_testset, predTree)는 실제 값 y_testset과 예측 값 predTree 사이의 정확도를 계산합니다.

이 경우, 정확도는 약 0.9833으로, 모델이 매우 높은 정확도로 결과를 예측했음을 나타냅니다. 그러나 정확도만으로 모델의 성능을 판단하는 것은 위험할 수 있습니다.

특히 불균형한 데이터셋에서는 다른 성능 지표들도 고려해야 합니다.

# 아래의 두 줄은 pydotplus와 graphviz 라이브러리를 설치하는 코드입니다. 
# 이 두 라이브러리는 의사결정 트리를 시각화하기 위해 필요한 라이브러리입니다.
# 만약 이 라이브러리들이 설치되어 있지 않다면 아래의 코드를 주석 해제하고 실행해야 합니다.

#!conda install -c conda-forge pydotplus -y
#!conda install -c conda-forge python-graphviz -y

# tree.plot_tree 함수는 의사결정 트리를 시각화합니다. 이 함수는 의사결정 트리 모델을 인자로 받습니다.
tree.plot_tree(drugTree)

# plt.show 함수는 그림을 출력합니다.
plt.show()

부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>

'AI' 카테고리의 다른 글

sigmoid 함수  (0) 2023.07.11
Logistic Regression  (0) 2023.07.11
Decision Tree  (0) 2023.07.10
Machine Learning  (0) 2023.07.10
AutoGPT 설치 방법  (0) 2023.07.08

댓글