now is better than never
1-2. [지도학습] KNN (K-Nearest Neighborhood) (2) 본문
- 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.
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]
본 내용은 아이티윌 '빅데이터&머신러닝 전문가 양성 과정' 을 수강하며 작성한 내용입니다.
'머신러닝 & 딥러닝' 카테고리의 다른 글
4. [지도학습] 회귀분석 (Regression) (1) (0) | 2023.03.22 |
---|---|
3-2. [지도학습] 의사결정나무 (1R/Ripper) (0) | 2023.03.21 |
3. [지도학습] 의사결정트리 (Decision Tree) (0) | 2023.03.17 |
2. [지도학습] 나이브 베이즈 분류기 (Naive Bayes Classifier) (0) | 2023.03.16 |
1. [지도학습] KNN (K-Nearest Neighborhood) (1) (0) | 2023.03.13 |