GIS

Python: spatial-kfold 플러그인 소개

유병혁 2024. 10. 2. 01:58

안녕하세요? 이번 글은 spatial-kfold 플러그인에 관해 간략히 소개해 보겠습니다.

 

spatial-kfold

spatial-kfold: A Python Package for Spatial Resampling Toward More Reliable Cross-Validation in Spatial Studies.

pypi.org

 

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]
    ...