AdaBoostClassifier:test_size=0.25 的完美指标,但其他值的样本不一致错误

问题描述 投票:0回答:1

我使用

AdaBoostClassifier
和弱学习器 (
DecisionTreeClassifier
) 来对数据集进行分类。该数据集有 7857 个样本:

X.shape
# Output: (7857, 5)

y.shape
# Output: (7857,)

这是分割数据集和训练模型的代码:


X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=28
)

weak_learner = DecisionTreeClassifier(max_depth=1)

adb = AdaBoostClassifier(estimator=weak_learner, n_estimators=50, random_state=42)
adb_model = adb.fit(X_train, y_train)

y_pred = adb_model.predict(X_test)
print(classification_report(y_test, y_pred))

当我使用

test_size=0.25
运行此代码时,所有类别的分类指标输出均为 100%:

              precision    recall  f1-score   support

       Cheap       1.00      1.00      1.00       496
   Expensive       1.00      1.00      1.00       506
  Reasonable       1.00      1.00      1.00       963

    accuracy                           1.00      1965
   macro avg       1.00      1.00      1.00      1965
weighted avg       1.00      1.00      1.00      1965

这不可能是真的,因为我的数据点并不是完全可分离的。 (我用图表检查过)

但是,当我将

test_size
更改为任何其他值(例如,
0.3
0.2
)时,我收到以下错误:

ValueError: Found input variables with inconsistent numbers of samples

我检查过的内容:

  1. 确保
    X
    y
    具有相同数量的样本。
  2. 确认
    X
    y
    中没有缺失值。

问题:

  1. 为什么
    test_size=0.25
    会产生完美的指标,但其他
    test_size
    值会导致错误?
  2. 如何解决此问题以使用不同的
    test_size
    值?
python machine-learning artificial-intelligence
1个回答
0
投票
  1. test_size = 0.25 对我认为的指标并没有真正的影响。但你的模型太好了,可能是因为标签遵循的功能非常简单。因此,您的 Adaboost 只需要决策树(深度=1)即可学习该函数。 但是,您可能在所有代码中使用相同的名称 y_pred,因此,当您对模型或测试数据集进行任何更改时,应该实现 y_pred。 test_size实际上修改了测试数据集的长度,之前的长度是数据集总大小的25%。如果修改 test_size,则修改该测试数据集,并且需要使用 adb.predict(X_test) 实现 y_pred,以便使新预测与新数据点匹配,并且不会出现不匹配错误。

  2. 要解决此问题,您只需在使用任何需要 y_test 和 y_pred 的函数之前添加: y_pred = adb.predict(X_test)

在此输入图片描述

© www.soinside.com 2019 - 2024. All rights reserved.