AI SCHOOL

[ML] Decision Tree

moru_xz 2023. 3. 17. 03:47

Decision Tree

# 모델 불러오기
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier(criterion= 'entropy', random_state=42)

# 학습하기
model.fit(X_train, y_train)

# 예측하기
y_predict = model.predict(X_test)

# 정확도 측정하기
(y_test == y_predict).mean()

from sklearn.metrics import accuracy_score
accuracy_score(y_test, y_predict)

 

데이터셋 확인 및 전처리

데이터셋:  Telco Customer Churn - https://www.kaggle.com/blastchar/telco-customer-churn / 고객 유지를 위한 행동 예측, 인구 통계 정보, 구독 서비스, 최근 한 달 이내에 탈퇴한 고객(Churn) 정보 등을 담고 있음

 

  • 숫자 형태로 된 문자열 숫자형으로 바꿔주기
df.select_dtypes(include = 'number').head(3) #숫자형만 뽑아서 확인
df['TotalCharges'] = pd.to_numeric(df['TotalCharges'], errors = 'coerce')

- errors = ' ignore ' : 만약 숫자로 변경할 수 없는 데이터라면 숫자로 변경하지 않고 원본 데이터를 그대로 반환

- errors = ' coerce ' : 만약 숫자로 변경할 수 없는 데이터라면 기존 데이터를 지우고 NaN으로 설정하여 반환

- errors = ' raise ' : 만약 숫자로 변경할 수 없는 데이터라면 에러 발생 후 코드 중단

 

 

  • 정답의 빈도수 확인
print(df['Churn'].value_counts())
print(df['Churn'].value_counts(1))

 

학습, 예측 데이터셋 나누기

- 이미지는 RandomForest할 때 만든건데 같은 지도학습이라 흐름은 같음

X_train : 학습 세트 만들기, 행렬, 판다스의 데이터프레임, 2차원 리스트(배열) 구조, 예) 시험의 기출문제
y_train : 정답 값을 만들기, 벡터, 판다스의 시리즈, 1차원 리스트(배열) 구조, 예) 기출문제의 정답
X_test : 예측에 사용할 데이터세트를 만듭니다. 예) 실전 시험 문제
y_test : 예측의 정답값 예) 실전 시험 문제의 정답

 

  • 학습, 예측 칼럼 나누기
feature_names = df.select_dtypes(include = 'number').columns
label_name = 'Churn'

- 범주형 데이터(object, category)는 전처리가 따로 필요

- label_name에는 예측할 칼럼의 이름을 담는다

 

  • 학습, 예측 데이터셋 만들기
X = df[feature_names]
y = df[label_name]

- scikit-learn에서 데이터는 대문자 X(2차원,행렬)로 표시하고 정답은 소문자 y(1차원,벡터)로 표기

 

split_count = int(df.shape[0] * 0.8)
X_train = X[:split_count]
X_test = X[split_count:]

- 학습, 예측 데이터셋을 나눌 때 직접 나눌 수도 있고 사이킷런의 train_test_spilit을 사용할 수도 있음 

- 학습, 예측 데이터셋을 나눌 때에는 학습 데이터 비율이 더 높은게 좋음 -> 공부를 더 많이 하고 시험을 봐야 시험을 더 잘 볼 수 있기 때문

- feature의 순서, 내용은 섞이면 안 됨 -> train 에는 total 있는데 test에는 없고 이런 식

- train_test_spilit(): 클래스가 여러개일 경우 클래스의 수가 train, test 균일하게 나뉘지 않을 수도 있음 그때 train_test_spilit사용하면 label 값을 균형있게 나눠줄 수 있음 -> 예를 들어 이탈여부를 예측하는데 이탈한다 안한다가 7:3 정도로 train에 있다면 test 에도 7:3 으로 들어있어야 제대로 학습하고 예측할 수 있음

 

결정 트리 가져오기

  • 결정 트리

- 결과를 해석하고 이해하기 쉽다.간략한 설명만으로 결정 트리를 이해하는 것이 가능
- 자료를 가공할 필요가 거의 없음
- 수치 자료와 범주 자료 모두에 적용할 수 있다
- 화이트박스 모델을 사용한다. 모델에서 주어진 상황이 관측 가능하다면 불 논리를 이용하여 조건에 대해 쉽게 설명할 수 있다. (결과에 대한 설명을 이해하기 어렵기 때문에 인공신경망은 대표적인 블랙 박스 모델이다.)
- 대규모의 데이터 셋에서도 잘 동작한다. 방대한 분량의 데이터를 일반적인 컴퓨터 환경에서 합리적인 시간 안에 분석할 수 있다.

  • 주요 파라미터

