Как я могу построить метаклассификатор в scikit-learn
из бинарных классификаторов N
, который вернет 1
, если какой-либо из классификаторов вернет 1
?
В настоящее время я пробовал VotingClassifier
, но ему не хватает логики, которая мне нужна, как с voting
, равным hard
, так и с soft
. Pipeline
, похоже, ориентирован на последовательные вычисления.
Я могу написать логику сам, но мне интересно, есть ли что-нибудь встроенное?
Из встроенных опций есть только soft
и hard
голосование. Как вы упомянули, мы можем создать пользовательскую функцию для этого метаклассификатора, которая использует логику OR
на основе исходного кода здесь. Этот пользовательский мета-классификатор также может вписаться в pipeline
.
from sklearn.utils.validation import check_is_fitted
class CustomMetaClassifier(VotingClassifier):
def predict(self, X):
""" Predict class labels for X.
Parameters
----------
X : {array-like, sparse matrix}, shape = [n_samples, n_features]
The input samples.
Returns
----------
maj : array-like, shape = [n_samples]
Predicted class labels.
"""
check_is_fitted(self, 'estimators_')
maj = np.max(eclf1._predict(X), 1)
maj = self.le_.inverse_transform(maj)
return maj
>>> import numpy as np
>>> from sklearn.linear_model import LogisticRegression
>>> from sklearn.naive_bayes import GaussianNB
>>> from sklearn.ensemble import RandomForestClassifier, VotingClassifier
>>> clf1 = LogisticRegression(solver='lbfgs', multi_class='multinomial',
... random_state=1)
>>> clf2 = RandomForestClassifier(n_estimators=50, random_state=1)
>>> clf3 = GaussianNB()
>>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
>>> y = np.array([1, 1, 1, 2, 2, 2])
>>> eclf1 = CustomMetaClassifier(estimators=[
... ('lr', clf1), ('rf', clf2), ('gnb', clf3)])
>>> eclf1 = eclf1.fit(X, y)
>>> eclf1.predict(X)
array([1, 1, 1, 2, 2, 2])
Downvoter, пожалуйста, объясните, что не так с вопросом.