🌟 K-Nearest Neighbors(KNN) 알고리즘은 머신러닝에서 가장 기본적이면서도 강력한 방법 중 하나입니다. 이 알고리즘은 분류와 회귀 문제에 모두 사용되며, 그 구현의 단순함과 효율성으로 인해 널리 사용됩니다. 오늘은 KNN을 활용하여 실제 문제를 해결하는 방법을 Kaggle의 Drug Classification 데이터셋을 사용하여 살펴볼 것입니다.
K-Nearest Neighbors, KNN 알고리즘이란?
K-Nearest Neighbors Algorithm 설명
KNN 알고리즘은 마치 새로운 학생이 학교에 올 때 그 주변에 있는 친구들을 보고 그 학생의 특성을 유추하는 것과 비슷합니다. 이 알고리즘은 주변의 'K'개 데이터 포인트(이웃)를 보고, 그 데이터 포인트가 가장 많이 속한 그룹으로 새로운 데이터를 분류합니다. 예를 들어, K=3이면 가장 가까운 세 명의 친구들이 속한 그룹을 보고, 새 학생의 그룹을 정합니다.
거리 측정
KNN에서 중요한 것 중 하나는 '거리'를 어떻게 측정하는가 입니다. 마치 실제 거리처럼, 데이터 포인트 사이의 '거리'를 계산하여 가장 가까운 이웃을 찾습니다. 이 때 주로 사용되는 거리 측정 방법은 '유클리드 거리' (직선 거리)와 '맨해튼 거리' (블록을 돌아가는 거리) 등이 있습니다.
K값 정하기
KNN에서 'K'값은 얼마나 많은 이웃을 볼 것인가를 결정합니다. 너무 적은 K값은 데이터의 작은 변화에 민감하게 반응할 수 있고, 너무 많은 K값은 너무 일반화된 결정을 내릴 수 있습니다. 적절한 K값을 선택하는 것은 중요한 과정입니다.
이런 KNN 알고리즘은 간단하면서도 다양한 분야에서 활용됩니다. 그러나 데이터가 많아질수록 계산량이 많아지고, 매우 다양한 특성을 가진 데이터에서는 성능이 떨어질 수 있습니다. 이런 장단점을 고려하여 적절한 상황에서 사용하는 것이 중요합니다.
환자 맞춤형 약물 예측
이 데이터셋은 환자의 일반 정보와 진단에 기반한 약물 분류에 관한 정보를 담고 있습니다. 주어진 환자에게 적합할 수 있는 약물 유형의 결과를 예측하기 위해서 머신러닝 모델이 필요합니다.
데이터 소개
이 데이터셋에 포함된 변수들은 환자의 일반적인 정보와 약물 분류에 관한 것들입니다. 여기에는 환자의 나이, 성별, 혈압 수준, 콜레스테롤 수준, 혈중 나트륨 대 칼륨 비율, 그리고 처방된 약물 유형이 포함됩니다. 각 변수는 다음과 같습니다:
- Age (나이): 환자의 나이를 나타내며, 예제 데이터로는 23살, 47살 등이 있습니다.
- Sex (성별): 환자의 성별을 나타내는데, 'F'는 여성(female), 'M'은 남성(male)을 의미합니다.
- BP (혈압 수준): 환자의 혈압 수준을 나타내며, 'HIGH'는 고혈압, 'NORMAL'은 정상 혈압, 'LOW'는 저혈압을 의미합니다.
- Cholesterol (콜레스테롤 수준): 환자의 콜레스테롤 수준을 나타내며, 'HIGH'는 높은 콜레스테롤 수준, 'NORMAL'은 정상 콜레스테롤 수준을 의미합니다. 샘플 데이터에는 구체적인 수치가 제공되지 않고 있습니다.
- Na_to_K (나트륨 대 칼륨 비율): 환자의 혈중 나트륨 대 칼륨 비율을 나타내며, 이는 중요한 생화학적 지표 중 하나입니다. 샘플 데이터로는 25.355, 13.093 등이 있습니다.
- Drug (약물 유형): 처방된 약물의 유형을 나타냅니다. 'DrugY', 'drugC'와 같이 다양한 약물 유형이 있을 수 있습니다.
이 데이터는 머신러닝 모델을 통해 환자에게 적합한 약물 유형을 예측하는 데 사용될 수 있으며, 각 변수는 환자의 건강 상태와 약물 반응에 중요한 정보를 제공합니다.
# 라이브러리 임포트 및 데이터 로드
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler, LabelEncoder
# 데이터셋 로드
df_drug = pd.read_csv("drug200.csv")
# 데이터 탐색 및 전처리
print(df_drug.info())
df_drug.describe()
df_drug["Drug"].value_counts()
df_drug["Sex"].value_counts()
df_drug["BP"].value_counts()
df_drug["Cholesterol"].value_counts()
# 범주형 데이터 인코딩
le = LabelEncoder()
df_drug['Sex'] = le.fit_transform(df_drug['Sex'])
df_drug['BP'] = le.fit_transform(df_drug['BP'])
df_drug['Cholesterol'] = le.fit_transform(df_drug['Cholesterol'])
df_drug['Drug'] = le.fit_transform(df_drug['Drug'])
# 데이터 분할 및 스케일링
X = df_drug.drop("Drug", axis=1)
y = df_drug["Drug"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# KNN 모델 훈련 및 평가
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train_scaled, y_train)
y_pred_knn = knn.predict(X_test_scaled)
# 모델 성능 평가
print("KNN Model Accuracy: {:.2f}%".format(accuracy_score(y_test, y_pred_knn) * 100))
print("Classification Report:\n", classification_report(y_test, y_pred_knn))
print("Confusion Matrix:\n", confusion_matrix(y_test, y_pred_knn))
- 모델 정확도: KNN 모델은 85.00%의 정확도를 달성했습니다. 일반적으로 이는 좋은 성능으로 간주됩니다. 하지만 특정 프로젝트의 요구 사항과 벤치마크에 따라 이 수준의 정확도가 받아들일 수 있는지 여부가 결정됩니다.
- 분류 보고서:
- 정밀도(Precision): 0 라벨의 정밀도가 0.88로 가장 높고, 2 라벨의 정밀도가 0.60으로 가장 낮습니다. 정밀도는 예측된 양성 중 실제 양성의 비율을 나타냅니다.
- 재현율(Recall): 1과 2 라벨은 1.00의 재현율을 가지며, 이는 모든 실제 양성 샘플을 정확히 예측했다는 것을 의미합니다. 반면, 3 라벨은 0.50의 재현율로, 절반의 실제 양성 샘플을 놓쳤음을 나타냅니다.
- F1-점수(F1-Score): F1-점수는 정밀도와 재현율의 조화 평균입니다. 1 라벨이 0.93으로 가장 높은 F1-점수를 가지며, 3 라벨이 0.67로 가장 낮습니다.
- 오차 행렬(Confusion Matrix):
- 오차 행렬을 보면 0 라벨이 가장 많이 혼동되고 있는 것을 볼 수 있습니다. 특히 0 라벨을 4로 잘못 예측한 경우가 두 번 있습니다.
- 1, 2, 3 라벨은 상대적으로 적은 수의 샘플이 있음에도 불구하고 높은 예측 정확도를 보입니다.
전반적으로, 모델은 균형 잡힌 데이터셋에서 좋은 성능을 보이고 있지만, 특정 라벨에 대해서는 예측 성능이 다소 떨어질 수 있습니다. 이를 개선하기 위해, 더 많은 데이터를 수집하거나, 모델의 하이퍼파라미터를 조정하거나, 다른 머신러닝 알고리즘을 시도해볼 수 있습니다.
K-Nearest Neighbors(KNN) 알고리즘의 실용성과 간단함은 Kaggle의 Drug Classification 데이터셋을 통해 한번 더 입증되었습니다. 이 프로젝트에서 우리는 85%라는 높은 정확도를 달성함으로써, KNN이 여전히 유용하고 효과적인 머신러닝 도구임을 확인할 수 있었습니다. 분류 보고서와 혼동 행렬을 통해 모델의 강점과 약점을 파악할 수 있었으며, 이를 바탕으로 모델의 개선점을 찾아볼 수 있었습니다.
'AI > ML & DL' 카테고리의 다른 글
[Machine Learning] KNN의 Out-of-Sample 문제: 한계와 해결 방안 (68) | 2024.01.23 |
---|---|
[Machine Learning] 데이터 불균형 극복하기: 머신러닝에서의 핵심 전략들 Imbalanced Dataset (66) | 2024.01.22 |
[Time Series] 시계열 예측의 기초: MA, ARMA, ARIMA 모델 완벽 가이드 - 2탄 AR(Auto-Regressive) (98) | 2024.01.19 |
[Time Series] 시계열 예측의 기초: MA, ARMA, ARIMA 모델 완벽 가이드 - 1탄 SMA & EMA (90) | 2024.01.15 |
[Time Series] 타임시리즈 기초배우기 (79) | 2024.01.13 |