상세 컨텐츠

본문 제목

분류(Classification) 평가지표

데이터분석 by파이썬

by evaseo 2021. 6. 16. 19:01

본문

 

1.    분류모형 성과평가

(1)     분류분석이 내놓은 답과 실제 정답이 어느 정도 일치하는지를 판단

 

(2)     일반화, 효율성, 정확성을 기준으로 모형 평가 방법이 필요

1)       일반화: 다른 데이터에서도 안정적으로 적용 가능여부

2)       효율성: 모형의 계산 양에 비한 모형의 성능 고려

3)       정확성: 구축된 모형의 분류 정확성

 

(3)     오분류표, 오차행렬(혼동행렬, Confusion Matrix)

1)       분류분석 후 예측한 값과 실제 값의 차이를 교차 표 형태로 정리한 것

2)       실제 값과 예측치의 값에 대한 옳고 그름을 표로 나타낸 것

3)       분류의 예측 오류가 얼마인지와 더불어 어떠한 유형의 예측 오류가 발생하는지 나타내는 지표

4)       분류오차의 정확한 추정치를 얻기 위해서 평가용(test) 데이터로부터 계산되어 얻은 표

l  TP(True Positive), 참양성: 예측한 값이 Positive이고 실제 값도 Positive인 경우

l  FN(False Negative), 거짓음성: 예측한 값이 Negative이고 실제 값은 Positive인 경우

l  FP(False Positive), 거짓양성: 예측한 값이 Positive이고 실제 Negative값은 인 경우

l  TN(True Negative), 참음성: 예측한 값이 Negative이고 실제 값도 Negative인 경우

 

5)       평가지표(메트릭 metrics)

        정분류율=정확도(Accuracy)

i.     전체 관측치 중 올바르게 예측한 비율

ii.    정확도는 직관적으로 모델 예측 성능을 나타내는 지표.

iii.   실제 데이터에서 예측 데이터가 얼마나 같은지를 나타내는 지표.

iv.   1이 나오면 과적합 의심 => LogisticRegression의 매개변수 C로 정확도를 조정함

v.    불균형한 레이블 값 분포에서 ML모델의 성능을 판단할 경우 적합한 평가 지펴가 아님 => 이를 보완할 다른 분류 지표 필요
ex) 100
개의 데이터 중 90개는 레이블이 0, 10개는 레이블이 1이라고 한다면 무조건 0으로 예측 결과를 반환하는 ML모델의 정확도는 90%

예를 들어, 사기 행각 예측 모델에서는 사기 행위가 positive 양성으로 1, 정상 행위가 negative 음성으로 0 값이 결정 값으로 할당되거나 암 검진 예측 모델에서는 암이 양성일 경우 positive 양성으로 1, 암이 음성일 경우 negative 음성으로 0이 할당

ð  사기 행각은 정상 행위 대비 소수이고, 암이 양성일 경우는 음성일 경우에 비해 소수이므로 positive의 수가 상대적으로 negative보다 적다

ð  positive 데이터 건수가 매우 작기 때문에 데이터 기반한 ML 알고리즘은 positive보다는 negative로 예측 정확도가 높아지는 경향 발생

10,000가너의 데이터 셋에서 9,900건이 negative이고 100건이 positive라면 negative로 예측하는 경향이 더 강해져서 TN은 매우 커지고 TP는 매우 작아지게 된다. 또한, negative로 예측할 때 정확도가 높아지므로 FN(negative로 예측할 때 틀린 데이터 수)는 매우 작고, positive로 예측하는 경우가 작기 때문에 FP(positive로 예측할 때 틀린 데이터 수)도 매우 작아진다.

결과적으로 정확도 지표는 비대칭한 데이터 셋에서 positive에 대한 예측 정확도를 판단하지 못한 채 negative에 대한 정확도만으로도 분류의 정확도가 매우 높게 나타나는 수치적인 판단 오류 발생

 

        정밀도(Precision)

