Ошибка типа: объект __ensemble__ не вызывается - PullRequest
0 голосов
/ 05 января 2019

Я не знаю, почему он не называет ансамбль. Может быть, какой-то параметр запутался?

Данные о типе лесного покрова:
Х = форма (581012, 54)
у = форма (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, но он показал ту же ошибку, что не вызывается.

Ответы [ 2 ]

0 голосов
/ 06 января 2019
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()))    
0 голосов
/ 06 января 2019

Для VotingClassifier оценщиками должен быть список кортежей с именами и моделью. Обратите внимание, что вы создали класс модели, а затем дали внутри кортежа.

С Документация:

Оценки : список (строка, оценщик) кортежей Вызов фитинга метод на VotingClassifier будет соответствовать клонам тех оригинальных Оценщики, которые будут храниться в атрибуте класса self.estimators_. Оценщик может быть установлен на Нет с помощью set_params.

Для двух других ансамблей вы можете задать задачу только одному базовому оценщику и n количественным оценщикам для одной и той же базовой модели. Перебирайте различные классификаторы, как вы делали код, но каждый раз вы переопределяете модель ансамбля.

base_estimator : объект или нет, необязательно (по умолчанию = нет) База оценка для размещения на случайных подмножествах набора данных. Если нет, то Базовая оценка - это дерево решений.

n_estimators : int, необязательный (по умолчанию = 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())    
...