소개
이 실습에서는 KNeighborsClassifier 를 사용하기 전에 k-최근접 이웃을 미리 계산하는 방법을 보여줍니다. KNeighborsClassifier 는 내부적으로 최근접 이웃을 계산할 수 있지만, 미리 계산하면 매개변수 제어를 세밀하게 조정하거나 여러 번 사용할 때 캐싱하거나 사용자 정의 구현을 할 수 있는 등 여러 가지 이점이 있습니다. 여기서는 파이프라인의 캐싱 기능을 사용하여 KNeighborsClassifier 의 여러 적합 (fit) 사이에 최근접 이웃 그래프를 캐싱합니다.
VM 팁
VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 연습을 위한 Jupyter Notebook에 접근할 수 있습니다.
때때로 Jupyter Notebook 이 완전히 로드되기까지 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제약으로 인해 작업의 유효성 검사를 자동화할 수 없습니다.
학습 중 문제가 발생하면 Labby 에 문의하십시오. 세션 후 피드백을 제공하면 문제를 신속하게 해결해 드리겠습니다.
라이브러리 가져오기
이 단계에서는 필요한 모든 라이브러리를 가져옵니다.
from tempfile import TemporaryDirectory
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsTransformer, KNeighborsClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_digits
from sklearn.pipeline import Pipeline
데이터 로드
이 단계에서는 scikit-learn 에서 숫자 데이터셋을 로드합니다.
X, y = load_digits(return_X_y=True)
n_neighbors_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
최근접 이웃 그래프 계산
이 단계에서는 KNeighborsTransformer 를 사용하여 최근접 이웃 그래프를 계산합니다.
## 변환기는 그리드 검색에서 필요한 최대 이웃 수를 사용하여 최근접 이웃 그래프를 계산합니다. 분류기 모델은 자체 n_neighbors 매개변수에 따라 필요에 따라 최근접 이웃 그래프를 필터링합니다.
graph_model = KNeighborsTransformer(n_neighbors=max(n_neighbors_list), mode="distance")
분류기 모델 정의
이 단계에서는 KNeighborsClassifier 모델을 정의합니다.
classifier_model = KNeighborsClassifier(metric="precomputed")
최근접 이웃 그래프 캐싱
이 단계에서는 파이프라인의 캐싱 기능을 사용하여 KNeighborsClassifier 의 여러 적합 과정에서 최근접 이웃 그래프를 캐싱합니다.
## 하이퍼파라미터 튜닝 시 여러 번 사용될 그래프 계산 결과를 캐싱하기 위해 `memory` 에 디렉토리를 지정합니다.
with TemporaryDirectory(prefix="sklearn_graph_cache_") as tmpdir:
full_model = Pipeline(
steps=[("graph", graph_model), ("classifier", classifier_model)], memory=tmpdir
)
하이퍼파라미터 튜닝
이 단계에서는 GridSearchCV 를 사용하여 분류기의 하이퍼파라미터를 튜닝합니다.
param_grid = {"classifier__n_neighbors": n_neighbors_list}
grid_model = GridSearchCV(full_model, param_grid)
grid_model.fit(X, y)
결과 시각화
이 단계에서는 그리드 검색 결과를 시각화합니다.
## 그리드 검색 결과를 플롯합니다.
fig, axes = plt.subplots(1, 2, figsize=(8, 4))
axes[0].errorbar(
x=n_neighbors_list,
y=grid_model.cv_results_["mean_test_score"],
yerr=grid_model.cv_results_["std_test_score"],
)
axes[0].set(xlabel="n_neighbors", title="분류 정확도")
axes[1].errorbar(
x=n_neighbors_list,
y=grid_model.cv_results_["mean_fit_time"],
yerr=grid_model.cv_results_["std_fit_time"],
color="r",
)
axes[1].set(xlabel="n_neighbors", title="적합 시간 (캐싱 포함)")
fig.tight_layout()
plt.show()
요약
이 실험에서는 파이프라인의 캐싱 기능을 활용하여 KNeighborsClassifier 에 사용하기 전에 k-최근접 이웃을 미리 계산하는 방법을 배웠습니다. 또한 GridSearchCV 를 사용하여 분류기의 하이퍼파라미터를 튜닝하고 결과를 시각화하는 방법도 학습했습니다.