now is better than never

1-2. [지도학습] KNN (K-Nearest Neighborhood) (2) 본문

머신러닝 & 딥러닝

1-2. [지도학습] KNN (K-Nearest Neighborhood) (2)

김초송 2023. 3. 14. 15:01

- KNN 전체 코드

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

# 최대 최소 정규화
normalize <- function(x){return ((x-min(x)) / (max(x)-min(x)))}
wbcd_n <- as.data.frame(lapply(wbcd[, c(-1, -2)], normalize))

# train test 데이터 분류
num <- round(nrow(wbcd_n)*0.9)
train <- wbcd_n[1:num, ]
test <- wbcd_n[(num+1):nrow(wbcd_n), ]
train_label <- wbcd[1:num, 2]
test_label <- wbcd[(num+1):nrow(wbcd), 2]

for (i in seq(1, 27, by=2)){
  library(class)
  result <- knn(train=train, test=test, cl=train_label, k=i)
  accuracy <- sum(result == test_label) / length(test_label) * 100
  print( paste('k =', i, ':', accuracy))
}
  • knn  머신러닝 모델을 생성할 때 지정해야 하는 k 값 = 하이퍼 파라미터

 

- Python 으로 구현하기 (sklearn)

  1. 데이터 로드
  2. 데이터 확인
  3. 결측치 확인
  4. 이상치 확인
  5. 데이터 타입 확인
  6. 데이터 정규화
  7. 훈련 / 테스트 데이터 분리
  8. 모델 생성
  9. 모델 훈련
  10. 테스트 데이터 검정
  11. 모델 평가
  12. 모델 성능 개선
# 1. 
import pandas as pd

wbcd = pd.read_csv("C:/Data/wisc_bc_data.csv")

# 2.
wbcd.info()
wbcd.shape

# 3.
wbcd.isnull().sum()

# 4. 
def outlier_value(df):
    for c in df.columns[df.dtypes == 'float64']:
        Q1 = df[c].quantile(0.25)
        Q3 = df[c].quantile(0.75)
        IQR = Q3 - Q1
        print(c, df[c][(df[c] > Q3 + IQR * 5) | (df[c] < Q1 - IQR*5)].count())

outlier_value(wbcd)

# 5. 데이터 타입 확인
wbcd.info()

# 6. 최대 최소 정규화 : 0 과 1 사이의 값으로 변환
from sklearn.preprocessing import MinMaxScaler

wbcd2 = wbcd.iloc[:, 2:] # [행, 열] 환자번호(id) 와 정답(diagnosis) 컬럼 제외
wbcd2.head()

scaler = MinMaxScaler() # scaler 객체 생성
scaler.fit(wbcd2) # min/max 정규화 시행
scaled = scaler.transform(wbcd2)
scaled # numpy 타입

y = wbcd['diagnosis'].to_numpy() # 정답 데이터 array 형태로 구성
y

# 7. 데이터 분리 (훈련:테스트 = 9:1)
from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(scaled, y, test_size=0.1, random_state=1)

# 8. 모델 생성
from sklearn.neighbors import KNeighborsClassifier

model = KNeighborsClassifier(n_neighbors=5) # k=5

# 9. 모델 훈련
model.fit(x_train, y_train)

# 10. 예측
result = model.predict(x_test)
result

# 11. 모델 평가
sum(result == y_test) / len(y_test) * 100

from sklearn.metrics import accuracy_score

accuracy = accuracy_score(y_test, result)
accuracy

# 12. 모델 성능 개선
for k in range(1, 28, 2):
    model = KNeighborsClassifier(n_neighbors=k)
    model.fit(x_train, y_train)
    result = model.predict(x_test)
    accuracy = accuracy_score(y_test, result)
    print('k = {} , accuracy = {}'.format(k, accuracy))
  • 왜 데이터 타입 확인이 필요한가 ?
    어떤 머신러닝 알고리즘을 사용할지 결정해야하기 때문에
  • 만약 대부분의 컬럼들이 다 숫자형이라면 ? 
    -> knn, 신경망, 서포트 벡터 머신이 적합.
  • 만약 대부분의 컬럼들이 다 문자형이라면 ?  
    -> 나이브 베이즈와 의사결정트리가 적합.

 

- 이원교차표

  • Positive : 관심범주 (암)
    Negative : 관심 외의 범주 (정상)
  • True : 정답
    False : 오답
  • True Positive : 실제 암인 사람을 암일 것이라고 예측하는 것이 중요
  • True Negative : 실제 정상인 사람을 정상이라고 예측
  • False Negative : 실제 암인 사람을 정상이라고 예측
    -> TP / TN 을 잘 맞춰도 FN을 못 맞추면 치명적인 결함
  • False Positive : 실제 정상인 사람을 암이라고 예측 -> 이건 그래도 괜찮음
from sklearn.metrics import confusion_matrix

cross_table = confusion_matrix(y_test, result)
cross_table
# [TN FP]
# [FN TP]

 

본 내용은 아이티윌 '빅데이터&머신러닝 전문가 양성 과정' 을 수강하며 작성한 내용입니다.