본문 바로가기
머신러닝/프로젝트

Proj 유방암 진단하기, 로지스틱 회귀

by ADELA_J 2023. 8. 16.

<특징 데이터로 유방암 진단하기 목표 설정>

목표 로지스틱 회귀 분석을 이용해 유방암에 영향을 미치는 특징 데이터를 분석하고 유방암 여부를 진단하는 예측 모델을 생성한다.
핵심 개념 로지스틱 회귀, 시그모이드 함수, 성능 평가 지표, 오차 행렬, 정밀도, 재현율, F1 스코어, ROC 기반 AUC 스코어
데이터 준비 유방암 진단 데이터 : 사이킷런 내장 데이터셋
https://archive.ics.uci.edu/dataset/17/breast+cancer+wisconsin+diagnostic 
데이터 탐색 1. 사이킷런 데이터에서 제공되는 설명 확인:b_cancer.DESCR
2. 사이킷런 데이터셋에 지정된 X 피쳐와 타깃 피쳐 결합
3. 로지스틱 회귀 분석을 위해 X 피쳐 값을 정규 분포 형태로 스케일링
 : b_cancer_scaled = scaler.fit_transform(b_cancer.data)
분석 모델 구축 사이킷런의 로지스틱 회귀 모델 구축
결과 분석 성능 평가 지표 계산: confusion_matrix, accuracy_score, precision_score, recall_score, f1_score, roc_auc_score

* 들어가기에 앞서 개념 잡고 가기

출처 : https://ariz1623.tistory.com/213

<로지스틱 회귀>

- 선형 : 대표직선을 그린거. 대표성을 그리기 때문에 (정확하지 않지만) 

   > 실제값과 예측값의 오차에 기반한 지표를 사용

- 로지스틱 : 직선형태로 대표선을 그을수가 없는 경우 시그모이드를 이용해서 로지스틱 회귀선을 만들 수 있음. 

S자 함수를 사용하여 참(True, 1)과 거짓(False, 0)을 분류 할 수 있음.

  > 이진 분류 결과를 평가하기 위해 오차 행렬에 기반한 정밀도, 재현율, F1, ROc_AUC 많이 사용.

 - 시그모이드 함수 : 로지스틱 회귀에서 사용하는  S자 함수 

  > x의 값이 커지면 y의 값은 1에 근사하게 되고 x의 값이 작아지면 y의 값은 0에 근사하게 되어 s자가 됨.

  > 두개의 값을 분류하는 이진 분류에 많이 사용함.

 

<오차행렬> - 이진 분류의 예측 오류를 나타내는 지표

https://velog.io/@jjw9599/ConfusionMatrix-ClassificationEvaluation

> 전에 했었음 관련 포스팅 https://dev-adela.tistory.com/162

- 정밀도 (precision) : (사이킷런) precision_score 함수 사용가능

  > Positive 예측 성능을 더 정밀하게 평가하기 위한 지표로 사용

- 재현율 (recall, sensitivity) : (사이킷런) recall_score함수 

 > 데이터를 정확히 예측했는지 평가하는 지

- F1 스코어  : (사이킷런) f1_score 함수를 제공

  > 정밀도와 재현율이 서로 트레이드 오프관계인 문제점을 고려하여 정확한 평가를 위해 많이 사용

- ROC 기반 AUC 스코어 : (사이런) roc_auc_score 함수 

   > 오차 행렬의 FPR이 변할 때 TPR이 어떻게 변하는지 나타내는 곡선

    > FPR = 실제 N인 데이터를 P로 거짓 False으로 예측한 비율

    > TPR = 실제 P인 데이터를 T로 예측한 비율(재현율)

   > ROC기반의 AUC 값은 ROC 곡선 밑의 면적을 구하는 것으로 1에 가까울수록 성능이 좋음.

 

 

보스턴  - 선형

붓꽃데이터 - 선형 or 분류

 

<유방암 진단하기>

<데이터 준비>

<EDA>

7행 DESCR를 작성해서 데이터 셋에 대한 설명을 확인하고 

10행을 통해서 데이터셋 객체를 DataFrame 자료형으로 변환해서 생성

12행  유방암 유무를 class로 사용할 diagnosis 컬럼을 추가

15행. 데이터 셋 크기도 알아보고 (diagnosis 컬럼 추가해서 31열)

info() 사용해서 데이터 프레임의 정보(Null이 있는지 없는지 데이터 타입은 뭔지) 알아보고

▷ info는 print를 이미 리턴해주고 있어서 print( info() )라고 안적어줘도 출력 됨

 

<모델링>

정규 분포 스케일러를 임포트 하고 사용할 객체 scaler를 생성

21행. 피처로 사용할 데이터 b_cancer.data에 대해 정규 분포 스케일링을 수행 scaler.fit_transform()

원데이터는 평균이 0으로 안나오기 때문에 정규분포 형태로 만들어준다 > 평균을 0, 분산이 1이 되게 만들어줌

훈련/테스트 데이터 분할하고 로지스틱회귀로 모델링 해주고 fit으로 학습하고 predict으로 예측해봤음

 

<성능 및 결과 분석>

오차행렬을 만들어주고 출력해보니 저렇게 만들어져 있다. 맞춘게 60, 107개...!

이를 토대로 위에서 배운 내용을 사이킷런 함수를 사용하여 

정확도와 정밀도, 재현율, F1 값을 출력해서 성능을 알아봄