i.     예측 Positive 중 실제도 Positive를 찾아낸 비율 = TP/(TP + NP)

ii.    출력결과가 정답을 얼마나 맞혔는지를 나타내는 지표.

iii.   FP를 낮추는데 초점

iv.   미처 잡아내지 못한 개수가 많더라도 더 정확한 예측이 필요하다면 정밀도를 중시 = 실제 negative 음성인 데이터 예측을 positive 양성으로 잘못 판단하게 되면 업무상 큰 영향이 발생하는 경우
ex) negative
인 일반 메일을 positive인 스팸메일로 분류했을 때 업무에 차질

 

        재현율(recall) = 민감도(Sensitivity) = TPR(True Positive Rate)

    ex) 레이블 처리(labelling)된 사진을 분석해 레이블 처리하지 않은 사진을 분류하는 작업을 재현(recall) 과정이라 한다.

i.     실제 Positive중 올바르게 Positive를 예측해 낸 비율 = TP/(TP + FN)

ii.    모형의 완전성을 평가하는 지표

iii.   출력결과가 실제 정답 중에서 얼마나 맞혔는지를 나타내는 지표.

iv.   FN를 낮추는데 초점

v.    잘못 걸러내는 비율이 높더라도 참값을 놓치는 일이 없도록 하는 경우에 재현율을 중시 = 실제 positive 양성 데이터를 negative로 잘못 판단하게 되면 업무상 큰 영향이 발생하는 경우
ex1)
암 판단 시 실제 positive인 암환자를 negative 음성으로 잘못 판단한 경우 생명 위험
ex2)
실제 금융거래 사기인 positive 건을 negative로 잘못 판단한 경우 회사 손실 큼

 

        특이도(Specificity) = TNR(True Negative Rate): 실제 Negative 중 올바르게 Negative를 찾아낸 비율

 

        오분류율(Error Rate): 전체 관측치 중 잘못 예측한 비율

 

        F1 Score

i.     정밀도와 재현율의 조화평균 값으로 정밀도와 재현율이 어느 한쪽으로 치우치지 않는 수치를 나타낼 때 상대적으로 높은 값을 가진다.

ii.   


iii.   시스템의 성능을 하나의 수치로 표현하기 위해 사용하는 점수로, 0~1 사이의 값을 가진다.

iv.   Precision Recall 중 한 쪽만 클 때보다 두 값이 골고루 클 때 큰 값을 가진다.

v.    정밀도와 재현율의 상충관계를 반영하여 실제 분류기를 비교하는데 사용되는 지표로 정밀도와 재현율이 균형을 이룰 때 F1-Score가 높아진다.

조화평균: 역수의 산술평균의 역수. 역수의 차원에서 평균을 구하고, 다시 역수를 취해 원래 차원의 값으로 돌아오는 것


        거짓긍정률(False Positive Rate, FPR): 실제 Negative인 값 중 Positive로 잘못 분류한 비율


        Kappa

i.     코헨의 카파는 두 평가자의 평가가 얼마나 일치하는지 평가하는 값으로 0~1 사이의 값을 가진다.

ii.     


iii.   코헨의 카파는 두 평가자의 평가가 우연히 일치할 확률을 제외한 뒤의 점수

iv.   P(e)는 두 평가자의 평가가 우연히 일치할 확률을 뜻


 

     코헨의 카파에서 P(e)의 계산


평가자 A와 평가자 B가 어떤 대상에 대해 내린 결론이라고 생각해보자. 그러면 평가자 A Y라는 평가를 줄 확률은


이다. 마찬가지로 평가자 B Y라는 평가를 내릴 확률은


이다. 따라서 A B가 우연히 Y라는 같은 평가를 내릴 확률은 이 둘의 곱인


이다. 마찬가지로 평가자 A와 평가자 B가 우연히 N이라는 같은 평가를 내릴 확률은


이다. 따라서 평가자 A와 평가자 B가 우연히 같은 평가를 내릴 확률은 이 둘의 합이다.

 

     재현율 vs 정밀도

 

  재현율 정밀도
