기술나눔

Python28-11 CatBoost 그래디언트 부스팅 알고리즘

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

그림

CatBoost (Categorical Boosting)은 Yandex(검색 엔진이 한때 러시아 시장 점유율의 60% 이상을 차지했으며 기타 인터넷 제품 및 서비스도 제공하는 러시아 인터넷 회사)에서 개발한 그래디언트 부스팅을 기반으로 하는 기계 학습 알고리즘입니다. CatBoost는 범주형 기능을 처리하는 데 특히 뛰어나며 과적합 및 데이터 유출 문제를 효과적으로 방지할 수 있습니다. CatBoost의 전체 이름은 "Categorical Boosting"입니다. 이는 다수의 범주형 기능이 포함된 데이터를 처리할 때 더 나은 성능을 발휘하도록 설계되었습니다.

CatBoost 기능

  1. 범주형 특성 처리: CatBoost는 별도의 인코딩(예: 원-핫 인코딩) 없이 범주형 기능을 직접 처리할 수 있습니다.

  2. 과적합 방지: CatBoost는 카테고리 특성을 처리하는 새로운 방법을 채택하여 과적합을 효과적으로 줄여줍니다.

  3. 능률: CatBoost는 훈련 속도와 예측 속도 모두에서 좋은 성능을 발휘합니다.

  4. CPU 및 GPU 훈련 지원: CatBoost는 CPU에서 실행되거나 가속 훈련을 위해 GPU를 사용할 수 있습니다.

  5. 결측값 자동 처리: CatBoost는 추가적인 전처리 단계 없이 결측값을 자동으로 처리할 수 있습니다.

CatBoost의 핵심 원칙

CatBoost의 핵심 원리는 GBDT(Gradient Boosting Decision Tree)를 기반으로 하지만 범주형 기능을 처리하고 과적합을 방지하는 데 혁신적입니다. 다음은 몇 가지 주요 기술 사항입니다.

  1. 카테고리 특성 처리

    • CatBoost는 카테고리의 평균을 기반으로 새로운 기능을 계산하기 위해 "평균 인코딩"이라는 방법을 도입합니다.

    • '타겟 인코딩'이라는 기술을 이용해 범주형 특성을 수치형 특성으로 변환할 때 타겟 값의 평균을 사용함으로써 데이터 유출 위험을 줄인다.

    • 학습 과정에서는 목표 변수를 직접 인코딩하지 않도록 통계 정보를 사용하여 데이터를 처리합니다.

  2. 주문형 부스팅

    • 데이터 누출 및 과적합을 방지하기 위해 CatBoost는 훈련 중에 데이터를 질서 있게 처리합니다.

    • 순서 부스팅은 훈련 중에 데이터를 무작위로 섞는 방식으로 작동하며, 모델이 특정 순간의 과거 데이터만 보고 결정을 내리는 데 미래 정보를 사용하지 않도록 합니다.

  3. 전산 최적화

    • CatBoost는 사전 계산 및 캐싱을 통해 기능 계산 프로세스를 가속화합니다.

    • CPU 및 GPU 교육을 지원하며 대규모 데이터 세트에서 우수한 성능을 발휘할 수 있습니다.

CatBoost의 기본 사용

다음은 분류 작업에 CatBoost를 사용하는 기본 예입니다. 우리는 기계 학습 및 통계 분석에 일반적으로 사용되는 고전적인 회귀 문제 데이터 세트인 Auto MPG(Miles Per Gallon) 데이터 세트를 사용합니다. 이 데이터 세트는 다양한 자동차 모델의 연비(즉, 갤런당 마일)뿐만 아니라 기타 여러 관련 특성을 기록합니다.

데이터 세트 특성:

  • mpg: 갤런당 마일(목표 변수).

  • 실린더: 엔진의 실린더 수를 나타내는 실린더 수입니다.

  • 배수량: 엔진 배기량(입방인치)입니다.

  • 마력: 엔진 출력(마력).

  • 무게: 차량 중량(파운드)입니다.

  • 가속: 0에서 60mph까지의 가속 시간(초)입니다.

  • 모델 연도: 차량 생산연도.

  • 기원: 차량 원산지(1=미국, 2=유럽, 3=일본).

