R로 분석하기
1단계 : 데이터 수집
유방암 데이터
http://archive.ics.uci.edu/ml/index.php
- 위스콘신 대학의 연구원들의 자료
- 유방 종양의 미세침 흡인물 디지털 이미지에서 측장한 값이며
이 값은 디지털 이미지에 나타난 세포 핵의 특징이다. - 암조직 검사에 대한 관측값은 569개, 변수(속성) 32개
유방암 데이터 컬럼 정보
- ID number
- Diagnosis (M = malignant, B = benign) : 레이블 양성/악성
- radius (mean of distances from center to points on the perimeter) : 혹의 모양 반지름
- texture (standard deviation of gray-scale values) : 질감
- perimeter : 둘레
- area : 넓이
- smoothness (local variation in radius lengths) : 매끄러움
- compactness (perimeter^2 / area - 1.0) : 조밀성
- concavity (severity of concave portions of the contour) : 오목함
- concave points (number of concave portions of the contour) : 오목한 포인트
- symmetry : 대칭
- fractal dimension ("coastline approximation" - 1) : 프랙탈 차원
2단계 : 데이터 준비하고 살펴보기
# 데이터 불러오기 |
|
# 데이터 구조 확인 str(wbcd) |
|
# 행의 수 # 컬럼의 수 length(wbcd) |
|
# 분석시 필요 없는 컬럼 제거하기 (id 컬럼 삭제) wbcd <-wbcd[-1] |
|
# 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")]) |
|
# 정규화 함수 만들기 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")]) |
|
# 훈련 데이터와 테스트 데이터 생성 # 훈련 데이터 # 테스트 데이터 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] |
|
# 데이터 라벨 비율 확인 |
# 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단계 : 모델 성능 평가
# 라이브러리 인스톨 & 임포트 |
|
# 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단계 : 모델 성능 향상
값이 잘 안나오면
- 원본, 정규화, 표준화
- 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] |
|
# 훈련 데이터 / 테스트 데이터 나누기 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))) |
'인공지능 > 머신러닝' 카테고리의 다른 글
나이브베이즈(Naive Bayes) 분류 (0) | 2020.05.12 |
---|---|
사건과 확률 (0) | 2020.05.12 |
혼동행렬 / 정확도 / 정밀도 / 재현율 / F1 점수 (0) | 2020.05.11 |
머신러닝 - feature scaling (0) | 2020.05.09 |
머신러닝 - 머신러닝 개요 / kNN (0) | 2020.05.08 |