Python / / 2022. 10. 12. 11:04

Python - 의사결정트리 예측

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import StandardScaler, MinMaxScaler, MaxAbsScaler,LabelEncoder

'''머신러닝 주요 작업은 학습 알고리즘을 선택해서 어떤 데이터에 훈련시키는 것

나쁜데이터 : 
충분하지 않은 양의 훈련데이터 
대표성이 없는 훈련데이터 
낮은 품질의 데이터 
관련없는 특성 

나쁜 알고리즘 : 
훈련데이터 과대적합 

훈련데이터 과소적합 

''''''
실습 의사결정 나무 예시 [채무 불이행자 분류]
'''

data = pd.DataFrame({'ID': [1,2,3,4,5,6,7,8,9,10],
                   '집소유' : ['Yes', 'No', 'No', 'Yes', 'No', 'No', 'Yes', 'No', 'No', 'No'],
                  '결혼' : ['미혼', '기혼', '미혼', '기혼', '이혼', '기혼', '이혼', '미혼', '기혼', '미혼'],
                   '연소득(K)' : [125, 100, 70, 120, 95, 60, 220, 85, 75, 90],
                   '채무불이행' : ['No', 'No', 'No', 'No', 'Yes', 'No', 'No', 'Yes', 'No', 'Yes']
                  })
df = pd.DataFrame(data)
df.set_index('ID', inplace = True)
# 대상 속성(target feature)
print(data)
'''의사결정 나무 파라미터 

<나무 구조 제한> 

나무 깊이 제한(sklearn, max_depth)
리프 노드 수 제한(sklearn, max_leaf nodes)

<불순도 기준> 
분기를 발생시키는 최소 불순도 선정(sklearn, min_impority_spit)
분기를 일으켰을때, 최소한의 불순도 감소폭을 설정(sklearn, min_impority_decrease)

'''

#x, y값 분리저장 인코딩

df_결혼_encoder = LabelEncoder()
df_집소유_encoder = LabelEncoder()
df_채무불이행_encoder = LabelEncoder()

for i in ['집소유', '결혼', '채무불이행']:
    globals()[f'df_{i}_encoder'] = LabelEncoder()
    globals()[f'df_{i}_encoder'].fit(df[i])
    df[i] = globals()[f'df_{i}_encoder'].transform(df[i])

print(df_결혼_encoder.classes_)
print(df_채무불이행_encoder.classes_)
print(df_집소유_encoder.classes_)

X = df.drop('채무불이행', axis=1)
y = df.채무불이행
print('-----------------------')
print(X.head(1))
print('-----------------------')
print(y.head(1))

from sklearn.tree import DecisionTreeClassifier ,export_graphviz
import graphviz
#max_depth = 2 // 2층으로 설정한다.
#트리의 첫번째 조건을 정할 수 없지만, 조건을 정하는 기준을 정할 순 있다. 진 인덱스 or 엔트로피 croterion = 'entropy'
finan_dtclf = DecisionTreeClassifier(max_depth=2)
print(finan_dtclf.fit(X,y))

export_graphviz(finan_dtclf,out_file='finance1.dot',
                feature_names=X.columns,
                class_names=['이행','불이행'])

with open('./finance1.dot', encoding='UTF8') as f: 
    finance1 = f.read()
graphviz.Source(finance1)

export_graphviz(finan_dtclf,out_file='finance2.dot',
                feature_names=X.columns,
                class_names=['이행','불이행'],
                max_depth = 2, 
                leaves_parallel= False,
                rotate = False, 
                rounded = False)

with open('./finance2.dot', encoding='UTF8') as f: 
    finance1 = f.read()
graphviz.Source(finance1)

'''새로운 데이터의 클래스를 예측 하기 '''


data2 = pd.DataFrame({'ID': list(range(11,16)),
                   '집소유' : ['No','Yes','Yes','No','No'],
                   '결혼' : ['미혼', '기혼', '미혼', '기혼', '이혼'],
                   '연소득' : [55,80,110,95,300],
                  })
new_person =pd.DataFrame(data2)
new_person.set_index('ID', inplace=True)

new_결혼_encoder = LabelEncoder()
new_집소유_encoder = LabelEncoder()
new_연소득_encoder = LabelEncoder()

for i in ['집소유', '결혼']:
    globals()[f'new_{i}_encoder'] = LabelEncoder()
    globals()[f'new_{i}_encoder'].fit(new_person[i])
    new_person[i] = globals()[f'new_{i}_encoder'].transform(new_person[i])
print(new_결혼_encoder.classes_)
print(new_집소유_encoder.classes_)

pred_result = finan_dtclf.predict(new_person)
pred_result1 = df_채무불이행_encoder.inverse_transform(pred_result)
new_person['채무불이행예측']=pred_result1
print(new_person)


print(df_결혼_encoder.inverse_transform([1]))
print(df_집소유_encoder.inverse_transform([1]))

'''
데이터 수집 -> EDA,전처리 -> 의사결정트리 (Decision Tree 선정) -> 학습  -> 결과 확인 -> (정성적 분석) ->
-> 위험성 분석 - > 모델 활용 예측
'''

 

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유