You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:16:05