공통점 TP를 높이는데 초점
차이점 FN(실제 Positive, 예측 Negsative)을 낮추는데 초점 FP(실제 Negsative, 예측 Positive)를 낮추는데 초점
상대적으로 더 중요한 경우 실제 Positive 양성인 데이터 예측을 Negative 음성으로 잘못 판단하게 되면 업무상 영향이 큰 경우. 실제 Negative 음성인 데이터 예측을 Positive 양성으로 잘못 판단하게 되면 업무상 영향이 큰 경우.

n  정밀도는 서로 보완적인 지표로 분류의 성능을 평가하는데 적용된다.

n  가장 좋은 성능 평가는 재현율과 정밀도가 모두 높은 수치를 갖는 경우

n  둘 중 하나라도 매우 낮은 결과를 나타낸다면 바람직하지 않다고 할 수 있다

n  임계 값(Threshold)로 재현율과 정밀도의 수치를 조절할 수 있다.

 

6)       성과평가 파이썬 함수 from sklearn import metrics

        혼동행렬

i.     metrics.confusion_matrix( y_true , y_pred , label= None)

a.         label: 행렬을 인덱싱 레이블 목록. 레이블의 하위 집합을 재정렬하거나 선택하는 사용
ex)

 

실제 0 1 0 0 1 1 1 0 0 1 1 0 1 1 0 0
예측 0 1 0 1 0 1 1 1 0 1 1 1 0 1 1  

 

confusion_matrix(실제 , 예측 , labels=[1, 0])

 

  예측
1 0
실제 1 6 2
0 3 5

 

confusion_matrix(실제 , 예측 , labels=[0, 1]): label 디폴트

 

  예측
0 1
실제 0 5 3
1 2 6

 

a.       i 번째 행과 j 번째 열 항목이 참 레이블이 i 번째 클래스이고 예측 레이블이 j 번째 클래스 인 샘플 수를 나타내는 혼동 행렬 반환

y_true = ["cat", "ant", "cat", "cat", "ant", "bird"]
y_pred = ["ant", "ant", "cat", "cat", "ant", "cat"]
confusion_matrix(y_true, y_pred, labels=["ant", "bird", "cat"])

              

  ant bird cat
ant 2 0 0
bird 0 0 1
cat 1 0 2

 

b.      logit()함수로 모델을 만든 경우에는 모델.pred_table()로도 혼동행렬 생성 가능

 

        행렬 시각화

import seaborn as sns

sns.heatmap(mat.T, square = True, annot=True, fmt='d', cbar=False, xticklabels=faces.target_names, \
			yticklabels=faces.target_names) 
# scure = True: 모서리 각지게
plt.xlabel('true(real) label')
plt.ylabel(' predicted label')
plt.xticks(rotation=45)
plt.show()​
실행결과

        정확도

i.     실제값과 추정치 사용:
metrics.accuracy_score ( y_true(test) , y_pred , * , normalize = True , sample_weight = None )

a.       정확도가 100%인 것은 overfitting, 포용성 없다

b.      100%보다는 96~99%의 정확도를 가지면 포용력 있어서 인식력이 더 좋아짐

ex) 꼬리가 있는 고양이로 학습해서 100% 정확도 나옴. 이때 꼬리가 없는 고양이는 고양이로 인식 못함. 98%라면 꼬리 없는 고양이도 고양이로 인식 가능

 

ii.    train데이터와 test데이터의 정확도 비교

a.       모델.score(x_test, y_test)와 모델.score(x_train, y_train)로 비교

b.      train의 정확도와 test의 정확도의 차이가 크면 모델이 train에 과적합 된 것으로 해석가능

c.       정확도를 올리려면 독립변수의 개수를 조정

d.      train의 결정계수와 test의 결정계수 차이가 많이나면 독립변수 수를 조절하여 차이를 줄일 수 있다.

e.       혼동행렬은 test데이터를 계산해서 만들기 때문에 모델.score(x_test, y_test)metrics.accuracy_score의 값이 같다

