使用AdaBoostClassifier训练蘑菇数据集报错:'str'对象无'fit'属性
解决AdaBoostClassifier的AttributeError: 'str' object has no attribute 'fit'错误
这个错误的根源很明确:你在初始化AdaBoostClassifier时,给base_estimator参数传了字符串'DecisionTreeClassifier',但这个参数要求的是一个机器学习估算器的类(或者类的实例),而不是字符串。当你传字符串的时候,AdaBoost会把它当作普通的字符串对象处理,而字符串根本没有fit方法,自然会在调用fit()时抛出这个错误。
另外还要提一句,原代码里的prediction = AdaBoost.score(Y)也是错误的——score方法需要同时传入特征集X和标签集Y,只传Y会导致参数不匹配的问题,这个也得一起修正。
修正后的代码方案
你有两种可选的修正方式:
方式1:使用默认的基估算器
AdaBoostClassifier的默认base_estimator就是DecisionTreeClassifier(默认是深度为1的决策树,也就是决策桩),所以你可以直接省略这个参数:
from sklearn.ensemble import AdaBoostClassifier from sklearn.preprocessing import LabelEncoder import pandas as pd dataset = pd.read_csv('data\\mushroom.csv', header=None) dataset = dataset.sample(frac=1) dataset.columns = ['target','cap-shape','cap-surface','cap-color','bruises','odor','gill-attachment','gill-spacing', 'gill-size','gill-color','stalk-shape','stalk-root','stalk-surface-above-ring','stalk-surface-below-ring','stalk-color-above-ring', 'stalk-color-below-ring','veil-type','veil-color','ring-number','ring-type','spore-print-color','population', 'habitat'] for label in dataset.columns: dataset[label] = LabelEncoder().fit_transform(dataset[label]) X = dataset.drop(['target'], axis=1) Y = dataset['target'] # 省略base_estimator,使用默认的DecisionTreeClassifier AdaBoost = AdaBoostClassifier(n_estimators=400, learning_rate=0.01, algorithm='SAMME') AdaBoost.fit(X, Y) # 修正score方法的参数 prediction = AdaBoost.score(X, Y) print(prediction)
方式2:显式传入自定义的决策树实例
如果你想自定义基决策树的参数(比如调整树的深度),可以先实例化一个DecisionTreeClassifier,再传给base_estimator:
from sklearn.ensemble import AdaBoostClassifier from sklearn.preprocessing import LabelEncoder from sklearn.tree import DecisionTreeClassifier # 要导入这个类 import pandas as pd dataset = pd.read_csv('data\\mushroom.csv', header=None) dataset = dataset.sample(frac=1) dataset.columns = ['target','cap-shape','cap-surface','cap-color','bruises','odor','gill-attachment','gill-spacing', 'gill-size','gill-color','stalk-shape','stalk-root','stalk-surface-above-ring','stalk-surface-below-ring','stalk-color-above-ring', 'stalk-color-below-ring','veil-type','veil-color','ring-number','ring-type','spore-print-color','population', 'habitat'] for label in dataset.columns: dataset[label] = LabelEncoder().fit_transform(dataset[label]) X = dataset.drop(['target'], axis=1) Y = dataset['target'] # 先实例化自定义参数的决策树 base_clf = DecisionTreeClassifier(max_depth=2) # 把实例传给base_estimator AdaBoost = AdaBoostClassifier(base_estimator=base_clf, n_estimators=400, learning_rate=0.01, algorithm='SAMME') AdaBoost.fit(X, Y) prediction = AdaBoost.score(X, Y) print(prediction)
额外提示
- 注意文件路径的写法:Windows系统下如果用反斜杠
\,要写成转义的\\,或者直接用正斜杠/(比如'data/mushroom.csv'),避免路径解析错误。 LabelEncoder的使用可以优化:不需要每次循环都重新实例化,你可以先创建一个实例再复用,但当前的写法也能正常工作。
内容的提问来源于stack exchange,提问作者2Obe
相关产品推荐
相关产品推荐

