본문 바로가기

배우기/복습노트[Python과 분석]

[복습] Python | 분석 | knn(거리기반 모델)

728x90
반응형

knn(k-nearest neighbors)

  - 거리기반 모델

  - 스케일링에 민감

  - 이상치에 매우 민감

  - 선택된 변수의 조합에 영향을 많이 받음(선택된 변수의 조합 중요)

  - 수치형 변수 구성 시 가장 유리(명목형 변수는 knn과 어울리지 않음)

  - 게으른 학습

    knn은 다른 모델들과는 다르게 fit 할 때 아무것도하지 않는다. 궁금한 대상이 등장하면 그 때 계산을 하기 시작한다. 즉 predict 할 때 궁금한 대상과 나머지 대상과의 거리를 계산하기 시작한다는 의미이다(kmeans와 헷갈리지 말 것). 10만건의 데이터가 있고 predict 데이터가 3000건이면 10만 곱하기 3000건의 거리가 계산된다. 따라서 fitting 할 때 부하가 크지 않고 predict 할 때 부하가 크다. 결론적으로 학습 시 학습데이터끼리의 거리를 계산하지 않으므로 게으른 학습이라고한다.

 

 

 

예제 -  iris data set의 분류(knn)

 

1. 데이터 로딩

   

 

 

2. 분리

train_x, test_x, train_y, test_y = train_test_split(iris_x, iris_y, random_state = 0)

 

 

3. 스케일링

 

 

4. 모델링

 

테스트 결과가 높아서 과소적합으로 보인다.

 

 

 

5 모델 개선

모델 개선 방법에는 파라미터 튜닝, 변수 선택, 변수 가공 등을 고려할 수 있는데 여기서는 변수 가공은 논외로 하겠다.

모델 점수가 높게 나온 편이기는 하나, 모델 점수를 0.1점 올리는 것은 현업에서는 물론 공모전에서 특히 중요하다. 공모전에서는 0.1점 사이에 몇 십 명이 몰려있기 때문이다.

 

1) 변수 선택

 

변수를 선택하니 over fit 이 심해졌다.

 

2) k의 튜닝

 

결론적으로, 변수 선택의 기대효과는 없고, 파라미터 튜닝의 결과 k = 3 정도가 적합해보이는 것으로 나타났다.

즉, 변수 선택의 효과가 유의미하다고 볼 수 없으며 k가 3일 때 가장 적절한 구간.

 

 

728x90

 

 

참고) 가장 가까운 이웃 확인하기

train data에서 k=1일 때 score는 항상 1이다. predict을 자기 데이터로 시도하기 때문이다. 즉, 가장 가까운 이웃은 자기 자신이라는 의미이다.

 

 

첫 번째 컬럼은 자기 자신과의 거리를 추출하므로 자기 자신을 나타낸다.

1번 데이터는 28번과 가장 가깝다. 43번 데이터와는 두 번째로 가깝다.

즉, 첫 번째 컬럼: 각 행 별로 가장 가까운데이터 포인트 번호(자신 포함)

     두 번째 컬럼: 각 행 별로 두 번째로 가까운 데이터 포인트 번호(자신 포함)

     세 번째 컬럼: 각 행 별로 세 번째로 가까운 데이터 포인트 번호(자신 포함)

 

 

 

예제) iris 데이터의 세 번째와 네 번째 컬럼만으로 분류모델 진행 시 new_data[[0.8, 0]]의 예측 결과와 함께 이웃을 시각화하여라.

(모든 predict data는 2차원으로 들어갸아 함)

 

 

 

plt.scatter(train_x_sc[:,2], train_x_sc[:,3], c = cols, s = 60, edgecolor = 'k')

 

 

new_data의 가장 가까운 이웃 3개 확인

plt.scatter(train_x_sc[bestk,2], train_x_sc[bestk,3], c = kcols, s = 60, edgecolor = 'b', linewidth = 2);

 

 

 

728x90
반응형