f.        재현율: metrics.recall_score( y_true , y_pred)

g.      정밀도: metrics.precision_score( y_true , y_pred)

h.       정밀도, 재현율, 임계 값: metrics.precision_recall_curve(y_true, probas_pred)

ü   probas_pred: positive 컬럼의 예측 확률 배열
ex) probas_pred =
모델.predict_proba(x)

ü   0.11~0.95 정도의 임계 값을 담은 ndarray와 이 임계 값에 해당하는 정밀도 및 재현율 값을 담은 ndarray를 반환

from sklearn.metrics import precision_recall_curve

# 레이블 값이 1일때의 예측 확률을 추출
# predict_proba의 첫 번째 열은 negative(0), 두 번째 열은 positive(1)
pred_proba_class1 = lr_clf.predict_proba(X_test)[:, 1]

# 실제값 데이터 셋과 레이블 값이 1일 때의 예측 확률을 precision_recall_curve 인자로 입력
precisions, recalls, thresholds = precision_recall_curve(y_test, pred_proba_class1 )
print('반환된 분류 결정 임곗값 배열의 Shape:', thresholds.shape)

#반환된 임계값 배열 로우가 147건이므로 샘플로 10건만 추출하되, 임곗값을 15 Step으로 추출.
thr_index = np.arange(0, thresholds.shape[0], 15)
print('샘플 추출을 위한 임계값 배열의 index 10개:', thr_index)
print('샘플용 10개의 임곗값: ', np.round(thresholds[thr_index], 2))

# 15 step 단위로 추출된 임계값에 따른 정밀도와 재현율 값
print('샘플 임계값별 정밀도: ', np.round(precisions[thr_index], 3))
print('샘플 임계값별 재현율: ', np.round(recalls[thr_index], 3))​
실행결과

i.        F1 Score: metrics.f1_score(y_true, y_pred)

j.        주요 분류 지표를 보여주는 텍스트 보고서
metrics.classification_report(y_true , y_pred , label= None)

ex)

 

실제 0 1 0 0 1 1 1 0 0 1 1 0 1 1 0 0
예측 0 1 0 1 0 1 1 1 0 1 1 1 0 1 1  

 

              

 

  예측
1 0
실제 1 6 2
0 3 5

confusion_matrix(실제 , 예측 , labels=[1, 0])  

 

metrics.classification_report( 실제   값 ,  예측   값 , labels=[1, 0])

 



  예측
0 1
실제 0 5 3
1 2 6

confusion_matrix(실제 , 예측 , labels=[0, 1]) 

 

 metrics.classification_report( 실제   값 ,  예측   값 , labels=[0, 1]): label  디폴트   값  

 

(4)     정밀도/재현율 트레이드오프

1)       분류의 결정 임계 값(Threshold)을 조정해서 정밀도 또는 재현율 수치 조절 가능

2)       정밀도/재현율 트레이드오프(Trade-off): 정밀도와 재현율은 상호 보완적인 평가 지표이므로 한쪽을 강제로 높이면 다른 한쪽의 수치는 낮아지는 경우

3)       사이킷런 분류 알고리즘은 예측 데이터가 특정 레이블에 속하는지 계산하기 위해 먼저 개별 레이블별로 결정 확률을 구한다. 그리고 예측 확률이 큰 레이블 값으로 예측하게 된다.

4)       이진 분류일 때는 임계 값을 기준으로 이 값보다 확률이 크면 positive, 작으면 negative로 결정한다.
따라서 정밀도와 재현율 조절은 임계 값 조절로 이루어진다.

5)       임계 값을 낮추면 재현율은 올라가고 정밀도는 떨어진다.
=>
임계 값이 낮을수록 True 값이 많아지게 됨. True 예측을 많이 하다 보니 실제 양성을 음성으로 예측하는 횟수가 상대적으로 줄어든다.

 

6)       사이킷런 함수

        모델.predict_proba(feature)

