TypeError:“__ensemble__”对象不可调用

Posted

技术标签:

【中文标题】TypeError:“__ensemble__”对象不可调用【英文标题】:TypeError: '__ensemble__' object is not callable 【发布时间】:2019-05-31 18:24:23 【问题描述】:

我不知道为什么它没有调用任何合奏。也许是一些参数混乱?

森林覆盖类型数据: X = (581012, 54)的形状 y = (581012, ) 的形状

from sklearn.ensemble import VotingClassifier
from sklearn.ensemble import BaggingClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn import model_selection

classifier_names = ["logistic regression", "linear SVM", "nearest centroids", "decision tree"]
classifiers = [LogisticRegression, LinearSVC, NearestCentroid, DecisionTreeClassifier]

ensemble1 = VotingClassifier(classifiers)
ensemble2 = BaggingClassifier(classifiers)
ensemble3 = AdaBoostClassifier(classifiers)
ensembles = [ensemble1, ensemble2, ensemble3]
seed = 7  

for ensemble in ensembles:
    kfold = model_selection.KFold(n_splits=10, random_state=seed)
    for classifier in classifiers:
        model = ensemble(base_estimator=classifier, random_state=seed)
        results = model_selection.cross_val_score(ensemble, X, Y, cv=kfold)
        print(results.mean())    

我希望为分类器运行集成,但第一个集成没有运行。我首先将订单更改为BaggingClassifier,但显示的错误与不可调用的相同。

【问题讨论】:

【参考方案1】:

对于VotingClassifier,估计器应该是包含名称和模型的元组列表。 请注意,您已经创建了一个模型类,然后在元组中给出。

来自Documentation:

estimators :(字符串,估计器)元组列表调用拟合 VotingClassifier 上的方法将适合那些原始的克隆 将存储在类属性中的估计器 self.estimators_。可以使用 set_params 将估算器设置为 None。

对于其他两个集成,您只能对同一基本模型的一个基本估计器和 n 个估计器提出问题。循环遍历不同的分类器,就像您编写代码一样,但您每次都重新定义了集成模型。

base_estimator:对象或无,可选(默认=无)基础 适合数据集的随机子集的估计器。如果没有,那么 基估计器是一棵决策树。

n_estimators : int, optional (default=10) 基数 集成中的估计器。

试试这个!

iris = datasets.load_iris()
X, y = iris.data[:, 1:3], iris.target

classifier_names = ["logistic regression","linear SVM","nearest centroids", "decision tree"]
classifiers = [LogisticRegression(), LinearSVC(), NearestCentroid(), DecisionTreeClassifier()]


ensemble1 = VotingClassifier([(n,c) for n,c in zip(classifier_names,classifiers)])
ensemble2 = BaggingClassifier(base_estimator= DecisionTreeClassifier() , n_estimators= 10)
ensemble3 = AdaBoostClassifier(base_estimator= DecisionTreeClassifier() , n_estimators= 10)
ensembles = [ensemble1,ensemble2,ensemble3]
seed = 7  

for ensemble in ensembles:
    kfold = model_selection.KFold(n_splits=10, random_state=seed)
    results = model_selection.cross_val_score(ensemble, X, y, cv=kfold)
    print(results.mean())    

【讨论】:

你的效果很好。我需要尝试组装分类器和集成(还添加了 RandomForest)... 听起来你想在 ensemble 之上创建一个 meta ensemble。希望您的'__ensemble__' object is not callable 问题得到解决。请接受该解决方案并开始一个新的解决方案,其中包含有关您的元集成模型的更多详细信息。【参考方案2】:
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier, BaggingClassifier, VotingClassifier
from sklearn import model_selection
import warnings 
warnings.filterwarnings("ignore") 

seed = 7 
classifier_names = ["logistic regression","linear SVM","nearest centroids", "decision tree"]
classifiers = [LogisticRegression, LinearSVC, NearestCentroid, DecisionTreeClassifier]
for classifier in classifiers:
    ensemble1 = RandomForestClassifier(estimator=classifier(), n_estimators= 20, random_state=seed)
    ensemble2 = AdaBoostClassifier(base_estimator=classifier(), 
                                   n_estimators= 5, learning_rate=1, random_state=seed)
    ensemble3 = BaggingClassifier(base_estimator=classifier(), 
                                  max_samples=0.5, n_estimators=20, random_state=seed)
    ensemble4 = VotingClassifier([(n,c) for n,c in zip(classifier_namess, classifiers)], voting="soft")
    ensembles = [ensemble1, ensemble2, ensemble3, ensemble4]

for ensemble in ensembles:
    kfold = model_selection.KFold(n_splits=10, random_state=seed)
    results = model_selection.cross_val_score(ensemble, X[1:100], y[1:100], cv=kfold)
    print("The mean accuracy of :".format(results.mean()))    

【讨论】:

ensembles = [ensemble1, ensemble2, ensemble3, ensemble4]。这将在循环的每次迭代中被覆盖 备受瞩目。我无法在分类 for 循环中获得合奏,所以我只是单独完成它们。 RFC 也没有采用分类器。 RFC 的估算器是决策树,因此它不能将任何估算器作为输入。 scikit-learn.org/stable/modules/generated/…

以上是关于TypeError:“__ensemble__”对象不可调用的主要内容,如果未能解决你的问题,请参考以下文章

从 JSON 响应中提取浮点密钥对值时出现 TypeError

如何在不获取“TypeError:字符串索引必须是整数”的情况下对图像进行 numpy 切片

尝试对数据执行 GaussianNB 时得到 TypeError - python 初学者

如何修复 TypeError:在使用 bcryptjs 对 GraphQL 突变进行哈希密码期间无法读取未定义的属性“哈希”?

无法在 nodeJS 中对用户进行身份验证:TypeError:无法使用“in”运算符在 fs 中搜索“用户名”

Python 酸洗错误:TypeError:对象泡菜未返回列表。 numpy的问题?