使用感知器 sklearn.ensemble.AdaBoostClassifier() 会出现错误

问题描述

我在将感知器用于 AdaBoost 分类器时遇到了问题。

来自 here 的训练和测试数据 应该在最后一列(“Poker Hand”)中变成 0 和 1,(最初是从 1 到 9),那么决策树分类器和 AdaBoost 分类器共 15 个弱感知器分类器应该在数据。我尝试使用 scikit-learn 库,但是虽然我的决策树分类器提供了不错的结果,但 AdaBoost 分类器会抛出错误

ValueError: BaseClassifier in AdaBoostClassifier ensemble is worse than random,ensemble can not be fit.

这里是代码的关键部分。

import pandas as pd
from sklearn.ensemble import AdaBoostClassifier
from sklearn.linear_model import Perceptron
from sklearn import metrics

if __name__ == "__main__":
   
    data_train = pd.read_csv("poker-hand-testing.data",header=None)
    data_test = pd.read_csv("poker-hand-training-true.data",header=None)
    

    for value in range(0,len(data_train)):
        if data_train[10][value] != 0:
            data_train[10][value] = 1
    
    for value in range(0,len(data_test)):
        if data_test[10][value] != 0:
            data_test[10][value] = 1

    col=['Suit of card #1','Rank of card #1','Suit of card #2','Rank of card #2','Suit of card #3','Rank of card #3','Suit of card #4','Rank of card #4','Suit of card #5','Rank of card #5','Poker Hand']
    
    data_train.columns=col
    data_test.columns=col
    
    y_train=data_train['Poker Hand']
    y_test=data_test['Poker Hand']
    
    x_train=data_train.drop('Poker Hand',axis=1)
    x_test=data_test.drop('Poker Hand',axis=1)
    
#The problematic part
    classifier = AdaBoostClassifier(base_estimator=Perceptron(),n_estimators=15,algorithm='SAMME')
    classifier = classifier.fit(x_train,y_train)
    y_pred = classifier.predict(x_test)
    
    print("Accuracy of AdaBoost:",metrics.accuracy_score(y_test,y_pred))

奇怪的是,当我不将值更改为二进制值时,此错误每 9-10 次仅发生一次,而二进制值几乎总是会出错。此外,将 Perceptron() 更改为 SGDClassifier(loss="perceptron",eta0=1,learning_rate="constant",penalty=None) 也会引发此类错误

我的问题是:

  1. 可以使用 scikit-learn 库的解决方案是什么?

  2. 有没有办法处理这样的异常?比如报错,再执行一次,直到得到想要的结果?

  3. 如果在 scikit-learn 库中无法解决,是否还有其他替代方案可以让我将决策树和 AdaBoost 与感知器结合使用?

解决方法

有问题的部分可以通过 try-catch 块解决。例如,

#The problematic part solution
AdaBoost_accuracy = 0

while AdaBoost_accuracy == 0:
    try:
        classifier = AdaBoostClassifier(base_estimator=Perceptron(),n_estimators=15,algorithm='SAMME')
        classifier = classifier.fit(x_train,y_train)
        y_pred = classifier.predict(x_test)
        AdaBoost_accuracy = metrics.accuracy_score(y_test,y_pred)
    except:
        print("Let me reclassify AdaBoost again")

print("Accuracy of AdaBoost:",AdaBoost_accuracy)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...