i.     softmax 함수 값 반환

ii.    매개변수 feature가 어디 집단에 속하는지에 대한 확률 값 반환

iii.   m × n(m: 입력 값의 레코드 수, n: 클래스 값 유형) ndarray 형태로 반환
ex)
입력 테스트 데이터 셋의 표본 개수가 100, 예측 클래스 값 유형이 2(이진분류)라면 반환 값은 100 × 2 ndarray로 반환

iv.   확률이 가장 큰 값의 집단에 속하게 된다. => predict()predict_proba() 호출 결과로 반환된 배열에서 분류 결정 임계 값보다 큰 값이 들어 있는 컬럼의 위치를 받아서 최종적으로 예측 클래스를 결정하는 API이다.

< predict_proba() predict()를 사용하여 예측>

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

# 원본 데이터를 재로딩, 데이터 가공, 학습데이터/테스트 데이터 분할.
titanic_df = pd.read_csv('../testdata/titanic_data.csv')
y_titanic_df = titanic_df['Survived']
X_titanic_df= titanic_df.drop('Survived', axis=1)
X_titanic_df = transform_features(X_titanic_df)

X_train, X_test, y_train, y_test = train_test_split(X_titanic_df, y_titanic_df, test_size=0.20, random_state=11)

lr_clf = LogisticRegression()

lr_clf.fit(X_train , y_train)

pred_proba = lr_clf.predict_proba(X_test)
pred  = lr_clf.predict(X_test)
print('pred_proba()결과 Shape : {0}'.format(pred_proba.shape))
print()
print('pred_proba array에서 앞 3개만 샘플로 추출 \n', pred_proba[:3])
print()

# 예측 확률 array 와 예측 결과값 array 를 concatenate 하여 예측 확률과 결과값을 한눈에 확인
pred_proba_result = np.concatenate([pred_proba , pred.reshape(-1,1)],axis=1)
print('두개의 class 중에서 더 큰 확률을 클래스 값으로 예측 \n',pred_proba_result[:3])​
실행결과

 

<predict_proba()Binarizer(threshold)로 예측 이진분류만 가능>

predict()의 결과와 같은 결과 도출

from sklearn.preprocessing import Binarizer

#Binarizer의 threshold 설정값. 분류 결정 임곗값임. 
custom_threshold = 0.5

# predict_proba( ) 반환값의 두번째 컬럼 , 즉 Positive 클래스 컬럼 하나만 추출하여 Binarizer를 적용
pred_proba_1 = pred_proba[:,1].reshape(-1,1)

binarizer = Binarizer(threshold=custom_threshold).fit(pred_proba_1)
custom_predict = binarizer.transform(pred_proba_1)
print(custom_predict[:3])​
실행결과

 

(5)     ROC 커브(Receiver Operating Characteristic Curve)

1)       분류분석 모형의 평가를 쉽게 비교할 수 있도록 시각화한 그래프

2)       우리말로 수신자 판단 곡선으로 불린다. 2차대전 때 통신 장비 성능 평가를 위해 고안된 수치

3)       FPR(False PositiveRate)가 변할 때 TPR(True Positive Rate)가 어떻게 변하는지를 나타내는 곡선

4)       TPR(True Positive Rate, 재현율) FPR(False PositiveRate)은 서로 비례

5)       잘 예측한 TPR을 높이면 잘못 예측한 FPR 또한 높아짐

6)       FPR은 임계 값으로 조절 가능.
 
임계 값을 1로 지정하면 Positive 예측 기준이 매우 높기 때문에 분류기(Classifier)가 임계 값보다 높은 확률을 가진 데이터를 Positive로 예측할 수 없기 때문에 FPR0이 된다. , 아예 Positive로 예측하지 않기 때문에 FP 값이 0이 되므로 자연스럽게 FPR0이 된다.
 
반대로 FPR1로 만들려면 TN0으로 만들면 된다. 임계 값을 0으로 지정하면 Positive 확률이 너무 낮아서 전부 positive로 예측하게 되고 TN 0이되고 FPR1이 된다.

