from sklearn.metrics import confusion_matrix
confusion = confusion_matrix(y_test, pred_logreg)
print(confusion)
교차 검증
k-fold : 가장 널리 사용
k개로 나누고 정확도 얻고 평균냄
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
iris = load_iris()
logreg = LogisticRegression(max_iter=1000)
평가하려는 모델, train data, test data
scores = cross_val_score(logreg, iris.data, iris.target, cv=5)
print(scores)
장점 :
train_test_split은 데이터를 무작위로 나눔.
교차검증은 테스트 셋에 각 샘플이 정확하게 한번씩 들어감
단점 : 연산비용 k배 늘어남
교차검증은 모델을 만드는 바업ㅂ이 아니라 학습된 알고리즘이 얼마나 잘 일반화 될지 평가하는 것
회귀는 기본 k-fold 사용
분류 일경우
계층별 k-겹 교차검증(stratified k-fold cross-validation) 사용
from sklearn.model_selection import StratifiedKFold
skf = StratifiesKFold(n_splits=10, shuffle=True, random_state=0)
score = cross_val_score(logreg, iris.data, iris.target, cv=skf)
score.mean()

from sklearn.model_selection import KFold
kfold = KFold(n_splits=5)
cross_val_score(logreg, iris.data, iris.target, cv=kfold)
kfold = KFold(n_splits=3, shuffle=True, random_state=0)
cross_val_score(logreg, iris.data, iris.target, cv=kfold)
cv 에 교차 검증 분할기 (cross validation splitter) 대입 가능
LOOCV
from sklearn.model_selection import LeaveOneOut
loo = LeaveOneOut()
scores = cross_val_score(logreg, iris.data, iris.target, cv=loo)
scores.mean()
데이터 클때는 시간 매우 오래걸림
지금까지는 일반화 성능 측정
grid search
지금부터는 매개변수 튜닝
가능한 모든 조합 시도
나눌때는 검증세트 활용하기
train으로 fit -> val으로 score
하지만 일반화 성능을 더 잘 평가하려면 교차검증을 사용해서 각 매개변수의 조합의 성능을 평가
param_grid = {'C': [0.001,0.01,0.1,1,10,100],
'gamma': [0.001,0.01,0.1,1,10,100]}
from sklearn.model_selection import GridSearchCV
grid_search = GridSearchCV(SVC(), param_grid, cv=5, return_train_score=True)
과적합을 막기 위해 나누기
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=0)
grid_search.fit(X_train, y_train)
grid search는 fit predict score제공
grid search의 fit은 가장 좋은 매개변수로 전체 훈련 데이터셋에 대해 새로운 모델을 자동으로 만듦
일반화 성능을 평가하려면 score 사용하기
grid_search.score(X_test, y_test)
print(grid_search.best_params_)
print(grid_search.best_score_)
{'C': 10, 'gamma': 0.1}
0.9731225296442687
grid search 교차 검증 결과 분석
dataframe으로 시각화
import pandas as pd
pd.set_option('display.max_columns', None)
results = pd.DataFrame(grid_search.cv_results_)
# display
np.transpose(results.head())
heatmap으로 시각화하기 쉬움

위의 히트맵을 보면 svc는 매개변수 설정에 매우 민감함 또한 매개변수 그리드의 범위에서 결괏값이 크게 변하고 있다 즉 매개변수의 범위가 충분히 넓다.

그리드가 전부 같은 색이거나 (1)
세로띠 형태롤 보이거나 (2) -> gamma만 정확도에 영향을 줌
왼쪽 아래에서는 아무런 변화 없으면 안좋음
비대칭 매개변수 grid search
조건부 매개변수 조합 적용
param_grid = [{'kernel':['rbf'],
'C': [0.001,0.01,0.1,1,10,100],
'gamma': [0.001,0.01,0.1,1,10,100]},
{'kernel':['linear'],
'C': [0.001,0.01,0.1,1,10,100],}]
grid_search = GridSearchCV(SVC(), param_grid, cv=5, return_train_score=True)
grid_search.fit(X_train, y_train)
print(grid_search.best_params_)
print(grid_search.best_score_)
dict 2개 리스트로 대입
교차검증과 grid search 병렬화
n_jobs=-1하면됨
평가 지표와 측정
최종목표를 잘 설정해야함
정확도만으로는 예측 성능을 측정하기 부족할 수도 있음
FP : 잘못된 양성 예측
FN : 잘못된 음성 예측
예를 들어 암진단에서는 거짓 음성을 최대한 피해야함
중요도가 비슷한 경우는 거의 없음
불균형 데이터 셋에서는 정확도는 좋지않음
ex) 광고 배너 클릭
confusion matrix
confusion matrix는 이진 분류 평가 결과를 나타낼 때 가장 많이 사용
테스트 데이터와 예측 결과 대입
from sklearn.metrics import confusion_matrix
confusion = confusion_matrix(y_test, pred_logreg)
print(confusion)
| TN | FP |
| FN | TP |
대각 행렬은 정확히 분류한 것임
FP, FN에 비해 TN, TP가 많아야함
precision
recall

