인공지능/머신러닝

유방암 데이터 분석하기

해피밀세트 2020. 5. 11. 17:05

 

 

 

R로 분석하기

 

1단계 : 데이터 수집

 

유방암 데이터

http://archive.ics.uci.edu/ml/index.php

 

UCI Machine Learning Repository

Welcome to the UC Irvine Machine Learning Repository! We currently maintain 497 data sets as a service to the machine learning community. You may view all data sets through our searchable interface. For a general overview of the Repository, please visit ou

archive.ics.uci.edu

  • 위스콘신 대학의 연구원들의 자료
  • 유방 종양의 미세침 흡인물 디지털 이미지에서 측장한 값이며
    값은 디지털 이미지에 나타난 세포 핵의 특징이다.
  • 암조직 검사에 대한 관측값은 569, 변수(속성) 32

 

유방암 데이터 컬럼 정보

  1. ID number
  2. Diagnosis (M = malignant, B = benign) : 레이블 양성/악성
  3.  radius (mean of distances from center to points on the perimeter) : 혹의 모양 반지름
  4. texture (standard deviation of gray-scale values) : 질감
  5. perimeter : 둘레
  6. area : 넓이
  7. smoothness (local variation in radius lengths) : 매끄러움
  8. compactness (perimeter^2 / area - 1.0) : 조밀성
  9. concavity (severity of concave portions of the contour) : 오목함
  10. concave points (number of concave portions of the contour) : 오목한 포인트
  11. symmetry : 대칭
  12. fractal dimension ("coastline approximation" - 1) : 프랙탈 차원

 


 

2단계 : 데이터 준비하고 살펴보기

# 데이터 불러오기

wbcd <- read.csv("C:/data/wisc_bc_data.csv",stringsAsFactors=F)

 
# 데이터 구조 확인

str(wbcd)
head(wbcd, 3)

# 행의 수
NROW(wbcd)

# 컬럼의 수

length(wbcd)

# 분석시 필요 없는 컬럼 제거하기 (id 컬럼 삭제)

wbcd <-wbcd[-1]
length(wbcd)

# diagnosis 변수 결과 악성/양성 몇개인지 확인(악성:212 / 양성:357)

table(wbcd[1])

table(wbcd$diagnosis)

# char -> factor 형으로 변환 / B:Benign, M:Malignant로 수정

wbcd$diagnosis <- factor(wbcd$diagnosis, levels = c("B","M"), labels=c("Benign","Malignant"))

table(wbcd$diagnosis)

# wbcd$diagnosis 비율값으로 확인

round(prop.table(table(wbcd$diagnosis))*100)

# 컬럼의 요약 정보(사분위값 확인)

summary(wbcd[c("radius_mean","area_mean","smoothness_mean")])

# 정규화 함수 만들기
# x-min(x)/max(x)-min(x)

normalize <- function(x){

  return ((x-min(x))/(max(x)-min(x)))

}

# 확인

normalize(wbcd$radius_mean)

# 컬럼별로 정규화

wbcd[2:31] <- lapply(wbcd[2:31], normalize)

summary(wbcd[c("radius_mean","area_mean","smoothness_mean")])

# 훈련 데이터와 테스트 데이터 생성
n <- sample(1:NROW(wbcd),400)

# 훈련 데이터
wbcd_train <- wbcd[n,]

# 테스트 데이터

wbcd_test <- wbcd[-n,]

 

 # 데이터별 라벨 분포 확인

table(wbcd$diagnosis)          # 원본데이터

table(wbcd_train$diagnosis)    # 훈련데이터

table(wbcd_test$diagnosis)    # 테스트데이터

 

 

# 훈련데이터, 테스트 데이터 라벨 생성

wbcd_train_labels <- wbcd_train[,1]

wbcd_test_labels <- wbcd_test[,1]

 

# 데이터 라벨  비율 확인

round(prop.table(table(wbcd_train_labels))*100)
round(prop.table(table(wbcd_test_labels))*100)

 

# sample() : 표본을 뽑아내는 매소드/수행할 때마다 값이 달라짐

sample(1:10,5)

sample(1:10,5,replace=T) # 복원 추출

sample(1:10,5,replace=F) # 비복원 추출(기본값)

sample(1:2,100,replace=T) # 모집단보다 큰 샘플을 가지고 싶을때

sample(1:2,100,replace=T,prob=c(0.7,0.3)) # 비율 정해주기

n <- sample(1:NROW(wbcd),400)

 

 


 

3단계 : 학습데이터로 모델 훈련

# 라이브러리 임포트

library(class)
 

# 처음 k값의 기준 : 훈련 데이터에 루트 씌운값 (홀수로)

sqrt(NROW(wbcd_train))

# knn으로 훈련(테스트 데이터에 대한 예측값이 나옴)

# cl : 라벨

wbcd_test_pred <- knn(train=wbcd_train[,-1],test=wbcd_test[,-1],

                      cl=wbcd_train_labels, k=21)

wbcd_test_pred

 


 

4단계 : 모델 성능 평가

# 라이브러리 인스톨 & 임포트

install.packages("gmodels")
library(gmodels)

 

# x=실제값, y=예측값

CrossTable(x=wbcd_test_labels, y=wbcd_test_pred,

           prop.chisq=F)

# 분류 정확도 계산 (테스트 데이터의 예측값과 실제값 비교)

accuracy <- sum(wbcd_test_labels == wbcd_test_pred)/length(wbcd_test_labels)

accuracy

 


 

5단계 : 모델 성능 향상

