인공지능/머신러닝

의사결정트리 시각화

해피밀세트 2020. 5. 23. 22:53
반응형

 

 

1. 아이리스 데이터 (파이썬)

 

# 데이터 불러오기 / 데이터 정보 확인

import pandas as pd
iris = pd.read_csv("C:/data/iris.csv")

iris.info()

iris.head()

# 목표변수와 나머지 변수들을 따로 저장

x = iris.iloc[:,0:4]

y = iris.iloc[:,4]

# 데이터 분포 확인

x.info()               # 데이터 프레임
y.value_counts()   # 시리즈
# 데이터셋 나누고 라벨 분포 확인

from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test  = train_test_split(x,y,test_size=0.20)
from collections import Counter
Counter(y_train)
Counter(y_test)

 

# 의사결정트리 만들기 (엔트로피구하기, 트리2단계)

from sklearn.tree import DecisionTreeClassifier

model = DecisionTreeClassifier(criterion = "entropy", max_depth=2)
model

# 모델 학습

model.fit(x_train,y_train)

# test데이터 라벨 예측

y_pred = model.predict(x_test)

 

# 정확도 계산

from sklearn.metrics import accuracy_score

accuracy_score(y_test, y_pred)

# 입력변수들의 중요도 확인(확률값)

model.feature_importances_

pd.DataFrame({'feature' : x_train.columns,

              'importance' : model.feature_importances_})

# 모델의 정답에 대한 정보 확인

model.classes_

# 새로운 테스트 데이터로 예측하기

model.predict([[5.1,3.5,4.0,0.2]])

### 의사결정트리 시각화

# 라이브러리 설치하기

!pip install pydotplus
!pip install graphviz

 

# 라이브러리 불러오기

import pydotplus

from sklearn.tree import export_graphviz

from IPython.core.display import Image

 

 

# 그래프 설정

# out_file=None :
결과를 파일로 저장하지 않겠다.
# filled=True : 상자 채우기
# rounded=True : 상자모서리 둥그렇게 만들기
# special_characters=True : 상자안에 내용 넣기

dot_data = export_graphviz(model, out_file=None,

                           feature_names=x_train.columns,

                           class_names=model.classes_,

                           filled=True, rounded=True,

                           special_characters=True)

 

# 그래프 그리기

dot_data

graph = pydotplus.graph_from_dot_data(dot_data)

Image(graph.create_png())



# 그래프 해석

첫번째 : 분류 기준

entropy : 엔트로피값

sample : 분류한 데이터 개수

value : 클래스별 데이터 개수

class : 예측한

 

 

 

 

2. 타이타닉 데이터 (파이썬)

 

# 데이터 불러오기

import pandas as pd
titanic = pd.read_csv("C:/data/titanic.csv")
titanic.info()
titanic.head()

### 데이터 정제작업

# 성별 여자:0, 남자:1로 만들기

titanic["gender"] = titanic.gender.map({"female":0, "male":1})

 

# age Null값 체크하기

titanic["age"].isnull().sum()

titanic.isnull().sum()['age']

# 전체 null갯수 확인

titanic.isnull().sum().sum()

# age NaN값만 뽑아내기

titanic[titanic['age'].isnull()]

# age NaN값을 중앙값으로 대체

titanic.age.fillna(titanic.age.median(), inplace=True)
titanic["age"].isnull().sum()

# embarked NaN값 찾기

titanic["embarked"].isnull().sum()

titanic.isnull().sum()["embarked"]

# embarked 컬럼 원 핫 인코딩

embarked_dummies = pd.get_dummies(titanic.embarked,

                                  prefix="embarked")

titanic = pd.concat([titanic,embarked_dummies],axis=1)

# 지정한 컬럼으로 데이터 다시 만들기

feature_col = ['survived','pclass','age','gender','embarked_Q','embarked_S']

titanic = titanic[feature_col]

### 의사결정 트리 시각화

# 종속변수, 입력변수 나누기

x = titanic.iloc[:,1:6]

y = titanic.iloc[:,0]

x.info()

y.value_counts()

# 데이터셋 나누고 라벨 분포 확인

from sklearn.model_selection import train_test_splitx_train,x_test,y_train,y_test  = train_test_split(x,y,test_size=0.20)
from collections import Counter
Counter(y_train)
Counter(y_test)

# 의사결정트리 만들기 (엔트로피구하기, 트리2단계)