데이터 세트의 처음 몇 행:

  1.     mpg  cylinders  displacement  horsepower  weight  acceleration  model_year  origin
  2. 0  18.0          8         307.0       130.0  3504.0          12.0          70       1
  3. 1  15.0          8         350.0       165.0  3693.0          11.5          70       1
  4. 2  18.0          8         318.0       150.0  3436.0          11.0          70       1
  5. 3  16.0          8         304.0       150.0  3433.0          12.0          70       1
  6. 4  17.0          8         302.0       140.0  3449.0          10.5          70       1

코드 예:

  1. import pandas as pd  # 导入Pandas库,用于数据处理
  2. import numpy as np  # 导入Numpy库,用于数值计算
  3. from sklearn.model_selection import train_test_split  # 从sklearn库导入train_test_split,用于划分数据集
  4. from sklearn.metrics import mean_squared_error, mean_absolute_error  # 导入均方误差和平均绝对误差,用于评估模型性能
  5. from catboost import CatBoostRegressor  # 导入CatBoost库中的CatBoostRegressor,用于回归任务
  6. import matplotlib.pyplot as plt  # 导入Matplotlib库,用于绘图
  7. import seaborn as sns  # 导入Seaborn库,用于绘制统计图
  8. # 设置随机种子以便结果复现
  9. np.random.seed(42)
  10. # 从UCI机器学习库加载Auto MPG数据集
  11. url = "http://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data"
  12. column_names = ['mpg''cylinders''displacement''horsepower''weight''acceleration''model_year''origin']
  13. data = pd.read_csv(url, names=column_names, na_values='?', comment='t', sep=' ', skipinitialspace=True)
  14. # 查看数据集的前几行
  15. print(data.head())
  16. # 处理缺失值
  17. data = data.dropna()
  18. # 特征和目标变量
  19. = data.drop('mpg', axis=1)  # 特征变量
  20. = data['mpg']  # 目标变量
  21. # 将类别特征转换为字符串类型(CatBoost可以直接处理类别特征)
  22. X['cylinders'= X['cylinders'].astype(str)
  23. X['model_year'= X['model_year'].astype(str)
  24. X['origin'= X['origin'].astype(str)
  25. # 将数据集划分为训练集和测试集
  26. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2random_state=42)
  27. # 定义CatBoost回归器
  28. model = CatBoostRegressor(
  29.     iterations=1000,  # 迭代次数
  30.     learning_rate=0.1,  # 学习率
  31.     depth=6,  # 决策树深度
  32.     loss_function='RMSE',  # 损失函数
  33.     verbose=100  # 输出训练过程信息
  34. )
  35. # 训练模型
  36. model.fit(X_train, y_train, eval_set=(X_test, y_test), early_stopping_rounds=50)
  37. # 进行预测
  38. y_pred = model.predict(X_test)
  39. # 评估模型性能
  40. mse = mean_squared_error(y_test, y_pred)  # 计算均方误差
  41. mae = mean_absolute_error(y_test, y_pred)  # 计算平均绝对误差
  42. # 打印模型的评估结果
  43. print(f'Mean Squared Error (MSE): {mse:.4f}')
  44. print(f'Mean Absolute Error (MAE): {mae:.4f}')
  45. # 绘制真实值与预测值的对比图
  46. plt.figure(figsize=(106))
  47. plt.scatter(y_test, y_pred, alpha=0.5)  # 绘制散点图
  48. plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], '--k')  # 绘制对角线
  49. plt.xlabel('True Values')  # X轴标签
  50. plt.ylabel('Predictions')  # Y轴标签
  51. plt.title('True Values vs Predictions')  # 图标题
  52. plt.show()
  53. # 特征重要性可视化
  54. feature_importances = model.get_feature_importance()  # 获取特征重要性
  55. feature_names = X.columns  # 获取特征名称
  56. plt.figure(figsize=(106))
  57. sns.barplot(x=feature_importances, y=feature_names)  # 绘制特征重要性条形图
  58. plt.title('Feature Importances')  # 图标题
  59. plt.show()
  60. # 输出
  61. '''
  62. mpg  cylinders  displacement  horsepower  weight  acceleration  
  63. 0  18.0          8         307.0       130.0  3504.0          12.0   
  64. 1  15.0          8         350.0       165.0  3693.0          11.5   
  65. 2  18.0          8         318.0       150.0  3436.0          11.0   
  66. 3  16.0          8         304.0       150.0  3433.0          12.0   
  67. 4  17.0          8         302.0       140.0  3449.0          10.5   
  68.    model_year  origin  
  69. 0          70       1  
  70. 1          70       1  
  71. 2          70       1  
  72. 3          70       1  
  73. 4          70       1  
  74. 0: learn: 7.3598113 test: 6.6405869 best: 6.6405869 (0) total: 1.7ms remaining: 1.69s
  75. 100: learn: 1.5990203 test: 2.3207830 best: 2.3207666 (94) total: 132ms remaining: 1.17s
  76. 200: learn: 1.0613606 test: 2.2319632 best: 2.2284239 (183) total: 272ms remaining: 1.08s
  77. Stopped by overfitting detector  (50 iterations wait)
  78. bestTest = 2.21453232
  79. bestIteration = 238
  80. Shrink model to first 239 iterations.
  81. Mean Squared Error (MSE): 4.9042
  82. Mean Absolute Error (MAE): 1.6381
  83. <Figure size 1000x600 with 1 Axes>
  84. <Figure size 1000x600 with 1 Axes>
  85. '''

