CatBoost - 过拟合检测



过拟合是指模型在训练数据上表现良好,但在未知数据上表现较差的现象。CatBoost 提供了评估过拟合的指标。

以下是一些常见的 CatBoost 指标,用于解释过拟合防护:

交叉验证

交叉验证是寻找和降低过拟合的最重要的机器学习方法之一。通过比较训练和验证性能,交叉验证有助于检测过拟合。

此方法使用交叉验证分析 CatBoostClassifier 模型在 Iris 数据集上的性能。使用交叉验证是一种常见的避免过拟合的方法,过拟合是指模型由于过度调整到训练数据而无法在新数据上良好运行的情况。此外,交叉验证提高了我们对模型真实性能的理解。为了确定模型的性能水平,它确定了许多指标。

# Import required libraries
import numpy as np
from catboost import CatBoostClassifier, Pool, cv
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# Load the required dataset
iris = load_iris()
X, y = iris.data, iris.target

# Generate a CatBoost Pool object
data_pool = Pool(X, label=y)

# Defining the CatBoostClassifier parameters
params = {
	'iterations': 100,		
	'learning_rate': 0.1,	
	'depth': 6,				
	'loss_function': 'MultiClass', 
	'verbose': 0			 
}

# Do cross-validation
cv_results = cv(pool=data_pool, 
				params=params, 
				fold_count=5, 
				shuffle=True, 
				partition_random_seed=42, 
				verbose_eval=False)

# Print the results
for metric_name in cv_results.columns:
	if 'test-' in metric_name:
		mean_score = cv_results[metric_name].iloc[-1]
		print(f'{metric_name}: {mean_score:.4f}')

输出

这将产生以下结果:

Training on fold [0/5]

bestTest = 0.1226007055
bestIteration = 72

Training on fold [1/5]

bestTest = 0.09388296402
bestIteration = 99

Training on fold [2/5]

bestTest = 0.05707644554
bestIteration = 99

Training on fold [3/5]

bestTest = 0.1341533772
bestIteration = 93

Training on fold [4/5]

bestTest = 0.19934632
bestIteration = 94

test-MultiClass-mean: 0.1221
test-MultiClass-std: 0.0531

特征重要性

CatBoost 还提供特征重要性评分。它可以用于确定特征的重要性及其效用,以及它们如何影响模型做出的预测。通过突出显示影响模型预测的变量,可以使用特征重要性来检测过拟合。如果某个特征对模型的预测没有影响,它就可能过度拟合到模型中。

生成的条形图将突出显示每个特征在模型预测中的重要性。借助此数据,可以识别对分类过程最重要的特征,从而对工程或特征选择工作进行排序。

import numpy as np
import matplotlib.pyplot as plt
from catboost import CatBoostClassifier, Pool
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# Load the Iris dataset
iris_dataset = load_iris()
X_data, y_labels = iris_dataset.data, iris_dataset.target

# Split the data into training and testing sets
X_train_data, X_test_data, y_train_labels, y_test_labels = train_test_split(X_data, y_labels, test_size=0.2, random_state=42)

# Create a CatBoostClassifier
catboost_model = CatBoostClassifier(iterations=100, learning_rate=0.1, depth=6, loss_function='MultiClass', verbose=0)

# Train the model
catboost_model.fit(X_train_data, y_train_labels)

# Create a Pool object for the testing data
test_data_pool = Pool(X_test_data)

# Get feature importance scores
feature_importance_scores = catboost_model.get_feature_importance(test_data_pool)

# Get feature names
feature_labels = iris_dataset.feature_names

# Plot feature importance with changed color
plt.figure(figsize=(10, 6))
plt.barh(range(len(feature_importance_scores)), feature_importance_scores, color='skyblue', tick_label=feature_labels)
plt.xlabel('Feature Importance Score')
plt.ylabel('Features')
plt.title('Feature Importance for CatBoost Classifier')
plt.show()

输出

以下是使用上述代码生成的結果:

CatBoost Feature Importance

识别过拟合很大程度上也取决于学习曲线。CatBoost 中没有不同的学习曲线绘图技术。但是,可以使用其他 Python 程序(如 matplotlib)进行绘制。

广告