使用 Perceptron sklearn.ensemble.AdaBoostClassifier() 会出错

Posted

技术标签:

【中文标题】使用 Perceptron sklearn.ensemble.AdaBoostClassifier() 会出错【英文标题】:Using Perceptron sklearn.ensemble.AdaBoostClassifier() gives an error 【发布时间】:2021-04-27 14:03:31 【问题描述】:

我在为 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) 也会引发此类错误。

我的问题是:

    使用 scikit-learn 库的解决方案是什么?

    有没有办法处理这样的异常?例如,如果它给出错误,则再次执行它直到所需的结果?

    如果 scikit-learn 库无法解决问题,是否有其他替代方案可以让我同时使用决策树和 AdaBoost 和感知器?

【问题讨论】:

【参考方案1】:

有问题的部分可以通过 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)

【讨论】:

以上是关于使用 Perceptron sklearn.ensemble.AdaBoostClassifier() 会出错的主要内容,如果未能解决你的问题,请参考以下文章

机器学习——Perceptron实践

使用 Perceptron sklearn.ensemble.AdaBoostClassifier() 会出错

matlab 实现感知机线性二分类算法(Perceptron)

(机器学习基石)Perceptron Learning Algorithm(PLA)

deeplearning.net 0.1 document - Multilayer Perceptron

感知机算法(Perceptron Learning Algorithm)