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 突变进行哈希密码期间无法读取未定义的属性“哈希”?