from sklearn.tree import DecisionTreeClassifier

model = DecisionTreeClassifier(criterion = "entropy", max_depth=5)

# 모델 학습

model.fit(x_train,y_train)

# test데이터 라벨 예측

y_pred = model.predict(x_test)

# 정확도 계산

from sklearn.metrics import accuracy_score

accuracy_score(y_test, y_pred)

# 입력변수들의 중요도 확인(확률값)

model.feature_importances_

pd.DataFrame({'feature' : x_train.columns,

              'importance' : model.feature_importances_})

# 모델의 정답에 대한 정보 확인

model.classes_

# 새로운 테스트 데이터로 예측하기

model.predict([[2,27,0,0,1]])

# 라이브러리 불러오기

import pydotplus

from sklearn.tree import export_graphviz

from IPython.core.display import Image

 

 

# 그래프 설정

# out_file=None :
결과를 파일로 저장하지 않겠다.
# filled=True : 상자 채우기
# rounded=True : 상자모서리 둥그렇게 만들기
# special_characters=True : 상자안에 내용 넣기
#dot_data = export_graphviz(model)

dot_data = export_graphviz(model, out_file="C:/data/dot_data.dot",

                           feature_names=x_train.columns,

                           class_names=["perish","survived"],

                           filled=True, rounded=True,

                           special_characters=True)

 

# 그래프 그리기

from IPython.display import display
import graphviz
with open("C:/data/dot_data.dot") as f:
    dot_graph = f.read()
display(graphviz.Source(dot_graph))

 

 

 

 

3. 독일 은행 데이터 (R)

 

# 라이브러리 불러오기

library(C50)
library(rpart)
library(caret)
library(rattle)
 

# 데이터 불러오기

credit <- read.csv("C:/data/credit.csv",stringsAsFactors=F)

str(credit)

# 컬럼 정보

##   Column                Non-Null Count  Dtype

---  ------                --------------  -----

 0   checking_balance      1000 non-null   object     예금

 1   months_loan_duration  1000 non-null   int64      대출기간

 2   credit_history        1000 non-null   object     대출이력

 3   purpose               1000 non-null   object     목적이 뭐냐

 4   amount                1000 non-null   int64      대출금

 5   savings_balance       1000 non-null   object     적금

 6   employment_duration   1000 non-null   object     회사에 얼마나 근속했냐

 7   percent_of_income     1000 non-null   int64      가처분 소득 대비 할부율

 8   years_at_residence    1000 non-null   int64      몇년 그집에 살았니?

 9   age                   1000 non-null   int64      몇살?

 10  other_credit          1000 non-null   object     다른 신용대출이 있냐

 11  housing               1000 non-null   object     집이 자가냐 아니냐

 12  existing_loans_count  1000 non-null   int64      지속되고있는 대출 갯수

 13  job                   1000 non-null   object     직업종류가 뭐냐

 14  dependents            1000 non-null   int64      부양가족몇명?

 15  phone                 1000 non-null   object     YES: 핸드폰있음, NO: 핸드폰없음

 16  default               1000 non-null   object     YES: 상환안함, NO: 상환함

 

# 목표변수

table(credit$default)

# 컬럼별 빈 문자열 세기

sapply(credit, function(x)sum(x==''))

# 컬럼별 NA값 세기

sapply(credit, function(x)sum(is.na(x)))

# rpart로 의사결정트리 만들기

rpart <- rpart(default~.,

               data=credit,method="class")

# 그래프로 그리기

fancyRpartPlot(rpart,main="credit")

 

# 값 고정
set.seed(1)

# 훈련/테스트 데이터 나누고 비율 확인 
train_index <- sample(2,nrow(credit),prob=c(0.9,0.1),

                      replace=T)

credit_train <- credit[train_index==1,]

credit_test <- credit[train_index==2,]

prop.table(table(credit_train$default))

prop.table(table(credit_test$default))

# 데이터 나누기(?)

idx <- createDataPartition(credit$default, p=0.9, list=F)
credit_train <- credit[idx,]
prop.table(table(credit_train$default))
nrow(credit_train)/nrow(credit)

credit_model <- C5.0(credit_train[,-17],credit_train$default,trials=10)
summary(credit_model)


#
boost : 앙상블 시도 - 10 시도해서 오류가 가장작은 트리를 쓰는것

 

반응형