Я пытаюсь решить задачу двоичной классификации. Набор обучающих данных содержит 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)
Не могли бы вы помочь мне понять правильное использование классификаторов суммирования?
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