728x90

분류

- 주어진 데이터가 어느 카테고리에 속하는지 판단하는 일

- 나이브 베이즈, 로지스틱 회귀, 결정 트리, SVM, 앙상블, 신경망, 최근접 등

- 영상, 음성 등 대용량 비정형 데이터 -> 딥러닝

- 정형 데이터 -> 머신러닝. 최근 앙상블 기법이 애용

 

 

앙상블

- 여러 알고리즘들의 활용(앙상블)

- 약 분류기들을 결합하여 상호 보완

- 배깅/부스팅

 

 

결정 트리 decision tree

- 데이터의 규칙을 트리 형태로 분할해 나가는 모델

- 장점 : 피처 스케일링이나 정규화 필요가 없음

- 단점 : 과적합으로 성능이 떨어짐. 트리 크기 제한 필요.

 

 

사이킷런의 결정트리

- CART Classification And Regression Tree 알고리즘 기반(ref : throwexception.tistory.com/1030?category=857655)

- DecisionTreeClassifier/Regressor 제공

- 다음 파라미터가 있음

 1. min_samples_split : 노드 분할을 위한 최소 샘플 데이터 수, 과적합 제어용. 작을수록 과적합 가능성 증가

 2. min_samples_leaf : 리프 노드가 되기위한 최소 샘플 데이터수. 과적합 제어용. 작을수록 좋음

 3. max_features : 최적 분할을 위해 다룰 최대 피터 갯수. 기본값 "None" 모든 피처 고려

 4. max_depth : 최대 깊이. 기본값 "None"는 완전 분할될때까지 분할 or 리프 노드 최소 샘플까지 분할

 

 

 

결정 트리 과적합 개선하기 

- min_samples_leaf : 리프 노드(말단 노드)가 되는 하한 데이터 갯수를 높이면 과적합 문제가 개선됨.

1. datasets 모듈의 make_classification 함수로 데이터 셋 생성

 - make_classification() : 분류를 위한 데이터 셋 생성 함수

from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_classification
import seaborn as sns
import matplotlib.pyplot as plt


X, y = make_classification(n_features=2, n_informative=2, n_redundant=0,
                          n_classes=3, n_clusters_per_class=1, random_state=0)


plt.scatter(X[:,0],X[:,1], c=y)

2. min_samples_leaf 디폴트(None) 인 상태에서의 성능

- 훈련용 데이터에는 100% 정확하나, 테스트 데이터는 85% 정확도를 보임

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

df = DecisionTreeClassifier()
df.fit(X_train, y_train)

print("train_score : {} ".format(df.score(X_train, y_train)))
print("test_score : {} ".format(df.score(X_test, y_test)))

 

 

 

 

3. min_samples_leaf=6일때 성능

- 훈련 데이터 정확도는 떨어졋으나, 테스트 정확도는 90%로 증가함

df = DecisionTreeClassifier(min_samples_split=6)
df.fit(X_train, y_train)

print("train_score : {} ".format(df.score(X_train, y_train)))
print("test_score : {} ".format(df.score(X_test, y_test)))

 

 

4. GridSearchCV로 최적 하이퍼 파라미터 찾아보기

- 결정 트리 파라미터를 다음과 같이 다양하게 주었을때, 최적 분류기의 파라미터와 성능 보기

 => 훈련 점수는 0.8875로 떨어졋으나, 테스트 점수가 1.0으로 상승했다..?

 * max_depth=4, min_samples_leaf=1, min_samples_split=2 일때,

from sklearn.model_selection import GridSearchCV

param={
    "min_samples_leaf":[1, 2, 3, 4, 5, 6, 7, 8, 9],
    "max_depth":[2, 3, 4, 5, 6, None],
    "min_samples_split":[2, 3, 4, 5, 6, 7, 8, 9, 10]
}

df = DecisionTreeClassifier()
gs = GridSearchCV(df, param_grid=param, cv=5, refit=True)

gs.fit(X, y)

df = gs.best_estimator_
print("train_score : {} ".format(df.score(X_train, y_train)))
print("test_score : {} ".format(df.score(X_test, y_test)))
print(gs.best_score_)
print(gs.best_params_)

300x250

+ Recent posts