数据是任何分析或机器学习的基础。然而,现实世界的数据集并不完美,它们经常包含缺失值,这可能导致任何算法的训练阶段出现错误。处理缺失值至关重要,因为它们可能会导致数据分析和机器学习模型中出现偏差或不准确的结果。处理缺失值的策略包括插补(用估计值或计算值替换缺失值)、删除不完整的记录或使用多重插补等高级技术。处理缺失值是数据清理和准备的一个重要方面,以确保强大和可靠的分析。在本文中,我们将讨论如何使用CatBoost模型处理缺失值。
什么是CatBoost
CatBoost(categorical boosting)是由俄罗斯跨国IT公司Yandex开发的机器学习算法。这种特殊的boosting算法基于梯度提升框架,通过结合有序提升,不经意树和分类变量的高级处理等技术,可以比其他传统的梯度提升算法更有效地处理分类特征,从而以最小的超参数调整实现高性能。CatBoost还有一个内置的超参数(nan_mode)来处理数据集中存在的缺失值,这有助于我们非常有效地处理数据集,而无需执行其他数据预处理。
什么是缺失值?
缺失值是指数据集中某些观测或变量的数据缺失。这些缺失值的出现可能有各种原因,从数据收集过程中的错误到故意遗漏。我们需要非常小心地处理它们,以实现准确的预测模型。常见的缺失值在数据集中以两种方式表示,下面将进行讨论:
-
NaN(Not a Number):在数值数据集中,NaN通常用于表示缺失或未定义的值。NaN是IEEE标准定义的特殊浮点值,通常用于Python等编程语言和NumPy等库。
-
NULL或NA:在数据库系统或统计软件中,NULL或NA可用于表示缺失值。这些只是占位符,表示特定观察数据的缺失。
使用CatBoost处理缺失值
1.导入所需的库
现在我们将导入所有需要的Python库,如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
2.数据集加载
现在我们从Kaggle加载一个数据集。然后,我们将其分为训练集和测试集(80:20),并准备分类特征,这些特征将在训练期间提供给CatBoost。
# Load the Kaggle House Prices dataset
data = pd.read_csv('train.csv') # https://www.kaggle.com/c/house-prices-advanced-regression-techniques/data?select=train.csv
# Choose features and target variable
features = data.columns.difference(['SalePrice']) # All columns except 'SalePrice'
target = 'SalePrice'
# Convert 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 sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Find categorical features for CatBoost
categorical_features_indices = np.where(X.dtypes == 'object')[0]
Kaggle House Prices数据集已加载并准备好使用这行代码建模。在将分类特征转换为字符串之后,数据被划分为特征(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("\nColumns with missing values:\n", missing_values)
输出
Columns with missing values:
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中的缺失值。然后打印列及其相应的计数,但仅针对缺失值大于零的列。这是通过根据缺失值的数量以降序对列进行排序来实现的。
目标变量分布
可视化目标变量的值分布有助于我们了解数据集是否存在任何潜在的错误。在我们的数据集中,目标变量是’SalePrice’。
plt.figure(figsize=(7, 4))
sns.histplot(data['SalePrice'], kde=True, color='forestgreen')
plt.title('Distribution of SalePrice')
plt.show()
使用Seaborn,此代码生成一个直方图,显示’data’ DataFrame中’SalePrice’变量的分布。当添加kde=True参数时,直方图获得数据分布的平滑描述,从而添加核密度估计图。
模型训练
# Create CatBoost pools for training and testing
train_pool = Pool(data=X_train, label=y_train, cat_features=categorical_features_indices)
test_pool = Pool(data=X_test, label=y_test, cat_features=categorical_features_indices)
# Train the CatBoost model
model = CatBoostRegressor(iterations=100, depth=6, learning_rate=0.1, loss_function='RMSE', nan_mode='Min', verbose=False)
model.fit(train_pool)
为了训练CatBoost模型,我们需要为CatBoost创建训练和测试集,因为它的内部训练优化需要特殊类型的数据集类型,不同于普通的NumPy或pandas数据帧。之后,我们需要指定各种超参数来训练CatBoost模型。在这里,我们还将使用内置的catboost超参数处理缺失值。
- iterations:该参数设置boosting迭代的总数,即集合中的树的数量。这里我们将它设置为100,这意味着训练过程将创建100个决策树(迭代)。
- learning_rate:该参数确定梯度提升算法学习的步长,该算法将每个树对最终预测的贡献进行缩放。较小的学习率通常会导致更强大的模型,但需要更多的迭代。
- depth:这个参数控制决策树的最大深度。更深的树可以捕获更复杂的模式,但它可能会导致过拟合问题。
- verbose:此参数控制训练期间显示的日志记录和信息的级别,这对于监控训练过程很有用。这里我们将其设置为“False”以保持控制台清晰。
- loss_function:该参数指定用于在训练期间优化模型的损失函数。它被设置为“RMSE”,因为我们正在执行回归任务。
- cat_features:分类特征的索引数组。CatBoost会自动对这些特征进行编码以进行训练,并以不同的方式处理它们。
- nan_mode:这是CatBoost的特殊超参数,用于在模型训练期间内部处理数据集的缺失值。这个超参数有三个值,分别是“Forbidden”、“Min”和“Max”。默认情况下,它接受’Forbidden’并在训练期间引发错误。如果我们将其设置为’Min’,那么它将用相应列的最小值替换所有缺失值。如果我们将其设置为’Max’,那么它将用相应列的最大值替换缺失值。在这里,我们将其设置为“Min”。
模型评估
现在,我们将根据MAE和R2得分来评估我们的模型,这是最常见的回归模型指标。
# Make predictions on the test set
y_pred = model.predict(test_pool)
# Evaluate the model
mae = mean_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f'Mean Absolute Error (MAE): {mae:.2f}')
print(f'R2 Score: {r2:.4f}')
输出
Mean Absolute Error (MAE): 17666.19
R2 Score: 0.9000
此代码使用预先训练的模型(model)对测试集进行预测。然后使用平均绝对误差(MAE)和R平方(R2)分数评估模型对测试数据的性能,这些分数提供了关于模型拟合优度和准确性的信息。
总结
我们可以得出结论,缺失值在现实世界的数据集中非常常见,但我们需要有效地处理它们,因为它们会降低模型的性能。CatBoost有其内置机制来处理训练过程中数据集中的缺失值。我们的模型达到了90%的显著R2分数,这表明缺失值得到了有效处理。但是,我们还可以执行超参数调优以获得更准确的结果。