평균 제곱 오차(MSE) : 평균 제곱 오차. 예측 값과 실제 값 간의 평균 제곱 차이를 나타냅니다. 값이 작을수록 모델 성능이 향상되며, 여기서 MSE 값은 4.9042입니다.

평균 절대 오차(MAE) : 평균절대오차. 예측값과 실제값의 평균절대차를 나타냅니다. 값이 작을수록 모델 성능이 향상되며, 여기서 MAE 값은 1.6381입니다.

그림

  1. 산포도 : 그래프의 각 점은 테스트 샘플을 나타냅니다. 가로축은 샘플의 실제 값(MPG)을 나타내고, 세로축은 모델의 예측값(MPG)을 나타냅니다.

  2. 대각선: 그림의 검은색 점선은 45도 대각선으로 이상적인 조건에서의 예측 결과, 즉 예측값이 참값과 동일함을 나타냅니다.

  3. 포인트 분배:

    • 대각선에 가깝다: 모델의 예측값이 참값에 매우 가깝고 예측이 정확함을 나타냅니다.

    • 대각선에서 멀리 떨어지세요: 예측값과 실제값 사이에 큰 차이가 있어 예측이 부정확함을 나타냅니다.

그림의 점들을 보면 대부분의 점들이 대각선 근처에 집중되어 있는 것을 볼 수 있는데, 이는 모델의 예측 성능이 좋은 것을 의미하지만, 대각선에서 멀리 떨어져 있는 점들도 있다는 것을 알 수 있습니다. 이러한 샘플의 예측 값과 실제 값 사이에는 일정한 간격이 있습니다.

그림

  1. 막대 차트 : 각 막대는 모델의 기능의 중요성을 나타냅니다. 막대가 길수록 모델 예측에 대한 특성의 기여도가 높아집니다.

  2. 기능 이름: Y축에 모든 지형지물의 이름을 나열합니다.

  3. 기능 중요도 값: X축에 각 특성의 상대적 중요도 값을 표시합니다.

그림에서 볼 수 있듯이:

  1. 모델 연도: 모든 특성 중에서 가장 중요한 것으로, 자동차 생산 연도가 예상 연비에 큰 영향을 미친다는 것을 나타냅니다.

  2. 무게: 자동차의 무게는 두 번째로 중요한 특성이며 연비에도 큰 영향을 미칩니다.

  3. 배수량그리고마력: 엔진의 배기량과 출력 역시 연비에 크게 기여합니다.

이 예에서는 CatBoost를 사용하여 Auto MPG 데이터세트를 처리합니다. 이 데이터세트의 주요 목적은 자동차의 연료 효율성(예: 갤런당 마일, MPG)을 예측하기 위한 회귀 모델을 구축하는 것입니다.

위 내용은 인터넷에서 요약한 내용입니다. 도움이 되셨다면 다음에 또 만나요!