본문 바로가기
코딩 독학/ICT COG Academy 2기

[22일차] KNN 분류, 회귀모델

by 효니루 2020. 11. 11.
from sklearn.neighbors import KNeighborsRegressor
X, Y = mglearn.datasets.make_wave(n_samples=40)
X_train,X_test, y_train, y_test = train_test_split(X, Y, random_state=0)
reg = KNeighborsRegressor(n_neighbors=3)
reg.fit(X_train, y_train)
print(reg.predict([[3]]))
print(reg.score(X_test, y_test))

[0.91241374]
0.8344172446249605

✔ 본 포스팅은 ICT COG Academy의 기본반 0일차 강의를 정리한 내용입니다.

 


1.0 mglearn

import mglearn
# mglearn의 make_forge 데이터셋을 활용한 분류모델
X, y = mglearn.datasets.make_forge()  
plt.scatter(X[:,0], X[:, 1], c=y, s=60, cmap=mglearn.cm2)
plt.show()
# mglearn의 make_forge 데이터셋을 활용한 회귀모델
X, y = mglearn.datasets.make_wave(n_samples=40) 
plt.plot(X, y, 'o')
plt.show()

2.0 KNN 도입

  • test data가 가장 가까운 train data의 그룹으로 분류된다.
  • 가장 가까운 k개의 그룹 중, 다수결로 분류된다.
  • 가까운 정도는 유클리드거리(L1 distance)로 계산한다.
  • 특성이 다른 변수라면, 단순한 유클리드 거리상으로 비교가 안 되므로 데이터전처리로 표준화가 필요하다.

2.1 KNN - 분류

(1) KNN의 K에 따라 분류선의 변화 확인

  • 코드

⇒ k가 커질수록, 분류선은 완만, 일반화됨.

(2) K에 따른 train, test data 의 분류정확도

  • 코드
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target,
                                                   stratify = cancer.target, random_state=11)
# stratify = y : 원래 데이터레이블 분포와 유사하게 추출하기 위해
# 데이터를 계층으로 나누고 추출
train_score, test_score = [], []
K = range(1, 11)  # KNN 을 1~10까지
for k in K:
    knn = KNeighborsClassifier(n_neighbors=k).fit(X_train, y_train)
    train_score.append(knn.score(X_train, y_train))
    test_score.append(knn.score(X_test, y_test))
    
plt.plot(K, train_score, label='train')
plt.plot(K, test_score, label='test')
plt.legend()
plt.xlabel('k: 1~10')
plt.grid()
plt.show()

⇒ K가 커질수록 train data 분류정확도는 떨어지나, test data 분류정확도는 올라간다. 과적합을 줄임.

2.2 KNN - 회귀

(0) 회귀모델 설명

(0)-1. 정의 : 종속변수의 특성을 가장 잘 나타낼 수 있는 예측모델 (선형 or 비선형 함수)을 구해 독립변수를 예측.

ex) (공부시간, 성적) 데이터를 나타내는 예측모델을 구하기

(0)-2. 종류

선형 회귀 모델 (선형: 수식이 직선)

선형 회귀 (LinearRegression) 모델, 라쏘 (Lasso) 모델, 릿지 (Ridge) 모델

비선형 회귀 모델 (비선형: 수식이 곡선)

k-최근접 이웃 (KNeighborsRegressor) 모델 , 의사 결정 나무 (DecisionTreeRegressor) 모델 , 서포트 벡터 머신 (SVR) 모델

(1) KNN Regressor 로 회귀모델 구하기

  • 코드

from sklearn.neighbors import KNeighborsRegressor
X, Y = mglearn.datasets.make_wave(n_samples=40)
X_train,X_test, y_train, y_test = train_test_split(X, Y, random_state=0)
reg = KNeighborsRegressor(n_neighbors=3)
reg.fit(X_train, y_train)
print(reg.predict([[3]]))
print(reg.score(X_test, y_test))

[0.91241374]
0.8344172446249605
fig, axes = plt.subplots(1, 3, figsize=(15, 4))
line = np.linspace(-3, 3, 1000).reshape(-1, 1)
for k, ax in zip([1, 3, 9], axes):
    reg = KNeighborsRegressor(n_neighbors=k).fit(X,Y)
    ax.plot(X,Y,'o', color='r')
    ax.plot(line, reg.predict(line), color='#00D9FF')
    
plt.show()

 

 

 

 


댓글