Skip to content

Commit e9c5757

Browse files
authored
feat: added weightedknn
1 parent d1dbd78 commit e9c5757

File tree

3 files changed

+65
-1
lines changed

3 files changed

+65
-1
lines changed

src/capymoa/classifier/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from ._samknn import SAMkNN
1919
from ._dynamic_weighted_majority import DynamicWeightedMajority
2020
from ._csmote import CSMOTE
21+
from ._weightedknn import WeightedkNN
2122

2223
__all__ = [
2324
"AdaptiveRandomForestClassifier",
@@ -39,5 +40,6 @@
3940
"HoeffdingAdaptiveTree",
4041
"SAMkNN",
4142
"DynamicWeightedMajority",
42-
"CSMOTE"
43+
"CSMOTE",
44+
"WeightedkNN"
4345
]
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
from capymoa.base import MOAClassifier
2+
from moa.classifiers.lazy import WeightedkNN as _MOA_WeightedkNN
3+
from capymoa.stream import Schema
4+
from capymoa._utils import build_cli_str_from_mapping_and_locals
5+
6+
7+
class WeightedkNN(MOAClassifier):
8+
"""WeightedKNN
9+
Reference:
10+
11+
'Effective Weighted k-Nearest Neighbors for Dynamic Data Streams'
12+
Maroua Bahri
13+
IEEE International Conference on Big Data (Big Data), 2022
14+
<https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=10020652>
15+
Example usages:
16+
>>> from capymoa.datasets import ElectricityTiny
17+
>>> from capymoa.classifier import WeightedkNN
18+
>>> from capymoa.evaluation import prequential_evaluation
19+
>>> stream = ElectricityTiny()
20+
>>> schema = stream.get_schema()
21+
>>> learner = WeightedkNN(schema)
22+
>>> results = prequential_evaluation(stream, learner, max_instances=1000)
23+
>>> results["cumulative"].accuracy()
24+
74.7
25+
"""
26+
27+
28+
def __init__(
29+
self,
30+
schema: Schema,
31+
k: int = 10,
32+
limit: int = 1000
33+
):
34+
35+
""" Weighted KNN Classifier
36+
:param schema: The schema of the stream.
37+
:param k: The number of neighbors.
38+
:param w: The maximum number of instances to store.
39+
"""
40+
41+
42+
mapping = {
43+
"k": "-k",
44+
"limit": "-w",
45+
}
46+
47+
48+
config_str = build_cli_str_from_mapping_and_locals(mapping, locals())
49+
self.moa_learner = _MOA_WeightedkNN()
50+
super(WeightedkNN, self).__init__(
51+
schema=schema,
52+
CLI=config_str,
53+
moa_learner=self.moa_learner,
54+
)

tests/test_classifiers.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
CSMOTE,
2121
LeveragingBagging,
2222
OnlineAdwinBagging,
23+
WeightedkNN
2324
)
2425
from capymoa.base import Classifier
2526
from capymoa.base import MOAClassifier
@@ -197,6 +198,12 @@ class ClassifierTestCase:
197198
85.25,
198199
92.0,
199200
),
201+
ClassifierTestCase(
202+
"WeightedkNN",
203+
partial(WeightedkNN),
204+
78.15,
205+
70,
206+
),
200207
]
201208

202209

@@ -286,3 +293,4 @@ def test_classifiers(test_case: ClassifierTestCase, subtests: SubTests):
286293
if isinstance(learner, MOAClassifier) and test_case.cli_string is not None:
287294
cli_str = _extract_moa_learner_CLI(learner).strip("()")
288295
assert cli_str == test_case.cli_string, "CLI does not match expected value"
296+

0 commit comments

Comments
 (0)