precision은 FP의 수를 줄이는 것이 목표일 때의 성능지표로 사용
예측된 것 중 진짜 양성(TP)의 비율
recall은 FN의 수를 줄이는 것이 목표일 때의 성능지표로 사용
전체 양성 샘플 중 진짜 양성(TP)의 비율
precision과 recall은 trade off 존재
모든 데이터를 양성으로 예측하면 TN이 FP가 되어서 precision의 분모를 크게 만들지만 거짓으로 예측한 것이 없으므로 FN이 0이 되어서 recall은 1이 됨.
전체 그림을 보려면 f1-score를 보자
from sklearn.metrics import f1_score
f1_score(y_test, pred_logreg)
from sklearn.metrics import classification_report
classification_report(y_test, svc.predict(X_test))
임계값도 조정이 가능하다
decision function 은 0, predict_proba는 0.5가 기준
임계값을 바꾸는 것은 precision과 recall의 상충 관계를 조절하는 거임
어떠한 목표가 선택되면 적절한 임계값 선택가능
ROC 곡선
모든 임계값을 고려하면서 TP에 대한 FP의 비율을 나타냄
from sklearn.metrics import roc_curve
fpr, tpr, thresholds = roc_curve(y_test, svc.decision_function(X_test))
plt.plot(fpr, tpr, label='roc curve')
from sklearn.metrics import plot_roc_curve
plot_roc_curve(svc, X_test, y_test)
면적값 하나로 ROC 곡선을 요약할때가 많다 -> 이 면적을 AUC라고 함.
from sklearn.metrics import roc_auc_score
rf_auc = roc_auc_score(y_test, rf.predict_proba(X_test)[:,1])
svc_auc = roc_auc_score(y_test, svc.decision_function(X_test))
print('rf auc: ', rf_auc)
print('svc auc: ', svc_auc)
불확실한 정보에서는 정확도보다 AUC가 훨씬 의미있는 정보를 제공함
다중분류
from sklearn.metrics import accuracy_score
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, random_state=0)
lr = LogisticRegression(max_iter=5000).fit(X_train,y_train)
pred = lr.predict(X_test)
print(lr.score(X_test, y_test))
print(accuracy_score(y_test, pred))
print(confusion_matrix(y_test, pred))

다중 분류에서 불균형 데이터셋을 위해 가장 널리 사용하는 평가지표는 f1-score의 다중분류 버전
한 클래스를 양성 클래스로 두고 나머지를 음성으로 간주
f1-score의 default는 binary
f1_score(y_test, pred, average='micro')
회귀는 R^2로 충분함
모델 선택에서 평가 지표 사용하기
print('기본 평가 지표: ', cross_val_score(SVC(), digits.data, digits.target==9, cv=5))
explicit_acc = cross_val_score(SVC(), digits.data, digits.target==9, cv=5, scoring='accuracy')
print('정확도 지표: ', explicit_acc)
ap = cross_val_score(SVC(), digits.data, digits.target==9, cv=5, scoring='roc_auc')
print('평균 정밀도 지표: ', ap)
분류 문제에서 scoring 매개변수의 중요 옵션은 accuracy(기본값), roc곡선의 아래면적인 roc_auc, 정확도-재현율 곡선의 아래 면적인 average_precision, 이진 f1-score인 f1, 가중치 방식에 따라 f1_macro, f1_micro, f1_weighted
회귀문제에서는 R^2. mean square error 등이 있음
'머신러닝' 카테고리의 다른 글
| 파이썬 머신러닝 완벽가이드 - 1장 (0) | 2021.09.07 |
|---|---|
| 알고리즘 체인과 파이프라인 (0) | 2021.08.09 |
| 데이터 표현과 feature engineering (0) | 2021.07.31 |
| clustering (0) | 2021.07.25 |
| 차원축소, 특성 추출, 매니폴드 학습 (0) | 2021.07.22 |