使用感知器 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 与感知器结合使用?

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

有问题的部分可以通过 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)
本文链接:https://www.f2er.com/1054703.html

大家都在问