인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

Moonkyung Yang님의 프로필 이미지
Moonkyung Yang

작성한 질문수

[개정판] 파이썬 머신러닝 완벽 가이드

평가 실습 - 피마 인디언 당뇨병 예측

predict_proba(X_test)[:, 1]

작성

·

1.4K

0

# 피처 데이터 세트 X, 레이블 데이터 세트 y를 추출. 

# 맨 끝이 Outcome 컬럼으로 레이블 값임. 컬럼 위치 -1을 이용해 추출 

X = diabetes_data.iloc[:, :-1]

y = diabetes_data.iloc[:, -1]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 156, stratify=y)

# 로지스틱 회귀로 학습,예측 및 평가 수행. 

lr_clf = LogisticRegression()

lr_clf.fit(X_train , y_train)

pred = lr_clf.predict(X_test)

# roc_auc_score 수정에 따른 추가

pred_proba = lr_clf.predict_proba(X_test)[:, 1]

get_clf_eval(y_test , pred, pred_proba)

--------------------------------------------

선수 학습이 부족해서 그런지 강의를 듣고 다시 코드를 작성하는 과정에서 계속 의문점이 생겨 질문을 남깁니다.

1) pred_proba = lr_clf.predict_proba(X_test)[:, 1]

이 부분에서 왜 [:,1]로 하는 것인가요?

2) X = diabetes_data.iloc[:, :-1]는 정의했고,

(X_test)[:,1]이 제가 이해한 바로는 X_test의 데이터 중에 [all rows, outcome]인데, 맞나요? 

train_test_split을 했을 때  X_test가 어떠한 데이터 프레임 형태를 갖는지 알지 못하여, 

print(X_test)를 하였고 다음과 같은 결과값이 나왔습니다. 

Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \
81             2       74              0              0        0   0.0   
682            0       95             64             39      105  44.6   
169            3      111             90             12       78  28.4   
693            7      129             68             49      125  38.5   
9              8      125             96              0        0   0.0   
..           ...      ...            ...            ...      ...   ...   
293            1      128             48             45      194  40.5   
344            8       95             72              0        0  36.8   
650            1       91             54             25      100  25.2   
415            3      173             84             33      474  35.7   
505           10       75             82              0        0  33.3   

     DiabetesPedigreeFunction  Age  
81                      0.102   22  
682                     0.366   22  
169                     0.495   29  
693                     0.439   43  
9                       0.232   54  
..                        ...  ...  
293                     0.613   24  
344                     0.485   57  
650                     0.234   23  
415                     0.258   22  
505                     0.263   38  

[154 rows x 8 columns]

제가 머신러닝에 대한 기초적 개념이 부족해서인지, 파이썬에 대한 개념이 부족해서인지, 이 부분이 이해가 가지 않습니다. 답변 기다리겠습니다. 감사합니다.

답변 1

2

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

사이킷런의 Classifier 객체들, 예를 들어 DecisionTreeClassifier, LogisticRegression 들은 predict_proba() 메소드를 가지고 있습니다. 이 predict_proba()는 학습이 완료된 Classifier 객체에서 호출되며, predict_proba(X_test)와 같이 테스트 feature 데이터셋이 인자로 입력될 경우 개별 클래스별로 예측 확률값을 반환합니다.

가령, 여러개의 feature들과 Target값이 0(음성), 1(양성)과 같은 두개의 값만이 있는 binary classification으로 학습이 된 모델 lr_clf에서 X_test(테스트용 피처 데이터 세트)를 predict_proba(X_test)로 입력하면 0이될 확률, 1이 될 확률 각각을 반환합니다.

그러니까 예를 들어 X_test 가 아래와 같은 1건을 입력 했을 때 lr_clf.predict_proba(X_test)는 [ [0.1, 0.9]] 와 같은 값을 반환합니다. 첫번째 열인 0.1은 바로 0이 될 확률, 두번째 열인 0.9는 1이 될 확률입니다. 

Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI 
81             2       74              0              0        0

보통 ROC AUC는 1이 될 확률만 있으면 되므로 lr_clf.predict_proba(X_test)[:, 1]로 [0.9] 를 반환합니다.코드를 풀어서 쓰면 아래와 같습니다.

predict_prob_array = lr_clf.predict_proba(X_test)

predict_positive_prob = predict_prob_array[:, 1]

여기서 [:, 1] 의 : 이 사용된 이유는 보통은 X_test로 여러건이 입력되므로 적용합니다. 

감사합니다.

Moonkyung Yang님의 프로필 이미지
Moonkyung Yang

작성한 질문수

질문하기