라떼군 이야기


Scikit-learn과 XGBoost 사용 시 발생하는 '__sklearn_tags__' 에러 원인과 해결 방법

Problem

머신러닝 모델을 개발할 때 Scikit-learn의 RandomizedSearchCVGridSearchCV를 사용하여 XGBoost 모델(XGBRegressor 등)의 하이퍼파라미터를 튜닝하는 것은 매우 일반적인 패턴입니다. 하지만 최근 환경에서 모델 학습을 위해 .fit() 메서드를 호출하면 'super' object has no attribute '__sklearn_tags__'라는 AttributeError가 발생하는 경우가 있습니다. 파이썬 버전이나 라이브러리가 모두 최신임에도 불구하고 갑작스럽게 학습이 중단되어 많은 개발자들이 당황하게 되는 문제입니다.

Background

이 문제의 근본적인 원인은 Scikit-learn과 XGBoost 간의 버전 호환성 및 내부 API 변경에 있습니다. Scikit-learn은 모델(Estimator)의 특성(예: 희소 행렬 지원 여부 등)을 정의하기 위해 내부적으로 ’tags’라는 시스템을 사용합니다. 최근 릴리스된 Scikit-learn 1.6.0 버전에서는 이 태그 관련 API에 큰 구조적 변경이 있었습니다. 반면, 기존에 설치된 XGBoost 버전은 변경되기 이전의 Scikit-learn API를 참조하고 있었기 때문에, 상속받은 부모 클래스(super)에서 새로운 __sklearn_tags__ 속성을 찾지 못해 충돌이 발생한 것입니다.

Solution

이 문제는 라이브러리의 버전을 조정하여 해결할 수 있으며, 프로젝트 상황에 따라 다음 세 가지 방법 중 하나를 선택할 수 있습니다.

1. XGBoost 버전 업그레이드 (가장 권장됨)

XGBoost 개발팀은 이 호환성 문제를 인지하고 버전 2.1.4에서 Scikit-learn의 새로운 태그 시스템에 맞게 패치를 진행했습니다. 따라서 XGBoost를 최신 버전으로 업데이트하는 것이 가장 깔끔한 해결책입니다.

# XGBoost를 2.1.4 이상의 버전으로 업그레이드합니다.
pip install --upgrade xgboost>=2.1.4

2. Scikit-learn 버전 다운그레이드 (안정적인 레거시 환경 필요 시)

기존 프로젝트의 다른 의존성 때문에 XGBoost를 당장 업그레이드하기 어렵거나, Scikit-learn 1.5.x 버전의 기능만으로 충분하다면 Scikit-learn 버전을 1.6.0 미만으로 낮추는 것도 확실한 방법입니다.

# 기존 scikit-learn을 삭제하고 1.5.2 버전을 설치합니다.
pip uninstall -y scikit-learn
pip install scikit-learn==1.5.2

3. Scikit-learn 1.6.1 이상으로 업데이트 (경고 메시지 허용 시)

Scikit-learn 측에서도 1.6.0의 급격한 API 변경으로 인한 생태계의 혼란을 줄이기 위해, 1.6.1 버전부터는 해당 에러를 DeprecationWarning 수준으로 낮추었습니다. (단, 1.7 버전에서는 다시 에러로 바뀔 예정입니다.)

# scikit-learn을 1.6.1 이상으로 업데이트합니다.
pip install --upgrade scikit-learn>=1.6.1

주의: 세 번째 방법을 사용하면 모델 학습은 정상적으로 진행되지만, 콘솔에 향후 지원이 중단된다는 경고 메시지가 출력될 수 있습니다.

Deep Dive

머신러닝 프로젝트를 프로덕션 환경에 배포할 때는 라이브러리 간의 의존성 충돌을 방지하기 위해 requirements.txtpoetry 등을 사용하여 버전을 명확히 고정(Pinning)하는 것이 매우 중요합니다. 특히 Scikit-learn과 같이 생태계의 중심에 있는 라이브러리의 메이저/마이너 버전이 올라갈 때는 XGBoost, LightGBM 등 이에 의존하는 타 라이브러리의 릴리스 노트를 함께 확인하는 습관을 가져야 합니다. 또한, 콘솔에 DeprecationWarning이 발생한다면 이를 단순히 무시하지 말고, 다음 메이저 업데이트(예: Scikit-learn 1.7)가 오기 전에 코드나 라이브러리 버전을 선제적으로 마이그레이션하는 것이 기술 부채를 줄이는 베스트 프랙티스입니다.

Conclusion

__sklearn_tags__ 에러는 Scikit-learn 1.6.0의 내부 API 변경과 XGBoost 간의 버전 불일치로 인해 발생하는 호환성 문제입니다. 가장 권장되는 방법은 XGBoost를 2.1.4 이상으로 업그레이드하는 것이며, 프로젝트의 의존성 상황에 따라 Scikit-learn을 1.5.2로 다운그레이드하여 안정적으로 에러를 해결할 수도 있습니다.

References

프리랜서로 제품 기획과 개발을 맡길 파트너가 필요하신가요? 개인, 팀, 기업 누구나 의뢰할 수 있으며 문제 정의부터 출시까지 함께합니다.