값이 안나오면

  1. 원본, 정규화, 표준화
  2. k 조정

1) 표준화 데이터로 훈련

# 표준화 하기 확인

summary(wbcd[,-1])

# 표준화 평균 0, 표준편차 1

wbcd[,-1] <- scale(wbcd[,-1])

summary(wbcd[,-1])

# 다시 데이터셋 만들고 훈련

wbcd_train <- wbcd[n,]

wbcd_test <- wbcd[-n,]

wbcd_train_labels <- wbcd_train[,1]

wbcd_test_labels <- wbcd_test[,1]

library(class)

wbcd_test_pred <- knn(train=wbcd_train[,-1],test=wbcd_test[,-1],

                      cl=wbcd_train_labels, k=21)

wbcd_test_pred

CrossTable(x=wbcd_test_labels, y=wbcd_test_pred,

           prop.chisq=F)

accuracy <- sum(wbcd_test_labels == wbcd_test_pred)/length(wbcd_test_labels)

 

2) k값 조정

# k = 1

wbcd_test_pred <- knn(train=wbcd_train[,-1],test=wbcd_test[,-1],

                      cl=wbcd_train_labels, k=1)

CrossTable(x=wbcd_test_labels, y=wbcd_test_pred,

           prop.chisq=F)

accuracy <- sum(wbcd_test_labels == wbcd_test_pred)/length(wbcd_test_labels)

accuracy

# k = 7

wbcd_test_pred <- knn(train=wbcd_train[,-1],test=wbcd_test[,-1],

                      cl=wbcd_train_labels, k=7)

CrossTable(x=wbcd_test_labels, y=wbcd_test_pred,

           prop.chisq=F)

accuracy <- sum(wbcd_test_labels == wbcd_test_pred)/length(wbcd_test_labels)

accuracy

# k = 15

wbcd_test_pred <- knn(train=wbcd_train[,-1],test=wbcd_test[,-1],

                      cl=wbcd_train_labels, k=15)

CrossTable(x=wbcd_test_labels, y=wbcd_test_pred,

           prop.chisq=F)

accuracy <- sum(wbcd_test_labels == wbcd_test_pred)/length(wbcd_test_labels)

accuracy

# k = 27

wbcd_test_pred <- knn(train=wbcd_train[,-1],test=wbcd_test[,-1],

                      cl=wbcd_train_labels, k=27)

CrossTable(x=wbcd_test_labels, y=wbcd_test_pred,

           prop.chisq=F)

accuracy <- sum(wbcd_test_labels == wbcd_test_pred)/length(wbcd_test_labels)

accuracy

# k = 35

wbcd_test_pred <- knn(train=wbcd_train[,-1],test=wbcd_test[,-1],

                      cl=wbcd_train_labels, k=35)

CrossTable(x=wbcd_test_labels, y=wbcd_test_pred,

           prop.chisq=F)

accuracy <- sum(wbcd_test_labels == wbcd_test_pred)/length(wbcd_test_labels)

accuracy

# k값 변경 값들

accuracy_k <-c()

for(i in 1:nrow(wbcd_train)){

  wbcd_test_pred <- knn(train = wbcd_train[,-1], test=wbcd_test[,-1],

                        cl=wbcd_train_labels, k=i)

  accuracy <- sum(wbcd_test_labels == wbcd_test_pred)/length(wbcd_test_labels)

  accuracy_k <- c(accuracy_k,accuracy)

}

accuracy_k

# 시각화

wbcd_test_k <- data.frame(k=c(1:nrow(wbcd_train)),

                              accuracy=accuracy_k)

plot(accuracy ~k, wbcd_test_k, type='l')

plot(accuracy_k, type='l')

 


 

파이썬으로 분석하기

 

2단계 : 데이터 준비하고 살펴보기

 


# 유방암 데이터 불러오기

import pandas as pd
wbcd = pd.read_csv("C:/data/wisc_bc_data.csv")
 

# 0번열(id) 제외

wbcd = wbcd.iloc[:,1:]

 

# 라벨의 빈도수 확인

Counter(wbcd["diagnosis"])

# 사분위값 확인 (R summary)

wbcd.describe()

# 모든 컬럼 표준화하기

wbcd.iloc[:,1:] = np.array(scale(wbcd.iloc[:,1:]))

wbcd.iloc[:,1:3].describe()

# 라벨 나누기

X = wbcd.iloc[:,1:]

Y = wbcd.iloc[:,0]

 

# 훈련 데이터 / 테스트 데이터 나누기
# 테스트 데이터 사이즈 20%

X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=0.2)

 

# 데이터 개수 확인

X_train.shape[0]

len(X_train)

len(X_test)

len(Y_train)

len(Y_test)

Counter(Y_train)

Counter(Y_test)

 


 

3단계 : 학습데이터로 모델 훈련

# 훈련 시키기

clf = KNeighborsClassifier(n_neighbors=21)

clf.fit(X_train,Y_train)

# 예측 시키기

clf.predict(X_test)

 


 

4단계 : 모델 성능 평가

# 예측값과 실제값 비교

clf.score(X_test, Y_test)

round(clf.score(X_test, Y_test)*100)

# 예측값과 실제값 비교(accuracy_score)

from sklearn.metrics import accuracy_score, classification_report

accuracy_score(Y_test, clf.predict(X_test))

# 예측값과 실제값 비교(crosstab) / R CrossTable

pd.crosstab(Y_test,clf.predict(X_test))

# 리포트 작업

print(classification_report(Y_test, clf.predict(X_test)))

 

반응형