💡 method
head() : 처음 5개의 샘플 확인
info() : 데이터 프레임의 각 열의 데이터 타입과 누락된 데이터가 있는지 확인하는 데 유용
describe() : 평균, 표준편차, 최소, 최대값을 확인할 수 있으며 중간값과 1사분위수 그리고 3사분위수를 알려줌.
로지스틱 회귀 모델을 이해할 수 있을까? 왜 저런 계수 값을 학습했는지 이해할 수 있을까? 더 쉬운 방법으로 설명할 수 있는 모델이 있을까?
예/아니오에 대한 질문을 이어나가면서 정답을 찾아 학습하는 알고리즘.
비교적 예측 과정을 이해하기 쉽고 성능도 뛰어나다.
데이터를 잘 나눌 수 있는 질문을 찾는다면, 계속 질문을 추가하여 분류 정확도를 높일 수 있다.
사이킷런이 결정 트리 알고리즘을 제공. DecisionTreeClassifier()
plt.figure(figsize=(10,7))
plot_tree(dt, max_depth=1, filled=True, feature_names=['alcohol', 'sugar', 'pH'])
plt.show()
DecisionTreeClassifier 클래스의 criterion 매개변수의 기본값이 'gini'
결정 트리 모델은 부모 노드와 자식 노드의 불순도 차이가 가능한 크도록 트리를 성장시킴.
부모 노드와 자식 노드의 불순도 차이를 계산하는 방법
위와 같은 방식으로 구한, 부모와 자식 노드 사이의 불순도 차이를 정보 이득(information gain)이라고 부른다.
이 알고리즘은 정보 이득이 최대가 되도록 데이터를 분리. 이 때 지니 불순도를 기준으로 사용
criterion='entropy'
💡불순도 기준을 사용해 정보 이득이 최대가 되도록 노드를 분할한다. 노드를 순수하게 나눌수록 정보 이득이 커진다. 새로운 샘플에 대해 예측할 때에는 노드의 질문에 따라 트리를 이동한다. 그리고 마지막에 도달한 노드의 클래스 비율을 보고 예측을 만든다.
결정 트리에서 가지치기를 하는 가장 간단한 방법 !!
자라날 수 있는 트리의 최대 깊이를 지정하는 것.
📌 결정 트리는 표준화 전처리 과정이 필요없다!!!!
결정트리는 어떤 특성이 가장 유용한지 나타내는 특성 중요도를 계산해준다. 특성 중요도는 결정 트리 모델의 featureimportances 속성에 저장되어 있다.
print(dt.feature_importances_)
하이퍼파라미터 튜닝을 위해 모델을 평가할 때, 테스트 세트를 사용하지 않기 위해 훈련 세트에서 다시 떼어 낸 데이터 세트.
문제에 따라 다르지만, 보통 20~30%를 테스트 세트와 훈련 세트로 떼어 놓고 훈련 데이터가 아주 많은 경우 단 몇 %만 떼어 놓아도 전체 데이터를 대표하는 데 문제 없다.
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)
train_test_split()를 2번 적용해서 훈련 세트와 검증 세트로 나눠주었다.
훈련 세트를 여러 폴드로 나눈 다음 한 폴드가 검증 세트의 역할을 하고 나머지 폴드에서는 모델을 훈련한다. 교차 검증은 이런 방식으로 모든 폴드에 대한 검증 점수를 얻어 평균하는 방법.
훈련 세트를 세 부분으로 나눠서 교차 검증을 수행하는 것.
보통은 5-폴드 교차 검증이나 10-폴드 교차 검증을 많이 이용.
💡 검증 세트가 줄어들지만 각 폴드에서 계산한 검증 점수를 평균하기 때문에 안정된 점수로 생각할 수 있다!
cross_validate()
기본적으로 5-폴드 교차 검증을 수행. cv 매개변수에서 폴드 수 변경 가능.
first parameter : 평가할 모델 객체
next parameter : 훈련 세트 전체
from sklearn.model_selection import cross_validate
scores = cross_validate(dt, train_input, train_target)
print(scroes)
📌 주의할 점!! cross_validate()는 훈련 세트를 섞어 폴드를 나누지 않는다. train_test_split() 함수로 전체 데이터를 섞은 후 훈련 세트를 준비했기 때문에 따로 섞을 필요가 없다.
만약 교차 검증을 할 때 훈련 세트를 섞으려면 분할기(splitter)를 지정해야 함.
from sklearn.model_selection import StratifiedKFold
scores = cross_validate(dt, train_input, train_target, cv=StratifiedKFold())
print(np.mean(scores['test_score']))
# 0.855300214703487
# 훈련 세트를 섞은 후 10-폴드 교차 검증 수행
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']))
# 0.8574181117533719
모델 파라미터 : 머신러닝 모델이 학습하는 파라미터
하이퍼파라미터 : 모델이 학습할 수 없어서 사용자가 지정해야만 하는 파라미터
사이킷런과 같은 머신러닝 라이브러리를 사용할 때, 하이퍼파라미터는 모두 클래스나 메서드의 매개변수로 표현됨.
🥲 한 매개변수의 최적값을 찾고 다른 매개변수의 최적값을 찾는 것이 아니라, 두 매개변수를 동시에 바꿔가며 최적의 값을 찾아야 하는 것...!
하이퍼파라미터 탐색을 자동화해주는 도구.
탐색할 매개변수를 나열하면 교차 검증을 수행하여 가장 좋은 검증 점수의 매개변수 조합을 선택한다. 마지막으로 매개변수 조합으로 최종 모델을 훈련한다.
from sklearn.model_selection import GridSearchCV
# 0.0001부터 0.0005까지 0.0001씩 증가하는 5개의 값 시도.
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)
💡 교차 검증에서 최적의 하이퍼파라미터를 찾으면 전체 훈련 세트로 모델을 다시 만들어야 한다!!!!!!
사이킷런의 그리드 서치는 훈련이 끝나면 모델 중 검증 점수가 가장 높은 모델의 매개변수 조합으로 전체 훈련 세트에서 자동으로 다시 모델을 훈련한다. 이 모델은 gs 객체의 bestestimator 속성에 저장되어 있다.
print(gs.best_params_)
# {'min_impurity_decrease' : 0.0001}
연속된 매개변수 값을 탐색할 때 유용하다. 탐색할 값을 직접 나열하는 것이 아니고 탐색 값을 샘플링할 수 있는 확률 분포 객체를 전달한다. 지정된 횟수만큼 샘플링하여 교차 검증을 수행하기 때문에 시스템 자원이 허락하는 만큼 탐색량을 조절할 수 있다.
from scipy.stats import uniform, randint
params = {'min_impurity_decrease': uniform(0.0001, 0.001), 'max_depth': randint(20,50), 'min_samples_split': randint(2,25), 'min_samples_leaf': randint(1,25),}
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)
어떤 구조로 가지런히 정리되어 있는 데이터로 CSV, Database, Excel에 저장하기 쉬움.
정형 데이터와 반대되는 데이터로 Database나 Excel로 표현하기 어려운 데이터.
🪄 앙상블 학습 Ensemble Learning
정형 데이터를 다루는 데 가장 뛰어난 성과를 내는 알고리즘. 이 알고리즘은 대부분 결정 트리를 기반으로 만들어져 있다.
신경망 알고리즘
비정형 데이터에 사용해야 하는 알고리즘.
앙상블 학습의 대표 주자 중 하나로 안정적인 성능 덕분에 널리 사용되고 있다.
랜덤 포레스트는 각 트리를 훈련하기 위한 데이터를 랜덤하게 만드는데, 입력한 훈련 데이터에서 랜덤하게 샘플을 추출하여 훈련 데이터를 만든다. 단, 한 샘플이 중복되어 추출될 수도 있다. 이렇게 만들어진 샘플을 부트스트랩 샘플이라고 한다.
랜덤 포레스트와 매우 비슷하지만, 차이점은 부트스트랩 샘플을 사용하지 않는다는 점.
splitter='random'
랜덤하게 노드를 분할하여 과대적합을 감소시킨다.
깊이가 얕은 결정 트리를 사용하여 이전 트리의 오차를 보완하는 방식으로 앙상블하는 방법.
랜덤 포레스트나 엑스트라 트리와 달리 결정 트리를 연속적으로 추가하여 손실 함수를 최소화하는 앙상블 방법.
💡훈련 속도가 조금 느리지만 더 좋은 성능을 기대할 수 있다.
- 경사 하강법을 사용하여 트리를 앙상블에 추가한다.
- 분류에서는 로지스틱 손실 함수를 사용하고 회귀에서는 평균 제곱 오차 함수를 사용한다.
from sklearn.ensemble import GradientBosstingClassifier gb = GradientBosstingClassifier(random_state=42) scores = cross_validate(gb, train_input, train_target, return_train_score='True', n_jobs=-1)
그레이디언트 부스팅의 속도를 개선한 것.
💡안정적인 결과와 높은 성능으로 인기가 높음.