본문 바로가기

Programming/Machine Learning

결정 트리

1. 결정 트리

- 분류 / 회귀 문제에 널리 사용

- 결정에 다다르기 위해 예 / 아니오 질문을 이어 나가면서 학습

- 과대 적합을 막는 전략 :

        사전 가지치기(트리 생성을 일찍 중단) (max_depth, max_leaf_nodes, min_samples_leaf)

        사후 가지치기(데이터 포인트가 적은 노드 삭제)

        scikit-learn은 사전 가지치기만 지원

import pandas as pd
# 데이터셋 가져오기
data = pd.read_csv('경로/파일이름.csv', index_col='인덱스로 사용할 컬럼이름')

# 데이터셋, X와 y로 나눠주기
y = pd.DataFrame(data['타겟 컬럼이름'])
X = data.drop('타겟 컬럼이름', axis=1)

# train과 test로 나눠주기
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(2차원 데이터프레임X, 1차원 데이터프레임y, random_state=고정시드value)

# 결정 트리
from sklearn.tree import DecisionTreeClassifier
tree =DecisionTreeClassifier(max_depth=4, random_state=0)
# 10정도 깊이는 보통이다.
tree.fit(X_train, y_train)
tree.score(X_test, y_test)

# 트리 시각화
# ! : 주피터 노트북에서 커맨드 창으로 가지 않고 설치
!pip install graphviz
from sklearn.tree import export_graphviz
export_graphviz(tree, out_file="tree.dot", class_names=["결론1","결론2"], feature_names=데이터프레임.feature_names, impurity=False, filled=True)

import graphviz
with open("tree.dot") as f:
dot_graph = f.read()
display(graphviz.Source(dot_graph))

# 트리의 특성 중요도
print(tree.feature_importances_)

# 트리의 특성 중요도 시각화
def 사용자정의함수이름(model):
	n_features = 데이터프레임.shape[1]  # n_features : 데이터프레임 열 갯수
    plt.barh(np.arange(n_features), model.feature_importances_, align='center')  # np.arange(n_features) : 0부터 n_features-1까지의 리스트생성
	plt.yticks(np.arange(n_features), list(데이터프레임.columns))
    plt.xlabel("특성 중요도")
    plt.ylabel("특성")
    plt.ylim(-1, n_features)
사용자정의함수이름(tree)


# 회귀 결정 트리
from sklearn.tree import DecisionTreeRegressor
tree = DecisionTreeRegressor().fit(X_train, y_train)
pred = tree.predict(X_test)

 

graphviz 설치 : 구글 검색 > graphviz > windows stable 2.38 > graphviz-2.38.msi
파이썬 중간 라이브러리 설치 : 아나콘다 > !pip install graphviz 작성하고 실행

graphviz 에러 해결
C:\Program Files (x86)\Graphviz2.38\bin
제어판\시스템 및 보안\시스템 > 고급 시스템 설정 > 환경변수 > 위 path 더블클릭 > C:\Program Files (x86)\Graphviz2.38\bin 붙여넣기 > 아래 path 더블클릭 > C:\Program Files (x86)\Graphviz2.38\bin\dot.exe 붙여넣기

test data로 검증을 하다보면 test data로 과대적합하게 된다.
학습하고 평가하지 말고 학습(49), 검증(21), 평가(30)를 실시

train, test를 먼저 나누고나서 전처리작업

 

결정 트리의 장점

- 다른 알고리즘들보다 쉽게 시각화할 수 있다.

- 데이터의 스케일에 구애받지 않는다.

 

단점

- 사전 가지치기를 사용함에도 과대적합되는 경향

 

 

 

 

2. 결정 트리의 앙상블 - 랜덤 포레스트

앙상블 - 여러 머신런이 모델을 연결하여 더 강력한 모델을 만드는 기법

- 결정트리의 과대적합되는 경향을 회피하는 방법

- 서로 다른 방향으로 과대적합된 트리를 많이 만들어 평균의 결과를 낸다.

- 부트스트랩 샘플(각 트리가 독립적, 무작위하게 생성)

- 회귀와 분류에서 가장 널리 사용되는 머신러닝 알고리즘

- 매개변수 튜닝을 많이 하지 않아도 성능이 매우 뛰어나고 잘 작동

- 중요 매개 변수

        n_estimators (가용한 시간과 메모리만큼 클 수록 좋음, 값이 클수록 과대적합 막음)

        max_features (기본값을 쓰는 것이 좋은 방법, 값이 작을 수록 과대적합 막음,

                          기본값은 분류 : sqrt(n_features), 회귀 : n_features )

 

import pandas as pd
# 데이터셋 가져오기
data = pd.read_csv('경로/파일이름.csv', index_col='인덱스로 사용할 컬럼이름')