7)       FPR 대비 TPR 좋게 나오도록 시각화 한 것이 ROC 커브

8)       x: FPR(1 – 특이도), Y: TPR(민감도)

9)       이진분류 모형의 성능을 평가하기 위해 사용

10)   AUC(Area Under ROC)

        ROC 커브의 아래 면적

        분류의 성능 지표로 사용

        1에 가까울수록 모형의 성능이 우수

        0.5에 가까울수록 무작위로 예측하는 랜덤모델에 가까운 좋지 못한 모형

        AUC 수치가 커지려면 FPR이 작은 상태에서 얼마나 큰 TPR을 얻을 수 있느냐가 관건

11)   휨 정도가 크다 = 면적이 1에 가깝다 = 두 집단을 더욱 잘 구별할 수 있다


12)   ROC 커브 파이썬 함수

        metrics.roc_curve( y_true , y_score , pos_label = None)

i.     y_true: 실제 클래스 값 array(array shape = [데이터 건수])

a.       이진 레이블. 라벨이 {-1, 1} 또는 {0, 1}

b.      {-1, 1} 또는 {0, 1}이 아닌 경우 pos_label을 명시적으로 지정해야 한다.

ii.    y_score: Positive 클래스의 확률 추정치 = decision_function , predict_proba()의 반환 값 array에서 Positive 컬럼의 예측 확률(첫 번째 컬럼)

n  긍정클래스: {-1, 1}에서 1 또는 {0, 1}에서 1

iii.   pos_label

a.       포지티브 클래스의 레이블

b.      pos_label=None경우, y_true{-1, 1} 또는 {0, 1}
ex) {1, 2}
y_true를 설정할 경우 포지티브 클래스는 2이므로 pos_label = 2라고 설정해야 함

iv.   반환 값

a.       FPR

b.      TPR

c.       thresholds: 임계 값

ü   thresholds의 이하의 값은 False, 이상은 True 로 판단.

ü   임계 값에 따라 ROC 커브 위의 점 위치가 변화

ü   threshold를 낮출수록 TPR & FPR 비율이 높아지고, threshold를 높일수록 TPR & FPR 비율이 낮아진다.

ü   보통 FPR, TPR 순서로 확률 분포가 위치하여 threshold를 낮추면 TPR이 먼저 증가하고, threshold를 높이면 FPR이 먼저 사라진다.

ex1) 의사가 모든 환자들을 암 확률이 어느 정도만 되어도(threshold가 낮음) 암 환자로 판정하면 TPR(실제 암에 걸린 환자를 암이라 판정) FPR(암에 걸리지 않았지만 암이라 판정) 이 함께 높아짐
 => threshold
낮다 => TPR & FPR 비율 높음

ex2) 의사가 모든 환자들을 암 확률이 매우 높을 때(threshold가 높음) 암 환자로 판정하면 TPR(실제 암에 걸린 환자를 암이라 판정) FPR(암에 걸리지 않았지만 암이라 판정) 이 함께 낮아진다.
=> threshold
높다 => TPR & FPR 비율 낮음

from sklearn.metrics import roc_curve
titanic_df = pd.read_csv('../testdata/titanic_data.csv')
y_titanic_df = titanic_df['Survived']
X_titanic_df= titanic_df.drop('Survived', axis=1)
X_titanic_df = transform_features(X_titanic_df)

X_train, X_test, y_train, y_test =train_test_split(X_titanic_df, y_titanic_df, test_size=0.20, random_state=11)

lr_clf = LogisticRegression()

lr_clf.fit(X_train , y_train)
# 레이블 값이 1일때의 예측 확률을 추출
# predict_proba의 첫 번째 열은 negative(0), 두 번째 열은 positive(1)
pred_proba_class1 = lr_clf.predict_proba(X_test)[:, 1]
fprs, tprs, thresholds = roc_curve(y_test, pred_proba_class1)

