Должно ли количество классификаторов в классификаторе стеков быть равно количеству столбцов в моем наборе данных обучения / тестирования? - PullRequest
1 голос
/ 09 марта 2019

Я пытаюсь решить задачу двоичной классификации. Набор обучающих данных содержит 9 функций, и после окончания разработки у меня появилось 14 функций. Я хочу использовать классификатор стека с mlxtend.classifier.StackingClassifier с использованием 4 различных классификаторов, но при попытке предсказать набор тестовых данных я получил ошибку: ValueError: query data dimension must match training data dimension

%%time
models=[KNeighborsClassifier(weights='distance'),
        GaussianNB(),SGDClassifier(loss='hinge'),XGBClassifier()]
calibrated_models=Calibrated_classifier(models,return_names=False)
meta=LogisticRegression()
stacker=StackingCVClassifier(classifiers=calibrated_models,meta_classifier=meta,use_probas=True).fit(X.values,y.values)

Примечание: в моем коде я только что запрограммировал функцию, чтобы она возвращала список с калиброванными классификаторами StackingCVClassifier Я проверил, что это не вызывает ошибку

Примечание 2: Я уже пытался выполнить укладчик с нуля с такими же результатами, поэтому я подумал, что с моим собственным накопителем что-то не так

from sklearn.linear_model import LogisticRegression
def StackingClassifier(X,y,models,stacker=LogisticRegression(),return_data=True):
  names,ls=[],[]
  predictions=pd.DataFrame()
  for model in models:
    names.append(str(model)[:str(model).find('(')])

  for i,model in enumerate(models):
    model.fit(X,y)
    ls=model.predict_proba(X)[:,1]
    predictions[names[i]]=ls
  if return_data:
    return predictions
  else:
    return stacker.fit(predictions,y)

Не могли бы вы помочь мне понять правильное использование классификаторов суммирования?

enter image description here

EDIT: Это мой код для калиброванного классификатора. Эта функция берет список из n классификаторов и применяет sklearn fucntion CalibratedClassifierCV к каждому из них и возвращает список с n калиброванными классификаторами. У вас есть возможность вернуться в виде почтового списка, так как эта функция в основном предназначена для использования вместе с sklearn's VotingClassifier

def Calibrated_classifier(models,method='sigmoid',return_names=True):
  calibrated,names=[],[]
  for model in models:
    names.append(str(model)[:str(model).find('(')])

  for model in models:
    clf=CalibratedClassifierCV(base_estimator=model,method=method)
    calibrated.append(clf)
  if return_names:
    return zip(names,calibrated)
  else: 
    return calibrated

1 Ответ

0 голосов
/ 09 марта 2019

Я попробовал ваш код с набором данных Iris.Он работает нормально, я думаю, что проблема связана с размером данных вашего теста, а не с калибровкой.

from sklearn.linear_model import LogisticRegression
from mlxtend.classifier import StackingCVClassifier
from sklearn import datasets
X, y = datasets.load_iris(return_X_y=True)


models=[KNeighborsClassifier(weights='distance'),
        SGDClassifier(loss='hinge')]
calibrated_models=Calibrated_classifier(models,return_names=False)
meta=LogisticRegression( multi_class='ovr')
stacker = StackingCVClassifier(classifiers=calibrated_models,
                               meta_classifier=meta,use_probas=True,cv=3).fit(X,y)

Прогноз

stacker.predict([X[0]])
#array([0])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...