CatBoost - 处理缺失值



缺失值意味着数据集中的某些数据不可用。这可能由于多种原因导致,例如数据收集错误或有意省略某些信息。为了构建准确的预测模型,我们必须谨慎地处理它们。在数据集中,典型的缺失值以两种方式表示,如下所述

  • NaN(非数字):在数值数据集中,NaN 通常用于表示缺失或未定义的值。IEEE 标准定义了 NaN,这是一种特定的浮点数,在 Python 等编程语言和 NumPy 等库中经常使用。

  • NULL 或 NA:在数据库系统和统计软件中,NULL 或 NA 可用于识别缺失值。这些仅仅是占位符,表示特定观察结果缺少数据。

CatBoost 处理缺失值

CatBoost 可以自行处理缺失值,因此您无需自行修复它们。以下是其工作原理以及如何使用它 -

1. 安装 CatBoost 库

首先,您必须确保是否已安装 CatBoost 库。如果尚未安装,则可以使用以下命令进行安装 -

pip install catboost

2. 导入库

安装后,您可以在模型中使用 CatBoost。因此,在您的代码中导入必要的库,如 NumPy、Pandas、Matplotlib、Seaborn 和 SKlearn 等,如下所示 -

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from catboost import CatBoostRegressor, Pool
from sklearn.metrics import mean_absolute_error, r2_score
from sklearn.model_selection import train_test_split

3. 加载数据集

现在,我们从系统目录加载数据集,这里我们使用房价数据集来实现模型。然后,我们将将其划分为训练集和测试集,并准备类别特征以在训练期间提供给 CatBoost。

# Load the dataset
data = pd.read_csv('/Python/Datasets/train.csv')
# Select features and target variable
features = data.columns.difference(['SalePrice']) # All columns except 'SalePrice'
target = 'SalePrice'

# Change categorical features to strings
categorical_features = data[features].select_dtypes(include=['object']).columns
for feature in categorical_features:
	data[feature] = data[feature].astype(str)

# Split data into features and target
X = data[features]
y = data[target]

# Split the data into training and testing datasets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Figure out categorical features 
categorical_features_indices = np.where(X.dtypes == 'object')[0]

此代码加载并准备房价数据集以进行建模。它将类别数据转换为字符串。然后将数据分成两部分:特征 (X) 和目标 (Y)。之后,数据被分成两个集合:训练集 (80%) 和测试集 (20%)。CatBoost 使用变量 categorical_features_indices 来找出哪些特征是类别特征,从而使其能够在训练期间正确地管理它们。

探索性数据分析

探索性数据分析 (EDA) 使我们能够更深入地了解数据集。

检查缺失值

这与本章非常相关,并且对任何数据集都有用。如果未正确处理缺失值,则会影响模型的预测。在这里,我们将看到数据集的哪些列具有缺失值,以及总数。

# Check for missing values
missing_values = data.isnull().sum().sort_values(ascending=False)
missing_values = missing_values[missing_values > 0]
print("\nMissing Values Columns:\n", missing_values)

输出

以下是模型的结果 -

Missing Values Columns:
 PoolQC              1453
MiscFeature     1406
Alley                  1369
Fence                1179
FireplaceQu     690
LotFrontage      259
GarageYrBlt       81
GarageCond     81
GarageType      81
GarageFinish    81
GarageQual      81
BsmtFinType2    38
BsmtExposure   38
BsmtQual           37
BsmtCond          37
BsmtFinType1     37
MasVnrArea        8
MasVnrType         8
Electrical              1
dtype: int64

为了检查 'data' DataFrame 中的缺失值,此代码对每一列的空值进行求和。然后打印列及其相应的计数,但仅限于缺失值大于零的列。这是通过根据缺失数据量按降序排列列来完成的。

CatBoost 处理类别不平衡

许多现实世界的应用依赖于不平衡的数据集,例如欺诈检测、医学诊断和收入损失预测。在这些情况下,与其他类别相比,一个类别被大大忽略了。这种差距会导致模型产生偏差,从而有利于主要类别,导致次要类别的性能低下。

在 CatBoost 中处理不平衡数据的方法

CatBoost 具有多种内置解决方案来处理不平衡的数据集。这包括 -

  • 自动类别权重

  • 平衡准确率指标

  • 过采样或欠采样

  • 使用 scale_pos_weight 参数

  • 提前停止

让我们来看一个现实生活中的例子,说明如何使用 CatBoost 处理不平衡的数据集,然后测试其性能。我们将使用合成数据集来评估不同方法的有效性。

自动类别权重

您可以为不同的类别分配不同的权重,以便为少数类别赋予更大的权重。这可以通过使用 CatBoost 的 class_weights 参数来实现,这有助于模型更多地关注少数类别。

catboost_params = {
   'iterations': 500,
   'learning_rate': 0.05,
   'depth': 6,
   'loss_function': 'Logloss',
   # Higher weight for minority class   
   'class_weights': [1, 10]  
}
model = CatBoostClassifier(**catboost_params)
model.fit(X_train, y_train)

平衡准确率指标

使用调整不平衡数据的评估方法非常重要。可以使用平衡准确率指标来评估模型,该指标同时考虑了两个类别。

from sklearn.metrics import balanced_accuracy_score

y_pred = model.predict(X_test)
balanced_acc = balanced_accuracy_score(y_test, y_pred)
print("Balanced Accuracy:", balanced_acc)

过采样或欠采样

在训练模型之前,您可以对少数类别进行过采样或对多数类别进行欠采样以平衡数据集。合成少数过采样技术 (SMOTE) 是一种可以用来为少数类别创建合成样本的技术。

from imblearn.over_sampling import SMOTE

sm = SMOTE()
X_resampled, y_resampled = sm.fit_resample(X_train, y_train)

model = CatBoostClassifier(iterations=500, learning_rate=0.05, depth=6)
model.fit(X_resampled, y_resampled)

使用 scale_pos_weight 参数

当数据集非常不平衡时,此参数非常有用。它基本上调整了少数类别的损失函数以减少不平衡。

catboost_params = {
   'iterations': 500,
   'learning_rate': 0.05,
   'depth': 6,
   'loss_function': 'Logloss',
   # Increase for the minority class
   'scale_pos_weight': 10  
}
model = CatBoostClassifier(**catboost_params)
model.fit(X_train, y_train)

提前停止

在高度不平衡的数据集中,提前停止在防止模型过度拟合到多数类别方面非常有帮助。

model = CatBoostClassifier(iterations=500, learning_rate=0.05, depth=6)
model.fit(X_train, y_train, eval_set=(X_val, y_val), early_stopping_rounds=50)
广告