[AI] K-Nearest Neighbors, KNN : Scikit - Learn

Ik·2022년 7월 17일
0

Data

목록 보기
8/34

KNN

KNN?

  • 분류(Classification)와 회귀(Regression) 를 모두 지원
  • 예측하려는 데이터와 input 데이터들 간의 거리를 측정해 가장 가까운 K개의 데이터셋의 레이블을 참조해 분류/예측
    • 거리를 측정해 데이터 포인트를 기준으로 K를 이용해 모델 학습
  • Hyper Parameter
    • K : 새로운 데이터포인트를 분류할때 확인할 데이터 포인트의 개수
      • K가 너무 작으면(모델이 복잡) Overfitting, 너무 크면(모델이 단순) Underfitting
      • 검증 결과에 따라 K값 수정을 통해 개선 가능
      • default : 5
    • 거리
      • 방식
        • p=2: 유클리디안 거리(Euclidean distance - 기본값, L2-Norm)
        • p=1: 맨하탄 거리(Manhattan distance, L1-Norm)
    • Hyper Parameter가 적어 빠르게 만들 수 있다
      • 복잡한 알고리즘 적용 전에 확인용 or base line을 잡기위한 모델
  • Feature의 단위에 영향 받기에 Feature Scaling작업 필요
    • Tree의 경우는 하지 않는다
 from sklearn.neighbors import KNeighborsClassifier
 # 모델 생성
 knn = KNeighborsClassifier(n_neighbors = k)  # 보통 K를 list, 반복문 이용해 학습
 # 학습
 knn.fit(전처리된 Feature_train, 전처리된 Label)
 # 추론
 pred_train = knn.predict(전처리된 Feature_train)
 pred_test = knn.predict(전처리된 Feature_test)

pipeline - (GridSearch - KNN)

# pipeline 2가지
pipeline1 = Pipeline([
    ('s_scaler', StandardScaler()),
    ('knn', KNeighborsClassifier())   # 단순히 pipeline 모델별로 이름 붙여줌
], verbose=True)
pipeline2 = Pipeline([
    ('mm_scaler', MinMaxScaler()), 
    ('knn', KNeighborsClassifier())
], verbose=True)
# parameter
params = {
    "knn__n_neighbors":range(1,11),  #k값 1 ~ 10
    "knn__p":[1,2]  # p(거리재는방식): 1-유클리디안, 2-맨하탄
}
param = {
    "knn__n_neighbors":range(1,11),   # pipeline의 경우 (모델이름__변수)로 정의
    "knn__p":[1,2]
}
gs = GridSearchCV(pipeline1, param, scoring='accuracy', cv=5, n_jobs=-1)
# 학습
gs.fit(Feature, Label)

classification report

  • classification Score 반환
result = classification_report(Label, model.predict(Feature))
# return precision, recall, f1-score, support

0개의 댓글