Python에서 K-최근접 이웃(KNN) 모델 구축: 종합 가이드

Python에서 K-최근접 이웃(KNN) 모델을 구축하는 이 종합 가이드에 오신 것을 환영합니다. 데이터 과학 애호가이든 숙련된 전문가이든 관계없이, 이 기사는 데이터 전처리부터 모델 평가에 이르기까지 KNN 분류기를 개발하는 모든 단계를 안내해 드립니다. 이 가이드를 끝까지 읽으시면 Python의 강력한 라이브러리를 사용하여 KNN을 구현하는 방법에 대해 확실한 이해를 가지게 될 것입니다.
목차
K-최근접 이웃(KNN) 소개
K-최근접 이웃(KNN)은 분류 및 회귀 작업에 사용되는 간단하면서도 효과적인 지도 학습 알고리즘입니다. KNN 알고리즘은 이웃들이 어떻게 분류되는지를 기반으로 데이터 포인트를 분류합니다. 직관적이고 구현이 쉬우며 훈련 단계가 필요 없어 실시간 예측에 효율적입니다.
KNN의 주요 특징:
- 느린 학습(Lazy Learning): KNN은 내부 모델을 구축하지 않고 훈련 데이터셋을 기억합니다.
- 인스턴스 기반(Instance-Based): 예측은 훈련 데이터의 인스턴스(이웃)를 기반으로 합니다.
- 비모수적(Non-Parametric): KNN은 기본 데이터 분포에 대한 가정을 하지 않습니다.
데이터셋 이해하기
이 튜토리얼에서는 Kaggle의 WeatherAUS 데이터셋을 사용할 것입니다. 이 데이터셋에는 여러 호주 지역에서 여러 해에 걸쳐 기록된 날씨 속성이 포함되어 있습니다.
데이터셋 개요:
Features | Target Variable |
---|---|
Date, Location, MinTemp, MaxTemp, Rainfall, Evaporation, Sunshine, WindGustDir, WindGustSpeed, WindDir9am, WindDir3pm, WindSpeed9am, WindSpeed3pm, Humidity9am, Humidity3pm, Pressure9am, Pressure3pm, Cloud9am, Cloud3pm, Temp9am, Temp3pm, RainToday, RISK_MM | RainTomorrow (Yes/No) |
데이터 전처리
데이터 전처리는 머신 러닝에서 중요한 단계입니다. 이는 원시 데이터를 이해할 수 있는 형식으로 변환하는 과정을 포함합니다. 적절한 전처리는 머신 러닝 알고리즘의 성능을 크게 향상시킬 수 있습니다.
결측 데이터 처리
결측 데이터는 머신 러닝 모델의 성능에 부정적인 영향을 줄 수 있습니다. 우리는 숫자형 및 범주형 특징 모두에 대한 결측 값을 처리할 것입니다.
숫자형 데이터
- 숫자형 열 식별:
1numerical_cols = list(np.where((X.dtypes == np.int64) | (X.dtypes == np.float64))[0])
- 평균으로 결측 값 대체:
1234from sklearn.impute import SimpleImputerimp_mean = SimpleImputer(missing_values=np.nan, strategy='mean')imp_mean.fit(X.iloc[:, numerical_cols])X.iloc[:, numerical_cols] = imp_mean.transform(X.iloc[:, numerical_cols])
범주형 데이터
- 범주형 열 식별:
1string_cols = list(np.where((X.dtypes == object))[0])
- 최빈값(가장 빈번한 값)으로 결측 값 대체:
123imp_mode = SimpleImputer(missing_values=np.nan, strategy='most_frequent')imp_mode.fit(X.iloc[:, string_cols])X.iloc[:, string_cols] = imp_mode.transform(X.iloc[:, string_cols])
범주형 변수 인코딩
머신 러닝 알고리즘은 숫자 입력을 필요로 합니다. 따라서 범주형 변수를 숫자 형식으로 변환해야 합니다.
라벨 인코딩
라벨 인코딩은 각 범주에 대해 알파벳 순서에 따라 고유한 정수를 할당합니다.
1 2 3 4 5 |
from sklearn import preprocessing def LabelEncoderMethod(series): le = preprocessing.LabelEncoder() return le.fit_transform(series) |
원-핫 인코딩
원-핫 인코딩은 각 범주에 대해 이진 열을 생성합니다.
1 2 3 4 5 6 7 8 9 |
from sklearn.compose import ColumnTransformer from sklearn.preprocessing import OneHotEncoder def OneHotEncoderMethod(indices, data): columnTransformer = ColumnTransformer( [('encoder', OneHotEncoder(), indices)], remainder='passthrough' ) return columnTransformer.fit_transform(data) |
인코딩 선택 함수
이 함수는 고유 범주의 수에 따라 라벨 인코딩 또는 원-핫 인코딩을 적용할지 결정합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
def EncodingSelection(X, threshold=10): string_cols = list(np.where((X.dtypes == object))[0]) one_hot_encoding_indices = [] for col in string_cols: length = len(pd.unique(X[X.columns[col]])) if length == 2 or length > threshold: X[X.columns[col]] = LabelEncoderMethod(X[X.columns[col]]) else: one_hot_encoding_indices.append(col) X = OneHotEncoderMethod(one_hot_encoding_indices, X) return X |
인코딩 적용:
1 |
X = EncodingSelection(X) |
특징 선택
관련성이 높은 특징을 선택하면 모델 성능을 향상시킬 수 있습니다.
- 카이제곱 검정을 사용한 SelectKBest 적용:
12345678910from sklearn.feature_selection import SelectKBest, chi2from sklearn import preprocessingkbest = SelectKBest(score_func=chi2, k=10)MMS = preprocessing.MinMaxScaler()x_temp = MMS.fit_transform(X)x_temp = kbest.fit(x_temp, y)best_features = np.argsort(x_temp.scores_)[-13:]features_to_delete = np.argsort(x_temp.scores_)[:-13]X = np.delete(X, features_to_delete, axis=1)
- 결과 형태:
1print(X.shape) # Output: (142193, 13)
훈련-테스트 분할
데이터셋을 훈련 세트와 테스트 세트로 분할하면 모델을 보지 않은 데이터로 평가할 수 있습니다.
1 2 3 4 5 6 |
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.20, random_state=1 ) print(X_train.shape) # Output: (113754, 13) |
특징 스케일링
특징 스케일링은 독립 변수의 범위를 표준화하여 각 특징이 결과에 동등하게 기여하도록 합니다.
- 표준화:
12345from sklearn import preprocessingsc = preprocessing.StandardScaler(with_mean=False)sc.fit(X_train)X_train = sc.transform(X_train)X_test = sc.transform(X_test)
- 형태 확인:
12print(X_train.shape) # Output: (113754, 13)print(X_test.shape) # Output: (28439, 13)
KNN 모델 구축
데이터 전처리가 완료되었으므로 이제 KNN 분류기를 구축할 준비가 되었습니다.
- KNeighborsClassifier 임포트:
1from sklearn.neighbors import KNeighborsClassifier
- 분류기 초기화:
1knnClassifier = KNeighborsClassifier(n_neighbors=3)
- 모델 훈련:
1knnClassifier.fit(X_train, y_train)
- 예측 수행:
1y_pred = knnClassifier.predict(X_test)
- 단일 예측 예제:
12single_prediction = knnClassifier.predict([X_test[0]])print(single_prediction) # Output: [1] (1 indicates 'Yes' for RainTomorrow)
- 예측 확률:
12prediction_prob = knnClassifier.predict_proba([X_test[0]])print(prediction_prob) # Output: [[0.33333333 0.66666667]]
모델 평가
모델의 성능을 평가하는 것은 정확성과 신뢰성을 이해하는 데 필수적입니다.
- 정확도 점수 임포트:
1from sklearn.metrics import accuracy_score
- 정확도 계산:
12accuracy = accuracy_score(y_pred, y_test) * 100print(f"Accuracy: {accuracy:.2f}%") # Output: Accuracy: 90.28%
해석:
- KNN 모델은 90.28%의 정확도를 달성하여 다음 날의 비 상태를 90% 이상의 경우에 올바르게 예측함을 나타냅니다. 이 높은 정확도는 모델이 이 분류 작업에 적합하다는 것을 시사합니다.
결론
이 가이드에서는 Python에서 K-최근접 이웃(KNN) 모델을 구축하는 전체 과정을 살펴보았습니다:
- 데이터 가져오기: WeatherAUS 데이터셋 활용.
- 데이터 전처리: 결측 값 처리, 범주형 변수 인코딩, 관련 특징 선택.
- 훈련-테스트 분할 및 특징 스케일링: 모델 훈련을 위한 데이터 준비 및 특징 간 균일성 확보.
- 모델 구축: KNN 분류기 훈련 및 예측 수행.
- 모델 평가: 모델의 정확도 평가.
KNN 알고리즘은 특히 잘 전처리된 데이터와 함께 사용할 때 분류 작업에 강력한 선택임을 입증합니다. 그러나 다른 하이퍼파라미터(예: 이웃 수)와 교차 검증 기법을 실험하여 모델 성능을 더욱 향상시키는 것이 중요합니다.
추가 자료
모델링을 즐기세요! 🚀
면책 조항: 이 기사는 비디오 튜토리얼의 전사를 기반으로 하며 Jupyter Notebook과 Python 스크립트의 코드 예제로 보완되었습니다. 특정 데이터셋과 요구 사항에 따라 코드를 적응하고 수정하십시오.