안녕하세요? 이번 글은 spatial-kfold 플러그인에 관해 간략히 소개해 보겠습니다.
spatial-kfold는 공간 연구에서 보다 견고한, 신뢰성 있는 교차 검증을 보장하기 위해 공간 리샘플링(spatial resampling)을 수행하는 파이썬 라이브러리입니다.
이 패키지는 사용자 친화적인 매개변수를 통해 공간 클러스터링과 블록 리샘플링 기법을 제공하여 리샘플링 과정을 사용자 맞춤형으로 조정할 수 있습니다. 또한 새로운 위치에서 모델의 일반화 성능을 평가하는데 우용한 Leave Region Out 교차 검증을 수행할 수 있으며, 공간 연구에서 피처 선택 및 하이퍼파라미터 튜닝의 신뢰성을 향상시키는데 기여합니다.
spatial-kfold는 scikit-learn의 LeaveOneGroupOut 교차 검증 기법과 쉽게 통합할 수 있습니다. 이를 통해 리샘플링된 공간 데이터를 활용하여 더욱 효과적으로 피처 선택과 하이퍼 파라미터 튜닝을 수행할 수 있습니다.
spatial-kfold는 두 가지 공간 리샘플링 기법을 사용하여 Leave Region Out 교차 검증을 수행할 수 있습니다.
- KMeans 또는 BisectingKMeans를 이용한 공간 클러스터링(Spatial clusting)
- 공간 블록(Spatial blocks)
여기서는 공간 블록 기능을 실습해 보겠습니다.
먼저 spatial-kfold를 설치합니다.
!pip install spatial-kfold
자, 공간 블록을 생성해 보겠습니다. 여기서 gdf는 블록 생성을 위해 사용할 포인트를 포함하는 GeoDataFrame를 나타냅니다. 종 분포 모델(SDM)이라면 출현/배경 또는 출현/부재 데이터가 될 수 있습니다. width와 height는 격자 셀의 너비와 높이를, method는 폴드를 할당할 때 사용할 방법으로 여기서는 'random'을 선택했습니다. nfolds는 폴드의 수, 그리고 random_state는 셔플된 격자 셀을 재현하기 위해 사용하는 정수 시드값입니다.
from spatialkfold.blocks import spatial_blocks
# 공간 블록 생성
rnd_blocks = spatial_blocks(gdf, width=50000, height=50000,
method='random', nfolds=10,
random_state=135)
다음으로 공간 블록으로 포인트를 리샘플링합니다. folds라는 필드가 생성되었고 해당 값은 1부터 10까지 폴드 정보가 포함되어 있습니다.
# 공간 블록으로 포인트 리샘플링
res_rnd_blk = gpd.overlay(gdf, rnd_blocks)
res_rnd_blk.head(1)
# folds 필드 고유값 출력
unique_folds = res_rnd_blk['folds'].unique()
print("Unique values in the 'folds' field:", unique_folds)
Unique values in the 'folds' field: [ 4 10 1 6 9 5 2 3 7 8]
공간 블록을 시각화해 본 결과는 다음과 같습니다.
from matplotlib import cm
color_ramp = cm.get_cmap('tab20')
# 공간 블록 시각화
fig, ax = plt.subplots(1,2 , figsize=(10, 6))
# plot 1
rnd_blocks.plot(column='folds',cmap=color_ramp, ax=ax[0] ,lw=0.7, legend=False)
gdf.plot(ax=ax[0], markersize = 1, color = 'r')
ax[0].set_title('Random Blocks Folds')
# plot 2
rnd_blocks.plot(facecolor="none",edgecolor='grey', ax=ax[1] ,lw=0.7, legend=False)
res_rnd_blk.plot(column='folds', cmap=color_ramp, legend=False, ax=ax[1], markersize=3)
ax[1].set_title('Spatially Resampled\nrandom blocks')
이어서 LOGO 교차 검증은 아래 코드와 같이 훈련과 시험 데이터를 분할해서 진행하시면 되겠습니다. 여기까지 spatial-kfold 플러그인 사용법에 관해 간략히 확인해 봤습니다.
from sklearn.model_selection import LeaveOneGroupOut
# LOGO 교차 검증 객체 생성
logo = LeaveOneGroupOut()
# folds 필드 값 가져오기
groups = res_rnd_blk['folds'].values
# AUC-ROC 점수를 저장할 리스트
auc_scores = []
# LOGO 교차 검증 진행
for train_idx, test_idx in logo.split(res_rnd_blk, groups=groups):
# 훈련 데이터와 시험 데이터 나누기
train_data = res_rnd_blk.iloc[train_idx]
test_data = res_rnd_blk.iloc[test_idx]
...