import numpy as np
from brew.base import Ensemble
from .base import DCS
[docs]class OLA(DCS):
"""Overall Local Accuracy.
The Overall Local Accuracy selects the best classifier for
a sample using it's K nearest neighbors.
Attributes
----------
`Xval` : array-like, shape = [indeterminated, n_features]
Validation set.
`yval` : array-like, shape = [indeterminated]
Labels of the validation set.
`knn` : sklearn KNeighborsClassifier,
Classifier used to find neighborhood.
Examples
--------
>>> from brew.selection.dynamic.ola import OLA
>>> from brew.generation.bagging import Bagging
>>> from brew.base import EnsembleClassifier
>>>
>>> from sklearn.tree import DecisionTreeClassifier
>>> import numpy as np
>>>
>>> X = np.array([[-1, 0], [-0.8, 1], [-0.8, -1], [-0.5, 0] , [0.5, 0], [1, 0], [0.8, 1], [0.8, -1]])
>>> y = np.array([1, 1, 1, 2, 1, 2, 2, 2])
>>>
>>> bag = Bagging(base_classifier=DecisionTreeClassifier(max_depth=1, min_samples_leaf=1), n_classifiers=10)
>>> bag.fit(X, y)
>>>
>>> ola = OLA(X, y, K=3)
>>>
>>> clf = EnsembleClassifier(bag.ensemble, selector=ola)
>>> clf.predict([-1.1,-0.5])
[1]
See also
--------
brew.selection.dynamic.lca.LCA: Local Class Accuracy.
References
----------
Woods, Kevin, Kevin Bowyer, and W. Philip Kegelmeyer Jr. "Combination
of multiple classifiers using local accuracy estimates." Computer Vision
and Pattern Recognition, 1996. Proceedings CVPR'96, 1996 IEEE Computer
Society Conference on. IEEE, 1996.
Ko, Albert HR, Robert Sabourin, and Alceu Souza Britto Jr.
"From dynamic classifier selection to dynamic ensemble selection."
Pattern Recognition 41.5 (2008): 1718-1731.
"""
[docs] def select(self, ensemble, x):
if ensemble.in_agreement(x):
return Ensemble([ensemble.classifiers[0]]), None
# intialize variables
# the the indexes of the KNN of x
classifiers = ensemble.classifiers
[idx] = self.knn.kneighbors(x, return_distance=False)
X, y = self.Xval[idx], self.yval[idx]
# d[score] = indexes of the classifiers with that score
d = {}
scores = [clf.score(X, y) for clf in ensemble.classifiers]
for i, scr in enumerate(scores):
d[scr] = d[scr] + [i] if scr in d else [i]
best_scores = sorted([k for k in d.iterkeys()], reverse=True)
# if there was a single best classifier, return it
if len(d[best_scores[0]]) == 1:
i = d[best_scores[0]][0]
return Ensemble([classifiers[i]]), None
options = None
for j, score in enumerate(best_scores):
pred = [classifiers[i].predict(x) for i in d[score]]
pred = np.asarray(pred).flatten()
bincount = np.bincount(pred)
if options != None:
for i in range(len(bincount)):
bincount[i] = bincount[i] if i in options else 0
imx = np.argmax(bincount)
votes = np.argwhere(bincount == bincount[imx]).flatten()
count = len(votes)
if count == 1:
return Ensemble([classifiers[np.argmax(pred == imx)]]), None
elif options == None:
options = votes
return Ensemble([classifiers[np.argmax(scores)]]), None
[docs]class OLA2(DCS):
[docs] def select(self, ensemble, x):
if ensemble.in_agreement(x):
return Ensemble([ensemble.classifiers[0]]), None
# intialize variables
# the the indexes of the KNN of x
classifiers = ensemble.classifiers
[idx] = self.knn.kneighbors(x, return_distance=False)
X, y = self.Xval[idx], self.yval[idx]
scores = np.asarray([clf.score(X, y) for clf in classifiers])
return Ensemble([classifiers[np.argmax(scores)]]), None