본 글에서 사용한 코드는 모두 Google Colab에서 실행함
빅데이터 분석기사 실기 교재를 참고한 코드이며 실습 파일 또한 교재에 포함되어있음을 밝힘
import pandas as pd
import numpy as np
#데이터 로드
import warnings
warnings.filterwarnings("ignore")
import pandas as pd
data=pd.read_csv('breast-cancer-wisconsin.csv', encoding='utf-8')
data.head()

Class : target 변수, 0과 1로 이진 분리된 범주형 변수
10개의 feature 존재
data.hist(figsize=(20,10))

y = data[["Class"]]
X = data[data.columns[1:10]]
#행열 확인
print(X.shape,y.shape)
(683, 9) (683, 1)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test=train_test_split(X, y, stratify=y, random_state=42)
#학습 데이터와 테스트데이터 진단 여부(0,1) 비율 유사한지 확인
print(y_train.mean())
print(y_test.mean())
Class 0.349609 dtype: float64 Class 0.350877 dtype: float64
평균 확인해보니 약 35% 수준으로 비슷함
from sklearn.preprocessing import MinMaxScaler
scaler=MinMaxScaler()
scaler.fit(X_train)
X_scaled_train=scaler.transform(X_train)
X_scaled_test=scaler.transform(X_test)
from sklearn.ensemble import RandomForestClassifier
rf=RandomForestClassifier()
rf.fit(X_scaled_train, y_train)
pred_train=rf.predict(X_scaled_train)
rf.score(X_scaled_train, y_train)
1
#오차 행렬
from sklearn.metrics import confusion_matrix
confusion_train=confusion_matrix(y_train, pred_train)
print("훈련데이터 오차행렬:\n", confusion_train)
훈련데이터 오차행렬:
[[333 0]
[ 0 179]]
훈련 데이터셋에 대한 오차행렬 또한 모두 맞춘 결과를 내보였다.
따라서 모델로 훈련이 잘 됐다는 것을 확인 할 수 있다.
훈련 데이터로 모델이 잘 학습되었다는 것을 확인했으니 이제 테스트 데이터로 예측 결과를 살펴보자.
#테스트데이터 예측 결과
pred_test=rf.predict(X_scaled_test)
rf.score(X_scaled_test, y_test)
#테스트데이터의 오차행렬
confusion_test=confusion_matrix(y_test, pred_test)
print("테스트데이터 오차행렬:\n", confusion_test)
#테스트데이터의 분류 예측 레포트
from sklearn.metrics import classification_report
cfreport_test=classification_report(y_test, pred_test)
print("분류예측 레포트:\n", cfreport_test)
0.9649122807017544
테스트데이터 오차행렬:
[[106 5]
[ 1 59]]
분류예측 레포트:
precision recall f1-score support
0 0.99 0.95 0.97 111
1 0.92 0.98 0.95 60
accuracy 0.96 171
macro avg 0.96 0.97 0.96 171
weighted avg 0.97 0.96 0.97 171

정밀도와 재현율의 조화 평균으로, 정밀도와 재현율이 비슷할수록 F1-score도 높아진다.
0~1 사이의 값을 가지머 f1 score가 높을수록 성능이 좋다고 말할 수 있다. 이 때, f1-score는 %로 나타내지 않는다.

Any mean을 좌우로 조정하면 Type 1,2 error의 크기는 변화한다. 하지만 둘 다 커지거나 둘 다 작아지는 경우는 없다.
따라서 정밀도와 재현율 모두 높은 것은 불가능한 Trade-off 관계이다.
일반적으로 랜덤 포레스트가 의사결정나무보다 성능이 뛰어난 모델이다.
같은 데이터셋으로 의사결정나무 모델을 적용했을 때, 약 93.5%의 결과를 내보였으며 96%의 정확도를 내놓은 랜덤 포레스트보다 정확도가 떨어진 걸 확인했다.