【问题标题】:Using Perceptron sklearn.ensemble.AdaBoostClassifier() gives an error使用 Perceptron sklearn.ensemble.AdaBoostClassifier() 会出错
【发布时间】: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) 也会引发此类错误。

我的问题是:

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

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

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

【问题讨论】:

    标签: python machine-learning scikit-learn perceptron 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)
    

    【讨论】:

      猜你喜欢
      • 2019-09-17
      • 2015-01-22
      • 2018-08-05
      • 2017-08-04
      • 1970-01-01
      • 1970-01-01
      • 2017-06-21
      • 2020-07-20
      • 2016-08-21
      相关资源
      最近更新 更多