본문 바로가기
  • UNIV_LIFE_BY_HUGWAN
Artificial Intelligence/Machine Learning 실습

BREAST CANCER CLASSIFICATION(실습)-2

by 이후지 2022. 12. 28. 13:58

저번시간에 데이터를 다루는 연습을 해봤습니다!

pandas dataframe을 이용해서 데이터를 우리가 잘 이용할 수 있게 바꿔주었습니다.

이 부분은 제 블로그 https://univ-life-record.tistory.com/entry/BREAST-CANCER-CLASSIFICATION실습-1 를 참고해 주세요!

 


오늘은!

우리가 다룬 데이터를 가지고 기계를 학습시킬 겁니다.

사용할 머신러닝 방법은 SVM(Support Vector Machine)입니다!

 

일단 학습을 시키기 전에!

머신러닝 학습이란 게 무엇인가요?

기계에게 문제에 대한 정답을 알려주고 나중에 새로운 문제가 들어왔을 때

학습했던 것을 토대로 예측하는 것입니다.

 

그럼!

일단 문제와 이에 대한 정답을 머신러닝에게 학습시켜야 합니다.

문제와 정답을 학습시킨다는 것은 많은 예시들을 머신러닝 기계에 넣어서 학습시킨다는 의미와도 같습니다.

 

우리가 다루는 이번 프로젝트에서는 종양의 특징들(길이, 모양, 부드러운 정도)과 

이에 대한 target값(양성, 음성)을 주면 기계가 학습합니다.

 

그럼 이 특징들(입력)과 target(출력)을 머신러닝에게 학습시키기 위해 

우리가 저번에 만들어 놓은 데이터들을 어떻게 변환하는지부터 알아봅시다!


우리가 저번시간에 pandas dataframe으로 데이터를 합쳐놨습니다.

이렇게 데이터와 target값이 섞여있기 때문에 이를 다시 분리해줘야 합니다!

그래야 입력과 출력 각각을 머신러닝에게 학습시킬 수 있으니까요!

 

X = df_cancer.drop(['target'], axis = 1)
Y = df_cancer['target']

이렇게 입력 X와 출력 Y를 만들어줬습니다. 

X(입력)는 target열을 제외한 행렬이고

Y(출력)는 target열만 가진 행렬이 됩니다.

(이렇게 데이터를 쉽게 사용할 수 있는 게 pandas와 numpy의 장점입니다.)


이제 X와 Y를 머신러닝 기계에 학습시키면 되겠네요!

하지만!! 

이 기계가 괜찮은 성능을 나타내는지 확인해 봐야겠죠?

이를 위해 우린 데이터를 train(훈련) set와

test(테스트) set으로 나눌 겁니다.

 

여기서부터 sklearn의 엄청난 power를 확인하실 수 있습니다!

먼저 train과 test set을 분리해 볼게요!

from sklearn.model_selection import train_test_split 
X_train, X_test, y_train, y_test = train_test_split( X, Y, test_size=0.2, random_state=5)

자 이렇게 해주면, 저절로 분리해 줍니다.

train_test_split의 매개변수로 X, Y를 넣고,

test_size = 0.2, test에 쓸 데이터는 20%로 하겠다는 의미!

그리고 random_state는 아무 값을 넣어줘도 되는데,

저처럼 5를 넣어주면 제가 한 결과와 똑같이 나옵니다.

다른 값을 넣는다고 틀린 게 아니라는 의미!


여러분 거의 다 왔습니다!

이제 드디어!! 학습을 시킬 차례예요 ㅎㅎ

우리가 사용할 SVM도 sklearn에서 가져오겠습니다. 

정말 강력하죠?

(SVM에 관한 원리, 이론적인 부분은 조만간 따로 포스팅하겠습니다.

지금은 그냥 머신러닝 기계학습 중 한 방법이다!로 알고 계셔도 좋고,

따로 찾아서 공부해보셔도 좋습니다!)

from sklearn.svm import SVC
svc_model = SVC()
svc_model.fit(X_train, y_train)

학습은 이렇게 해주시면 됩니다. 

sklearn에서 SVC를 import 해주고,

svc_model 객체를 만들어줍니다.

그리고 fit method를 사용해서 학습을 시킵니다.

이때는 전 단계에서 데이터를 나눠준 X_train, y_train을 써야겠죠? 훈련단계이기 때문에!!


이제 모델을 평가해 볼게요! 

얼마나 잘 예측하는지! 

기대되지 않나요?

#표를 만들어서 시각화를 더 잘하기 위해? metrics
from sklearn.metrics import classification_report, confusion_matrix

y_predict = svc_model.predict(X_test)

cm = confusion_matrix(y_test, y_predict)
sns.heatmap(cm, annot = True)

일단 맨 위의 metrics는 결과값을 잘 분석하기 위한 도구라고 생각하시면 됩니다.

예측을 위해,

SVC()가 가지고 있는 predict() 함수를 사용할 겁니다.

y_predict 변수를 만들어서 예측 값을 넣어주고

 

cm 변수에 confusion_matrix 값(y_predict(예측)와 y_test(실제)를 비교)을 넣어줍니다.

confusion_matrix에 관한 내용도 따로 포스팅하겠습니다!ㅜㅜ

이를 직관적으로 보기 위해 sns의 heatmap을 사용합니다.

annot을 True로 설정해서 값이 숫자로 나오도록 해줄게요!


☆모델 평가

양성 종양(암)인 경우가 0이고 음성이 1입니다.

세로축은 예측이고, 가로축이 실제 값입니다.

즉, 첫 번째 블록(41)은 예측을 양성 종양(0)으로 했고, 실제로 양성 종양인 경우,

네 번째 블록(66)은 예측을 음성 종양(1)으로 했고, 실제로 음성 종양인 경우입니다.

이 두 경우는 맞게 예측을 한 case입니다.

 

두 번째 블록(7)은 예측은 양성 종양(0)으로 했지만, 실제로는 음성 종양(1)인 경우입니다.

세 번째 블록(0)은 예측을 음성 종양(1)으로 했지만, 실제로는 양성 종양(0)인 경우입니다.

이 두 경우가 틀리게 예측을 한 case가 되겠네요.

 


★모델 성능 개선

우린 암에 걸렸는지를 머신러닝을 통해 확인하고 싶습니다.

정확도가 더 높아야 하겠죠?

특히 세 번째 블록(암에 걸렸는데 걸리지 않았다고 예측)의 경우는 완전히 없어야 합니다.

이를 위해 다음시간에는 정확도를 높이는 방법에 대해 배울 겁니다.

어떤 방법으로 정확도를 높일 수 있는지!

다음 포스팅에서 만나요~

댓글