Skip to content

Commit 262c1ed

Browse files
authored
[ENH] Refactor num_kernels (#2373)
* rocket unequal length * typo * typo * num_kernels * switch to mock * examples * examples and typos * handle mismatch it fit and transform * handle mismatch it fit and transform * notebook * tests * remove minirocketmultivariatevariable * num_kernels -> n_kernels * update from main * remove unequal cap * minirocket notebook * change test_all_estimators_list_tag_lookup * tag * tags * minrocket notebook * minirocket notebook
1 parent 0b42274 commit 262c1ed

File tree

29 files changed

+2306
-1972
lines changed

29 files changed

+2306
-1972
lines changed

aeon/classification/compose/_pipeline.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ class ClassifierPipeline(BaseCollectionPipeline, BaseClassifier):
6868
>>> X_train, y_train = load_unit_test(split="train")
6969
>>> X_test, y_test = load_unit_test(split="test")
7070
>>> pipeline = ClassifierPipeline(
71-
... Resizer(length=10), RocketClassifier(num_kernels=50)
71+
... Resizer(length=10), RocketClassifier(n_kernels=50)
7272
... )
7373
>>> pipeline.fit(X_train, y_train)
7474
ClassifierPipeline(...)

aeon/classification/compose/tests/test_pipeline.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
make_example_3d_numpy,
1717
make_example_3d_numpy_list,
1818
)
19-
from aeon.testing.mock_estimators import MockCollectionTransformer
19+
from aeon.testing.mock_estimators import MockClassifier, MockCollectionTransformer
2020
from aeon.transformations.collection import (
2121
AutocorrelationFunctionTransformer,
2222
HOG1DTransformer,
@@ -126,7 +126,7 @@ def test_unequal_tag_inference():
126126
assert not t4.get_tag("capability:unequal_length")
127127

128128
c1 = DummyClassifier()
129-
c2 = RocketClassifier(num_kernels=5)
129+
c2 = MockClassifier()
130130
c3 = RandomForestClassifier(n_estimators=2)
131131

132132
assert c1.get_tag("capability:unequal_length")
@@ -190,7 +190,7 @@ def test_missing_tag_inference():
190190
assert not t2.get_tag("capability:missing_values")
191191

192192
c1 = DummyClassifier()
193-
c2 = RocketClassifier(num_kernels=5)
193+
c2 = RocketClassifier(n_kernels=5)
194194
c3 = RandomForestClassifier(n_estimators=2)
195195

196196
assert c1.get_tag("capability:missing_values")

aeon/classification/convolution_based/_arsenal.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class Arsenal(BaseClassifier):
3535
3636
Parameters
3737
----------
38-
num_kernels : int, default=2,000
38+
n_kernels : int, default=2,000
3939
Number of kernels for each ROCKET transform.
4040
n_estimators : int, default=25
4141
Number of estimators to build for the ensemble.
@@ -114,7 +114,7 @@ class Arsenal(BaseClassifier):
114114
>>> from aeon.datasets import load_unit_test
115115
>>> X_train, y_train = load_unit_test(split="train")
116116
>>> X_test, y_test =load_unit_test(split="test")
117-
>>> clf = Arsenal(num_kernels=100, n_estimators=5)
117+
>>> clf = Arsenal(n_kernels=100, n_estimators=5)
118118
>>> clf.fit(X_train, y_train)
119119
Arsenal(...)
120120
>>> y_pred = clf.predict(X_test)
@@ -130,7 +130,7 @@ class Arsenal(BaseClassifier):
130130

131131
def __init__(
132132
self,
133-
num_kernels=2000,
133+
n_kernels=2000,
134134
n_estimators=25,
135135
rocket_transform="rocket",
136136
max_dilations_per_kernel=32,
@@ -141,7 +141,7 @@ def __init__(
141141
n_jobs=1,
142142
random_state=None,
143143
):
144-
self.num_kernels = num_kernels
144+
self.n_kernels = n_kernels
145145
self.n_estimators = n_estimators
146146
self.rocket_transform = rocket_transform
147147
self.max_dilations_per_kernel = max_dilations_per_kernel
@@ -281,15 +281,15 @@ def _fit_arsenal(self, X, y, keep_transformed_data=False):
281281
train_time = 0
282282

283283
if self.rocket_transform == "rocket":
284-
base_rocket = Rocket(num_kernels=self.num_kernels)
284+
base_rocket = Rocket(n_kernels=self.n_kernels)
285285
elif self.rocket_transform == "minirocket":
286286
base_rocket = MiniRocket(
287-
num_kernels=self.num_kernels,
287+
n_kernels=self.n_kernels,
288288
max_dilations_per_kernel=self.max_dilations_per_kernel,
289289
)
290290
elif self.rocket_transform == "multirocket":
291291
base_rocket = MultiRocket(
292-
num_kernels=self.num_kernels,
292+
n_kernels=self.n_kernels,
293293
max_dilations_per_kernel=self.max_dilations_per_kernel,
294294
n_features_per_kernel=self.n_features_per_kernel,
295295
)
@@ -419,12 +419,12 @@ def _get_test_params(cls, parameter_set="default"):
419419
`MyClass(**params)` or `MyClass(**params[i])` creates a valid test instance.
420420
"""
421421
if parameter_set == "results_comparison":
422-
return {"num_kernels": 20, "n_estimators": 5}
422+
return {"n_kernels": 20, "n_estimators": 5}
423423
elif parameter_set == "contracting":
424424
return {
425425
"time_limit_in_minutes": 5,
426-
"num_kernels": 10,
426+
"n_kernels": 10,
427427
"contract_max_n_estimators": 2,
428428
}
429429
else:
430-
return {"num_kernels": 10, "n_estimators": 2}
430+
return {"n_kernels": 10, "n_estimators": 2}

aeon/classification/convolution_based/_minirocket.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class MiniRocketClassifier(BaseClassifier):
2727
2828
Parameters
2929
----------
30-
num_kernels : int, default=10,000
30+
n_kernels : int, default=10,000
3131
The number of kernels for the Rocket transform.
3232
max_dilations_per_kernel : int, default=32
3333
The maximum number of dilations per kernel.
@@ -71,13 +71,13 @@ class MiniRocketClassifier(BaseClassifier):
7171
7272
Examples
7373
--------
74-
>>> from aeon.classification.convolution_based import RocketClassifier
74+
>>> from aeon.classification.convolution_based import MiniRocketClassifier
7575
>>> from aeon.datasets import load_unit_test
7676
>>> X_train, y_train = load_unit_test(split="train")
7777
>>> X_test, y_test = load_unit_test(split="test")
78-
>>> clf = RocketClassifier(num_kernels=500)
78+
>>> clf = MiniRocketClassifier(n_kernels=500)
7979
>>> clf.fit(X_train, y_train)
80-
RocketClassifier(...)
80+
MiniRocketClassifier(...)
8181
>>> y_pred = clf.predict(X_test)
8282
"""
8383

@@ -89,14 +89,14 @@ class MiniRocketClassifier(BaseClassifier):
8989

9090
def __init__(
9191
self,
92-
num_kernels=10000,
92+
n_kernels=10000,
9393
max_dilations_per_kernel=32,
9494
estimator=None,
9595
class_weight=None,
9696
n_jobs=1,
9797
random_state=None,
9898
):
99-
self.num_kernels = num_kernels
99+
self.n_kernels = n_kernels
100100
self.max_dilations_per_kernel = max_dilations_per_kernel
101101
self.estimator = estimator
102102

@@ -129,7 +129,7 @@ def _fit(self, X, y):
129129
self.n_cases_, self.n_channels_, self.n_timepoints_ = X.shape
130130

131131
self._transformer = MiniRocket(
132-
num_kernels=self.num_kernels,
132+
n_kernels=self.n_kernels,
133133
max_dilations_per_kernel=self.max_dilations_per_kernel,
134134
n_jobs=self.n_jobs,
135135
random_state=self.random_state,
@@ -215,6 +215,6 @@ def _get_test_params(cls, parameter_set="default"):
215215
`MyClass(**params)` or `MyClass(**params[i])` creates a valid test instance.
216216
"""
217217
if parameter_set == "results_comparison":
218-
return {"num_kernels": 100}
218+
return {"n_kernels": 100}
219219
else:
220-
return {"num_kernels": 20, "max_dilations_per_kernel": 6}
220+
return {"n_kernels": 20, "max_dilations_per_kernel": 6}

aeon/classification/convolution_based/_multirocket.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class MultiRocketClassifier(BaseClassifier):
2727
2828
Parameters
2929
----------
30-
num_kernels : int, default=10,000
30+
n_kernels : int, default=10,000
3131
The number of kernels for the Rocket transform.
3232
max_dilations_per_kernel : int, default=32
3333
The maximum number of dilations per kernel.
@@ -72,13 +72,13 @@ class MultiRocketClassifier(BaseClassifier):
7272
7373
Examples
7474
--------
75-
>>> from aeon.classification.convolution_based import RocketClassifier
75+
>>> from aeon.classification.convolution_based import MultiRocketClassifier
7676
>>> from aeon.datasets import load_unit_test
7777
>>> X_train, y_train = load_unit_test(split="train")
7878
>>> X_test, y_test = load_unit_test(split="test")
79-
>>> clf = RocketClassifier(num_kernels=500)
79+
>>> clf = MultiRocketClassifier(n_kernels=500)
8080
>>> clf.fit(X_train, y_train)
81-
RocketClassifier(...)
81+
MultiRocketClassifier(...)
8282
>>> y_pred = clf.predict(X_test)
8383
"""
8484

@@ -90,15 +90,15 @@ class MultiRocketClassifier(BaseClassifier):
9090

9191
def __init__(
9292
self,
93-
num_kernels=10000,
93+
n_kernels=10000,
9494
max_dilations_per_kernel=32,
9595
n_features_per_kernel=4,
9696
estimator=None,
9797
class_weight=None,
9898
n_jobs=1,
9999
random_state=None,
100100
):
101-
self.num_kernels = num_kernels
101+
self.n_kernels = n_kernels
102102
self.max_dilations_per_kernel = max_dilations_per_kernel
103103
self.n_features_per_kernel = n_features_per_kernel
104104
self.estimator = estimator
@@ -132,7 +132,7 @@ def _fit(self, X, y):
132132
self.n_cases_, self.n_channels_, self.n_timepoints_ = X.shape
133133

134134
self._transformer = MultiRocket(
135-
num_kernels=self.num_kernels,
135+
n_kernels=self.n_kernels,
136136
max_dilations_per_kernel=self.max_dilations_per_kernel,
137137
n_features_per_kernel=self.n_features_per_kernel,
138138
n_jobs=self.n_jobs,
@@ -219,10 +219,10 @@ def _get_test_params(cls, parameter_set="default"):
219219
`MyClass(**params)` or `MyClass(**params[i])` creates a valid test instance.
220220
"""
221221
if parameter_set == "results_comparison":
222-
return {"num_kernels": 100}
222+
return {"n_kernels": 100}
223223
else:
224224
return {
225-
"num_kernels": 200,
225+
"n_kernels": 200,
226226
"max_dilations_per_kernel": 8,
227227
"n_features_per_kernel": 4,
228228
}

aeon/classification/convolution_based/_rocket.py

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class RocketClassifier(BaseClassifier):
2727
2828
Parameters
2929
----------
30-
num_kernels : int, default=10,000
30+
n_kernels : int, default=10,000
3131
The number of kernels for the Rocket transform.
3232
estimator : sklearn compatible classifier or None, default=None
3333
The estimator used. If None, a RidgeClassifierCV(alphas=np.logspace(-3, 3, 10))
@@ -78,27 +78,28 @@ class RocketClassifier(BaseClassifier):
7878
>>> from aeon.datasets import load_unit_test
7979
>>> X_train, y_train = load_unit_test(split="train")
8080
>>> X_test, y_test = load_unit_test(split="test")
81-
>>> clf = RocketClassifier(num_kernels=500)
81+
>>> clf = RocketClassifier(n_kernels=500)
8282
>>> clf.fit(X_train, y_train)
8383
RocketClassifier(...)
8484
>>> y_pred = clf.predict(X_test)
8585
"""
8686

8787
_tags = {
88-
"capability:multithreading": True,
8988
"capability:multivariate": True,
89+
"capability:multithreading": True,
9090
"algorithm_type": "convolution",
91+
"X_inner_type": "numpy3D",
9192
}
9293

9394
def __init__(
9495
self,
95-
num_kernels=10000,
96+
n_kernels=10000,
9697
estimator=None,
9798
class_weight=None,
9899
n_jobs=1,
99100
random_state=None,
100101
):
101-
self.num_kernels = num_kernels
102+
self.n_kernels = n_kernels
102103
self.estimator = estimator
103104

104105
self.class_weight = class_weight
@@ -112,8 +113,8 @@ def _fit(self, X, y):
112113
113114
Parameters
114115
----------
115-
X : 3D np.ndarray
116-
The training data of shape = (n_cases, n_channels, n_timepoints).
116+
X : 3D np.ndarray or list
117+
Collection of time series.
117118
y : 3D np.ndarray
118119
The class labels, shape = (n_cases,).
119120
@@ -127,10 +128,8 @@ def _fit(self, X, y):
127128
Changes state by creating a fitted model that updates attributes
128129
ending in "_" and sets is_fitted flag to True.
129130
"""
130-
self.n_cases_, self.n_channels_, self.n_timepoints_ = X.shape
131-
132131
self._transformer = Rocket(
133-
num_kernels=self.num_kernels,
132+
n_kernels=self.n_kernels,
134133
n_jobs=self.n_jobs,
135134
random_state=self.random_state,
136135
)
@@ -160,8 +159,8 @@ def _predict(self, X) -> np.ndarray:
160159
161160
Parameters
162161
----------
163-
X : 3D np.ndarray of shape = (n_cases, n_channels, n_timepoints)
164-
The data to make predictions for.
162+
X : 3D np.ndarray or list
163+
Collection of time series.
165164
166165
Returns
167166
-------
@@ -175,8 +174,8 @@ def _predict_proba(self, X) -> np.ndarray:
175174
176175
Parameters
177176
----------
178-
X : 3D np.ndarray of shape = (n_cases, n_channels, n_timepoints)
179-
The data to make predict probabilities for.
177+
X : 3D np.ndarray or list
178+
Collection of time series.
180179
181180
Returns
182181
-------
@@ -187,9 +186,9 @@ def _predict_proba(self, X) -> np.ndarray:
187186
if callable(m):
188187
return self.pipeline_.predict_proba(X)
189188
else:
190-
dists = np.zeros((X.shape[0], self.n_classes_))
189+
dists = np.zeros((len(X), self.n_classes_))
191190
preds = self.pipeline_.predict(X)
192-
for i in range(0, X.shape[0]):
191+
for i in range(0, len(X)):
193192
dists[i, np.where(self.classes_ == preds[i])] = 1
194193
return dists
195194

@@ -215,6 +214,6 @@ def _get_test_params(cls, parameter_set="default"):
215214
`MyClass(**params)` or `MyClass(**params[i])` creates a valid test instance.
216215
"""
217216
if parameter_set == "results_comparison":
218-
return {"num_kernels": 100}
217+
return {"n_kernels": 100}
219218
else:
220-
return {"num_kernels": 20}
219+
return {"n_kernels": 20}

aeon/classification/convolution_based/tests/test_arsenal.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def test_contracted_arsenal():
2222
arsenal = Arsenal(
2323
time_limit_in_minutes=0.25,
2424
contract_max_n_estimators=3,
25-
num_kernels=20,
25+
n_kernels=20,
2626
)
2727
arsenal.fit(X_train, y_train)
2828
assert len(arsenal.estimators_) > 1
@@ -31,13 +31,13 @@ def test_contracted_arsenal():
3131
def test_arsenal():
3232
"""Test correct rocket variant is selected."""
3333
X_train, y_train = make_example_2d_numpy_collection(n_cases=20, n_timepoints=50)
34-
afc = Arsenal(num_kernels=20, n_estimators=2)
34+
afc = Arsenal(n_kernels=20, n_estimators=2)
3535
afc.fit(X_train, y_train)
3636
for i in range(afc.n_estimators):
3737
assert isinstance(afc.estimators_[i].steps[0][1], Rocket)
3838
assert len(afc.estimators_) == 2
3939
afc = Arsenal(
40-
num_kernels=100,
40+
n_kernels=100,
4141
rocket_transform="minirocket",
4242
max_dilations_per_kernel=2,
4343
n_estimators=2,
@@ -46,7 +46,7 @@ def test_arsenal():
4646
for i in range(afc.n_estimators):
4747
assert isinstance(afc.estimators_[i].steps[0][1], MiniRocket)
4848
afc = Arsenal(
49-
num_kernels=100,
49+
n_kernels=100,
5050
rocket_transform="multirocket",
5151
max_dilations_per_kernel=2,
5252
n_estimators=2,
@@ -56,7 +56,7 @@ def test_arsenal():
5656
assert isinstance(afc.estimators_[i].steps[0][1], MultiRocket)
5757
X_train, y_train = make_example_3d_numpy(n_cases=20, n_timepoints=50, n_channels=4)
5858
afc = Arsenal(
59-
num_kernels=100,
59+
n_kernels=100,
6060
rocket_transform="minirocket",
6161
max_dilations_per_kernel=2,
6262
n_estimators=2,
@@ -65,7 +65,7 @@ def test_arsenal():
6565
for i in range(afc.n_estimators):
6666
assert isinstance(afc.estimators_[i].steps[0][1], MiniRocket)
6767
afc = Arsenal(
68-
num_kernels=100,
68+
n_kernels=100,
6969
rocket_transform="multirocket",
7070
max_dilations_per_kernel=2,
7171
n_estimators=2,

0 commit comments

Comments
 (0)