오늘은 XGBoost 모델을 사용하려고 했는데 예상치 못한 오류가 발생했다. 오류 메시지는 다음과 같았다: ValueError: DataFrame.dtypes for data must be int, float, bool or category. When categorical type is supplied, the experimental DMatrix parameter`enable_categorical` must be set to `True`. Invalid columns: gene: object, value: object 처음에는 당황스러웠다. genevalue 열이 object 타입으로 되어 있어서 XGBoost가 이걸 처리하지 못한 게 문제였다. 이 문제를 해결하려면 범주형 데이터를 숫자 값으로 변환해야 했다.

첫 번째 해결 방법: 범주형 데이터 인코딩우선, 범주형 데이터를 숫자로 변환하는 방법으로 OrdinalEncoder를 사용하기로 했다. 범주형 데이터를 순서에 따라 숫자로 바꾸는 간단한 방식이다. 이걸로 genevalue 열을 변환해봤다.

# gene과 value 열에 대해 OrdinalEncoder 적용ordinal_encoder = OrdinalEncoder(handle_unknown='use_encoded_value', unknown_value=-1)
# X_encoded에서 gene과 value 컬럼 인코딩categorical_columns = ['gene', 'value']  # 범주형 컬럼 설정X_encoded[categorical_columns] = ordinal_encoder.fit_transform(X_encoded[categorical_columns])
# 변환된 데이터 확인print(X_encoded.dtypes)```
`OrdinalEncoder`를 적용한 후 `gene`과 `value` 열이 숫자로 변환된 걸 확인했다. 이제 `object` 타입의 문제는 해결된 것 같았다.
### 두 번째 해결 방법: XGBoost의 `enable_categorical` 옵션 설정XGBoost에서 범주형 데이터를 처리할 때, 1.5.0 버전 이상에서는 `enable_categorical=True` 옵션을 사용할 수 있다는 사실을 알게 되었다. 그래서 데이터를 `DMatrix`로 변환하면서 이 옵션을 활성화했다. 이렇게 하면 범주형 데이터도 `category` 형식으로 처리할 수 있다.
```pythonimport xgboost as xgb
# XGBoost DMatrix로 변환dtrain = xgb.DMatrix(X_encoded, label=y_subclass_single_gene, enable_categorical=True)
# 모델 학습 또는 예측predictions = model.predict(dtrain)```
이 코드 덕분에, 범주형 데이터를 별도로 숫자로 변환하지 않고도 `DMatrix` 내에서 직접 처리할 수 있었다. `enable_categorical=True` 옵션을 활성화하는 것만으로 문제를 해결할 수 있어서 아주 효율적이었다.
### 오늘의 결론오늘은 범주형 데이터를 처리하는 방법을 깊이 이해하게 됐다. 처음엔 단순하게 `OrdinalEncoder`로 변환하려고 했지만, XGBoost의 `enable_categorical` 옵션을 발견한 후로 더 간단하게 해결할 수 있었다. 결과적으로, 데이터 타입과 범주형 데이터의 처리 방식이 모델의 성능과 학습에 큰 영향을 미친다는 점을 다시 한번 깨달았다. 
조금씩 모델을 다루는 데 익숙해져가고 있는 것 같아 기분이 좋다.