☝🏻 WIDA_4주차
- 파이썬으로 모델 불러와서 간단하게 모델 돌려보고 accuracy 측정해보기 (decision tree 제외 한가지 골라서)
- 그 모델의 하이퍼파라미터 분석하기
- 평가 방법 알아보기(log loss 포함 2가지)
랜덤포레스트 모델 실행
코드
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import BaggingClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import pandas as pd
import warnings
warnings.filterwarnings('ignore')
# Random Forest 모델 가져오기
rf_clf = RandomForestClassifier()
bag_clf = BaggingClassifier(rf_clf)
# training dataset 불러오기
train_data = pd.read_csv("drive/MyDrive/Colab Notebooks/train.csv")
# 맞춰야 하는 것은 type이기 때문에 type과 나머지 데이터들을 분리해줌 (슬라이싱)
X = train_data.iloc[:, 2:]
y = train_data.iloc[:, 1] #type 열
# training dataset과 test dataset으로 쪼개기
# training과 test의 비율은 0.3 [7:3으로 쪼갠다]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=11)
# 랜덤 포레스트 학습 및 별도의 테스트 세트로 예측 성능 평가
rf_flf = RandomForestClassifier(criterion='entropy', bootstrap=True, random_state=42, max_depth=5)
rf_clf.fit(X_train, y_train)
pred = rf_clf.predict(X_test)
accuracy = accuracy_score(y_test, pred)
print('랜덤 포레스트 정확도: {0:.4f}'.format(accuracy))
**>>> 랜덤 포레스트 정확도: 0.8767**
정확도는 87.7%였다.
? 궁금했던 건 random_state가 나타내는 바와 숫자 지정을 어떻게 해야할지였다.
아래는 최적의 max_depth를 찾는 코드이다.
**##최적의 max_depth 찾기**
from sklearn.model_selection import KFold
cv = KFold(n_splits=5) #클수록 오래걸림
accuracies = list()
max_attributes = X_test.shape[1]
depth_range = range(1, max_attributes)
#max_depth를 1부터 max attributes까지
for depth in depth_range:
fold_accuracy = []
rand_clf = RandomForestClassifier(max_depth = depth)
# print("Current max depth: ", depth, "\\n")
for train_fold, valid_fold in cv.split(train_data):
f_train = train_data.loc[train_fold] # Extract train data with cv indices
f_valid = train_data.loc[valid_fold] # Extract valid data with cv indices
model = rand_clf.fit(X_train, y_train)
valid_acc = model.score(X_test, y_test)
fold_accuracy.append(valid_acc)
avg = sum(fold_accuracy)/len(fold_accuracy)
accuracies.append(avg)
print("Accuracy per fold: ", fold_accuracy, "\\n")
df = pd.DataFrame({"Max Depth": depth_range, "Average Accuracy": accuracies})
df = df[["Max Depth", "Average Accuracy"]]
print(df.to_string(index=False))
하이퍼파라미터 분석
출처: https://sevillabk.github.io/RandomForest/
- n_estimators: 랜덤 포레스트에서 결정 트리의 개수 지정. 즉, 트리를 몇 개 만들 것인지 (int, default=10). 트리 갯수를 늘릴수록 학습 수행 시간이 오래 걸림
- max_features: 선택할 feature의 개수, 보통 default값으로 씀 (default='auto'). 결정 트리에 사용된 max_features 파라미터와 같음. 단, ‘None’이 아닌 ‘auto’(=’sqrt’)와 같음
- criterion: gini 또는 entropy 중 선택
- min_samples leaf: 리프노드가 되기 위한 최소한의 샘플 데이터 수. 불균형 데이터의 경우 특정 클래스 데이터가 극도로 적을 수 있으므로 작은 값으로 설정 필요. (default : 1)
- min_samples_split: 노드를 분할하기 위한 최소한의 샘플 데이터 수. → 과적합을 제어하는데 사용된다. 값이 작을수록 분할노드가 많아져 과적합 가능성이 증가함. (default : 2)
- max_depth: 트리의 깊이 (int, default=None → 완벽하게 클래스 값이 결정될 때까지 분할). 결정 트리에서의 과적합을 개선하기 위해 사용되는 파라미터가 랜덤 포레스트에도 똑같이 적용될 수 O
- bootstrap: True이면 전체 feature에서 복원추출해서 트리 생성 (default=True)
평가방법
분류의 평가방법은 일반적으로는 실제 결과 데이터와 예측 결과 데이터가 얼마나 정확하고 오류가 적게 발생하는가에 기반하지만, 단순히 정확도를 가지고 판단하는 걸 넘어 다른 성능 평가 지표도 복합적으로 다루어야 한다.
1. log loss
(출처: https://seoyoungh.github.io/machine-learning/ml-logloss/)
DEF) 분류 모델 성능 평가 시 사용 가능한 지표
- Loss fuction(손실 함수, cross-entropy): 모델의 출력값과 정답의 오차를 정의하는 함수
- logloss가 낮을수록 좋은 지표
- M: 클래스 수
- Y: 행 데이터 i가 클래스 m에 속할 경우1, 그렇지 않을 경우 0
- P: 행 데이터 i가 클래스 m에 속하는 예측 확률
- 확률 값을 음의 log함수에 넣어 변환을 시킨 값으로 평가. (잘못 예측할수록 패널티를 부여되는 방식)
- ex) 100% 확률 = -log(1.0) = 0 / 80% 확률 = -log(0.8) = 0.22314 / 60% 확률 = -log(0.6) = 0.51082
- 확률이 낮아질 수록 log loss 값이 기하급수적으로 증가
- 사용 이유
- 최종적으로 맞춘 결과만 가지고 성능을 평가할 경우, 얼만큼의 확률로 해당 답을 얻은건지 평가 불가능
- 보완을 위해 확률 값을 평가 지표로 사용. Log loss는 모델이 예측한 확률 값을 직접적으로 반영하여 평가함.
- 실제 답안에 해당하는 확률 값을 음의 로그를 취해 모두 더하고 1/n해서 평균
from sklearn.metrics import log_loss
#데이터 스플릿으로 y_valid와 모델 예측으로 y_pred_proba를 구한 후 실행해야 한다고 한다.
multi_logloss = log_loss(y_valid, y_pred_proba)
print(multi_logloss)
- logloss를 계산하기 위해서는 확률 예측값(predict_proba)이 필요
2. Precision (정밀도)
DEF) 예측을 positive로 한 대상 중 예측과 실제 값이 positive로 일치한 데이터의 비율
True Positives / ( True Positives + False Positives )
TP / (TP + FP)
⇒ TP + FP: 예측을 positive로 한 모든 데이터 건수
⇒ TP: 예측과 실제 값이 positive로 일치한 데이터 건수
- 주로 FP를 낮추는 데 초점을 맞춤.
- 재현율(recall)과 상호 보완적인 지표.
- 확인
from sklearn.metrics import precision_score
labels = [1, 0, 0, 1, 1, 1, 0, 1, 1, 1]
guesses = [0, 1, 1, 1, 1, 0, 1, 0, 1, 0]
print(precision_score(labels, guesses))
'WIDA > DACON 분류-회귀' 카테고리의 다른 글
[DACON/최다예] 분류 모델 뜯어보기, 분류모델 평가방식 (0) | 2023.03.30 |
---|---|
[DACON/조아영] 분류 모델 뜯어보기, 분류모델 평가방식 (svm 모델도 추가할 예정) (0) | 2023.03.30 |
[DACON/김규리] 분류 모델 알아보기 (1) | 2023.03.24 |
[DACON/조아영] 분류 모델 알아보기 (0) | 2023.03.24 |
[DACON/최다예] 분류 모델 알아보기 (0) | 2023.03.23 |