# 반환된 임곗값 배열에서 샘플로 데이터를 추출하되, 임곗값을 5 Step으로 추출.
# thresholds[0]은 max(예측확률)+1로 임의 설정됨. 이를 제외하기 위해 np.arange는 1부터 시작
thr_index = np.arange(1, thresholds.shape[0], 5)

print('샘플 추출을 위한 임곗값 배열의 index:', thr_index)
print('샘플 index로 추출한 임곗값: ', np.round(thresholds[thr_index], 2))

# 5 step 단위로 추출된 임계값에 따른 FPR, TPR 값
print('샘플 임곗값별 FPR: ', np.round(fprs[thr_index], 3))
print('샘플 임곗값별 TPR: ', np.round(tprs[thr_index], 3))​

[참고] 분류 성능 측정하는법 Accuracy, Precision, Recall, F1 score, ROC, AUC in python (tistory.com)

        AUC = ROC커브의 면적: metrics.auc(fpr, tpr)

=> 점선은 완전한 랜덤 분류기의  ROC 곡선이다 .  좋은 분류기는 이 점선으로부터 최대한 멀리 떨어져 있어야 한다 .

 

     make_classification() 함수

n  sklearn이 제공해주는 분류를 위한 가상 데이터를 설정에 따라 쉽게 만들 수 있는 함수.

n  함수의 인자

u  n_samples: 표본 데이터의 수, default = 100

u  n_features: 독립 변수의 수, default = 20

u  n_informative: 독립 변수 중 종속 변수와 상관 관계가 있는 성분의 수, default = 2

u  n_redundant: 독립 변수 중 다른 독립 변수의 선형 조합으로 나타나는 성분의 수, default=2

u  n_repeated: 독립 변수 중 단순 중복된 성분의 수, default = 0

u  n_classes: 종속 변수의 클래스 수, default = 2

u  n_clusters_per_class: 클래스 당 클러스터의 수, default = 2

u  weights: 각 클래스에 할당된 표본 수

u  random_state: 난수 발생 시드

n  반환값

u  x: [n_samples, n_features] 크기의 배열, 독립 변수

u  y: [n_samples] 크기의 배열, 종속 변수


[참고] [Python] 분류용 가상 데이터를 생성해주.. : 네이버블로그 (naver.com)

<총정리>

titanic_df = pd.read_csv('../testdata/titanic_data.csv')
y_titanic_df = titanic_df['Survived']
X_titanic_df= titanic_df.drop('Survived', axis=1)
X_titanic_df = transform_features(X_titanic_df)

X_train, X_test, y_train, y_test =train_test_split(X_titanic_df, y_titanic_df, test_size=0.20, random_state=11)

lr_clf = LogisticRegression()

lr_clf.fit(X_train , y_train)
lr_pred = lr_clf.predict(X_test)
# 레이블 값이 1일때의 예측 확률을 추출
# predict_proba의 첫 번째 열은 negative(0), 두 번째 열은 positive(1)
pred_proba_class1 = lr_clf.predict_proba(X_test)[:, 1]

from sklearn.metrics import confusion_matrix, accuracy_score, precision_score, recall_score, f1_score, roc_auc_score
def get_clf_eval(y_test, pred=None, pred_proba=None):
    confusion = confusion_matrix( y_test, pred)
    accuracy = accuracy_score(y_test , pred)
    precision = precision_score(y_test , pred)
    recall = recall_score(y_test , pred)
    f1 = f1_score(y_test,pred)

    # ROC-AUC 추가 \n",
    roc_auc = roc_auc_score(y_test, pred_proba)
    print('오차 행렬')
    print(confusion)
    
    # ROC-AUC print 추가
    print('정확도: {0:.4f}, 정밀도: {1:.4f}, 재현율: {2:.4f},\
        F1: {3:.4f}, AUC:{4:.4f}'.format(accuracy, precision, recall, f1, roc_auc))

get_clf_eval(y_test, pred= lr_pred, pred_proba=pred_proba_class1)​
실행결과

관련글 더보기