카테고리 없음

[혼자 공부하는 머신러닝 + 딥러닝] 5장 트리 알고리즘

oneaney 2023. 11. 11. 15:42

테스트 세트를 적게 사용하기

과대적합인지 과소적합인지 판단하기 위해서 테스트세트를 사용하지 않고

훈련세트를 사용하기

 

=> 검증세트

사이킷런에서 제공

wine = pd.read_csv('https://bit.ly/wine_csv_data')
data = wine[['alcohol', 'sugar', 'pH']].to_numpy()
target = wine['class'].to_numpy()
from sklearn.model_selection import train_test_split

train_input, test_input, train_target, test_target = train_test_split(
    data, target, test_size=0.2, random_state=42)
sub_input, val_input, sub_target, val_target = train_test_split(
    train_input, train_target, test_size=0.2, random_state=42)
print(sub_input.shape, val_input.shape)
#(4157, 3) (1040, 3)

from sklearn.tree import DecisionTreeClassifier

dt = DecisionTreeClassifier(random_state=42)
dt.fit(sub_input, sub_target)

print(dt.score(sub_input, sub_target))
print(dt.score(val_input, val_target))
#0.9971133028626413
#0.864423076923077

 

5197개 훈련세트 => 4157 훈련세트 + 1040 검증세트

sub_input, sub_target , val_input, val_target 를 사용하여 모델을 만들고 평가

=> 과대적합

 

교차검증

 

검증세트로 과대적합을 나온 결과를 해결하기 위하여 교차검증 사용

 

사이킷런 cross_validate() => 훈련세트 전체를 전달

train_test_split() 함수로 전체 데이터를 섞은 후 훈련세트 넣기

from sklearn.model_selection import StratifiedKFold

scores = cross_validate(dt, train_input, train_target, cv=StratifiedKFold())
print(np.mean(scores['test_score']))
#0.855300214703487

splitter = StratifiedKFold(n_splits=10, shuffle=True, random_state=42)
scores = cross_validate(dt, train_input, train_target, cv=splitter)
print(np.mean(scores['test_score']))

 

하이퍼파라미터 튜닝

: 모델이 학습할 수 없어서 사용자가 지정해야하만 하는 파라미터

 

그리드 서치

: max_depth 의 최적값 min_samples_split 매개변수의 값을 동시에 바꿔가며 최적의 값을

찾기

from sklearn.model_selection import GridSearchCV

params = {'min_impurity_decrease': [0.0001, 0.0002, 0.0003, 0.0004, 0.0005]}
gs = GridSearchCV(DecisionTreeClassifier(random_state=42), params, n_jobs=-1)
gs.fit(train_input, train_target)

dt = gs.best_estimator_
print(dt.score(train_input, train_target))

print(gs.best_params_)

print(gs.cv_results_['mean_test_score'])

best_index = np.argmax(gs.cv_results_['mean_test_score'])
print(gs.cv_results_['params'][best_index])

params = {'min_impurity_decrease': np.arange(0.0001, 0.001, 0.0001),
          'max_depth': range(5, 20, 1),
          'min_samples_split': range(2, 100, 10)
          }
gs = GridSearchCV(DecisionTreeClassifier(random_state=42), params, n_jobs=-1)
gs.fit(train_input, train_target)

print(gs.best_params_)

print(np.max(gs.cv_results_['mean_test_score']))
 
 
 

 

간격을 일정하게 보다는  랜덤으로 두기 위해서 

 

랜덤서치

: 매개변수 값의 목록을 전달하는 것이 아닌 매개변수를 샘플링할 수 있는 확률분포객체 전달

 

randint : 정수값 뽑기

uniform: 실숫값 뽑기

 

from scipy.stats import uniform, randint
rgen = randint(0, 10)
rgen.rvs(10)

np.unique(rgen.rvs(1000), return_counts=True)

ugen = uniform(0, 1)
ugen.rvs(10)

from sklearn.model_selection import RandomizedSearchCV

gs = RandomizedSearchCV(DecisionTreeClassifier(random_state=42), params,
                        n_iter=100, n_jobs=-1, random_state=42)
gs.fit(train_input, train_target)

print(gs.best_params_)
print(np.max(gs.cv_results_['mean_test_score']))

dt = gs.best_estimator_
print(dt.score(test_input, test_target))

 

 

트리의 앙상블 이전 개념정리

 

앙상블 학습

: 정형데이트를 다루는데 가장 뛰어난 성과를 내는 알고리즘

 

랜덤포레스트

: 앙상블 학습의 대표주자

: 결정트리의 숲으로 만듦

- 부트스트랩 샘플 : 먼저 1개를 뽑고 다시 포함해서 랜덤으로 하나 뽑음 => 중복된 샘플을 뽑아서 만들어진 샘플

 

엑스트라 트리

: 랜덤포레스트와 비슷하게 동작

: 기본적으로 100개의 결정트리 훈련

: 부트스트랩 샘플을 사용하지 않음