-
[혼자 공부하는 머신러닝 + 딥러닝] 5장 트리 알고리즘카테고리 없음 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개의 결정트리 훈련
: 부트스트랩 샘플을 사용하지 않음