# 데이터셋, X와 y로 나눠주기
y = pd.DataFrame(data['타겟 컬럼이름'])
X = data.drop('타겟 컬럼이름', axis=1)

# train과 test로 나눠주기
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(2차원 데이터프레임X, 1차원 데이터프레임y, random_state=고정시드value)

# 랜덤 포레스트
from sklearn.ensemble import RandomForestClassifier
forest =RandomForestClassifier(n_estimators=5, random_state=2)
forest.fit(X_train, y_train)

forest.score(X_test, y_test)

 

 

 

 

3. 결정 트리의 앙상블 - 그래디언트 부스팅 회귀 트리

- 이전 트리의 오차를 보완하는 방식으로 여러 개의 결정 트리를 묶어 강력한 모델을 만드는 앙상블

- 보통 1~5 깊이의 얕은 트리 사용

- 메모리 적게 사용, 예측 빠름

- 훈련 시간이 길다.

- 랜덤 포레스트보다 매개변수 설정에 더 민감하지만 잘 조정하면 더 높은 정확도를 제공

- 안정적인 랜덤 포레스트를 먼저 적용하고, 성능을 미세하게 더 올려야 할 때 사용

- 중요 매개변수

        learning_rate (학습률이 크면 복잡한 모델을 만들고 과대적합이 됨)

        n_estimators (트리가 많이 추가되면 모델의 복잡도가 커지고 과대적합이 됨)

import pandas as pd
# 데이터셋 가져오기
data = pd.read_csv('경로/파일이름.csv', index_col='인덱스로 사용할 컬럼이름')

# 데이터셋, X와 y로 나눠주기
y = pd.DataFrame(data['타겟 컬럼이름'])
X = data.drop('타겟 컬럼이름', axis=1)

# train과 test로 나눠주기
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(2차원 데이터프레임X, 1차원 데이터프레임y, random_state=고정시드value)

# 그래디언트 부스팅 회귀 트리
from sklearn.ensemble import GradientBoostingClassifier
gbrt = GradientBoostingClassifier(random_state=0, max_depth=1)
gbrt.fit(X_train, y_train)

gbrt.score(X_test, y_test)

 

 

4. 결정 트리의 앙상블 -배깅

- bootsrrap aggregating

- 중복을 허용한 랜덤 샘플링으로 만든 훈련세트를 사용하여 분류기를 각기 다르게 학습

import pandas as pd
# 데이터셋 가져오기
data = pd.read_csv('경로/파일이름.csv', index_col='인덱스로 사용할 컬럼이름')

# 데이터셋, X와 y로 나눠주기
y = pd.DataFrame(data['타겟 컬럼이름'])
X = data.drop('타겟 컬럼이름', axis=1)

# train과 test로 나눠주기
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(2차원 데이터프레임X, 1차원 데이터프레임y, random_state=고정시드value)

# 로지스틱 회귀 모델 100개 훈련하여 앙상블하기
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import BagginClassifier

bagging = BagginClassifier(LogisticRegression(), n_estimators=100, oob_score=True, njobs=-1, random_state=42)
# oob_score=True : 매개변수는 부트스트래핑에 포함되지 않은 샘플을 기반으로 훈련된 모델을 평가 (기본값은 False)
bagging.fit(X_train, y_train)
bagging.score(X_test, y_test)


# 결정 트리를 배깅으로 적용하기
from sklearn.tree import DecisionTreeClassifier
bagging = BaggingClassifier(DecisionTreeClassifier(), n_estimators=5, n_jobs=-1, random_state=42)
bagging.fit(X_train, y_train)
baggin.score(X_test, y_test)

 

분류 정답계산 : 부류 판단(정확도, 정밀도, 재현율) 
회귀 정답계산 : 오차기반 판단(MSE, RMSE, R^2)

 

voting : 다른 알고리즘의 모델을 합쳐 결과를 도출
  - hard voting : knn, tree, logistic 등 각 기법의 예측결과 중 과반수를 결과로 함(사용 안함)
  - soft voting : 예측 결과의 확률을 가중평균을 내어 확률이 높은 값을 결과로 함
bagging : 한 알고리즘의 모델을 활용하여 결과를 도출
  - 사용되는 컬럼을 다르게함
  - 부트 스트랩핑 : 중복허용 랜덤샘플링
boosting : 1종류 모델
  - 순차적으로 각 모델이 결과를 내고, 오차를 다음 차례의 모델에게 넘겨주며 중점을 두어야할 정보를 넘김 (느림)

scikit learn : random forest(bagging), gradient boosting(boosting)

'Programming > Machine Learning' 카테고리의 다른 글

스케일 조정  (0) 2020.02.15
머신러닝 모델 - 간단한 요약  (0) 2020.02.15
선형모델  (0) 2020.02.14
K-NN 분류 알고리즘  (0) 2020.02.14
Data sets 개략적 파악  (0) 2020.02.11