使用 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 sklearn.ensemble.AdaBoostClassifier() 会出错
matlab 实现感知机线性二分类算法(Perceptron)
(机器学习基石)Perceptron Learning Algorithm(PLA)