colab으로 기계학습 연습중인데 이번엔 지니계수 계산해서 의사결정트리로 나누는거를 하고있습니다.


이런거에서 항상 쓰이는 load_iris 파일로 연습한번 해보고 다른 데이터로 연습해보려고 하는데

코드 자체에서 오류는 없이 결과값은 나오는데 아무리 해봐도 값이 제가 손으로 계산한 값이랑 다르게 나옵니다.


코드 자체가 오류있는거면 에러뜨는거 찾아서 고치면 되는데 돌아가긴 하는데 값이 다르니까 진짜 돌아버릴것같네요.

코드 다 올려서 '해줘'하는거 진짜 안좋다 생각하는데 이번에는 뭐가 문제인지 자체를 모르겠어서 여기에 질문올립니다..


import pandas as pd import numpy as np
computer_data=pd.DataFrame([['youth','high','no','fair','no'],['youth','high','no','excellent','no']
,['middle_aged','high','no','fair','yes'],['senior','medium','no','fair','yes']                            
,['senior','low','yes','fair','yes'],['senior','low','yes','excellent','no']
,['middle_aged','low','yes','excellent','yes'],['youth','medium','no','fair','no']
,['youth','low','yes','fair','yes'],['senior','medium','yes','fair','yes']
,['youth','medium','yes','excellent','yes'],['middle_aged','medium','no','excellent','yes']
,['middle_aged','high','yes','fair','yes'],['senior','medium','no','excellent','no']]
,columns=['age','income','student','credit','buys_computer'])computer_data

1. 대충 이런 데이터 셋을


computer_data.age = computer_data.age.replace('youth',0)
computer_data.age = computer_data.age.replace('middle_aged', 1)
computer_data.age = computer_data.age.replace('senior',2)
computer_data.income = computer_data.income.replace('low',3)
computer_data.income = computer_data.income.replace('medium',4)
computer_data.income = computer_data.income.replace('high',5)
computer_data.student = computer_data.student.replace('no',6)
computer_data.student = computer_data.student.replace('yes',7)
computer_data.credit = computer_data.credit.replace('fair',8)
computer_data.credit = computer_data.credit.replace('excellent',9)
computer_data.buys_computer = computer_data.buys_computer.replace('no',10)
computer_data.buys_computer = computer_data.buys_computer.replace('yes',11)
computer_data

2. 이렇게 int값으로 변경해버리고


X = np.array(pd.DataFrame(computer_data, columns=['age','income', 'student', 'credit']))
y = np.array(pd.DataFrame(computer_data, columns=['buys_computer']))

3. X=데이터와 y=타겟으로 나누고


from sklearn.tree import DecisionTreeClassifier
dec_tree=DecisionTreeClassifier(max_depth=3)
dec_tree.fit(X,y)

4. 의사결정트리(깊이3)짜리에 X,y를 집어넣고


from sklearn.tree import export_graphviz
export_graphviz(
    dec_tree,
    out_file=("./dec_tree_for_computer.dot"),
    feature_names=['age','income', 'student', 'credit'])
!ls

5. 이렇게 파일 만들고


!dot -Tjpg dec_tree_for_computer.dot -o dec_tree_for_computer.jpg
import matplotlib.pyplot as plt
dec_tree_img=plt.imread('./dec_tree_for_computer.jpg')
plt.figure(num=None,figsize=(12,8),dpi=80,facecolor='w',edgecolor='k')
plt.imshow(dec_tree_img)

6. 이렇게 결과값이 나왔는데


여기서 보면 student<=6.5 즉, 학생 여부에 따라서 먼저 나눴는데

손으로 계산해보면 

지니계수(student)일때는 0.367이고

지니계수(age=middle)일때가 0.357로 최소인데

이러면 age=middle 여부에 따라서 먼저 의사결정트리가 나뉘어야 하는거 아닌가요?

왜 학생여부에서 먼저 나뉘는걸까요

제가 처음에 데이터셋을 입력을 잘못했나 했는데 몇번확인했는데도 데이터자체는 맞는데이터라서 이게 뭐가 잘못된건지를 모르겠습니다.


도움 부탁드립니다 ㅠㅠ


//혹시몰라 원본 데이터도 올립니다