- criterion: 가지의 분할의 품질을 측정하는 기능
- max_depth: 트리의 최대 깊이
- min_samples_split:내부 노드를 분할하는 데 필요한 최소 샘플 수
- min_samples_leaf: 리프 노드에 있어야 하는 최소 샘플 수
- max_leaf_nodes: 리프 노드 숫자의 제한치
- random_state: 추정기의 무작위성을 제어 실행했을 때 같은 결과가 나오도록 (random_state = 42 -> 이렇게 특정 숫자로 고정해서 하면 다시 돌려도 그대로 같은 값을 준다)
    

# 사이킷런(sklearn)에서 의사 결정 트리 분류모델(DecisionTreeClassifier)을 로드

from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier(random_state = 42)

# 데이터를 머신러닝 모델로 학습(fit)
model.fit(X_train, y_train)

# 데이터를 머신러닝 모델로 예측(predict)
y_predict = model.predict(X_test)

 

  • 점수 측정

- 모델이 얼마나 잘 예측했는지 측정

- 시험 보고 나서 몇 개 맞았나 틀렸나 채점해 보는 과정과 유사

(y_test == y_predict).mean() # 100점 만점에 70점 맞았다

-> 정답과 같이 예측한 값은 True 로 나옴, True == 1 이기 때문에 평균값을 내면 정답을 맞춘 비율을 구할 수 있음

from sklearn.metrics import accuracy_score

accuracy_score(y_test, y_predict)

-> sklearn 이용

# 정답을 알고 있을 때만 사용 가능 
model.score(X_test, y_test)

 

트리 알고리즘

  • 지니 불순도

- 지니 불순도는 집합에 이질적인 것이 얼마나 섞였는지를 측정하는 지표이며 CART 알고리즘에서 사용

- 어떤 집합에서 한 항목을 뽑아 무작위로 라벨을 추정할 때 틀릴 확률

- 집합에 있는 항목이 모두 같다면 지니 불순도는 최솟값(0)을 갖게 되며 이 집합은 완전히 순수하다고 할 수 있음

- 0 에 가까울 수록 다른 값이 섞여있지 않은 좋은 상태고, 0 이 되면 값이 완전히 나뉜 상태이기 때문에 트리를 그리는 것을 멈춘다.

  • 엔트로피

- ID3, C4.5 그리고 C5.0 트리 생성 알고리즘에서 사용

- 엔트로피는 지니불순도에 비해 트리 분할 품질을 좀 더 엄격하게 평가하고자 할 때 사용

- (0에 가까울수록) 값이 작을수록 순수도가 높으며 같은 특성을 가진 객체들로만 잘 분류했다고 볼 수 있음

# 지니불순도
1 - (4137 / 5625) ** 2 - (1488 / 5625) ** 2

# 엔트로피
-((4137 / 5625)*np.log2(4137 / 5625) + (1488 / 5625)*np.log2(1488 / 5625))

 

시각화

from sklearn.tree import plot_tree
plt.figure(figsize = (20, 20))
plot_tree(model, filled = True, max_depth= 5, fontsize = 12,
         feature_names = feature_names) ;

-> 시각화 할 때 따로 depth 지정 할 수 있음

 

from sklearn.tree import export_text

print(export_text(model, max_depth=3, feature_names=feature_names.tolist()))

-> export_text 를 통해 문자( text )로 트리를 시각화

 

  • 피처 중요도 
model.feature_importances_

# 피처 중요도를 시각화 합니다.

sns.barplot(x = model.feature_importances_, y = model.feature_names_in_)

-> 결정트리의 export_text나 feature_importance를 보면서 마케팅 전략을 세울 수 있음

 


for i in range(1, 11):
    model = DecisionTreeClassifier(max_depth= i)
    model.fit(X_train, y_train)
    y_predict = model.predict(X_test)
    print('max_depth', i, ':', accuracy_score(y_test, y_predict))

 

 

데이터 전처리 fit, fit_transform, transform의 개념 익히기!

fit() -> "훈련해라", "머신러닝이 데이터에 머신러닝 모델을 맞추는 것(fit)" 학습데이터 세트에서 변환을 위한 기반 설정을 하는 함수이다! 데이터를 학습시키는 메서드라고 생각하면 된다. transfor

david-kim2028.tistory.com

 

'AI SCHOOL' 카테고리의 다른 글

[ML] One hot Encoding / ExtraTreesClassifier / cross validation  (0) 2023.03.18
[ML] one-hot encoding / Random Forest  (0) 2023.03.18
[ML] Clustering  (0) 2023.03.12
[통계분석] 상관분석 / 회귀분석  (0) 2023.02.16
[통계분석]  (0) 2023.02.15