Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,18 +90,18 @@ ORCA-python includes sample datasets with pre-partitioned train/test splits usin
},
"configurations": {
"SVM": {
"classifier": "sklearn.svm.SVC",
"classifier": "SVC",
"parameters": {
"C": [0.001, 0.1, 1, 10, 100],
"gamma": [0.1, 1, 10]
}
},
"SVMOP": {
"classifier": "orca_python.classifiers.OrdinalDecomposition",
"classifier": "OrdinalDecomposition",
"parameters": {
"dtype": "ordered_partitions",
"decision_method": "frank_hall",
"base_classifier": "sklearn.svm.SVC",
"base_classifier": "SVC",
"parameters": {
"C": [0.01, 0.1, 1, 10],
"gamma": [0.01, 0.1, 1, 10],
Expand Down Expand Up @@ -144,7 +144,7 @@ Controls global experiment parameters.

Defines classifiers and their hyperparameters for GridSearchCV. Each configuration has a name and consists of:

- **`classifier`**: scikit-learn path or built-in ORCA-python classifier
- **`classifier`**: scikit-learn or built-in ORCA-python classifier
- **`parameters`**: hyperparameters for grid search (nested for ensemble methods)

## Running Experiments
Expand Down
8 changes: 5 additions & 3 deletions orca_python/classifiers/OrdinalDecomposition.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from sklearn.utils._param_validation import StrOptions
from sklearn.utils.validation import check_array, check_is_fitted, check_X_y

from orca_python.utilities import load_classifier
from orca_python.model_selection import load_classifier


class OrdinalDecomposition(BaseEstimator, ClassifierMixin):
Expand Down Expand Up @@ -110,7 +110,7 @@ def __init__(
self,
dtype="ordered_partitions",
decision_method="frank_hall",
base_classifier="sklearn.linear_model.LogisticRegression",
base_classifier="LogisticRegression",
parameters={},
):
self.dtype = dtype
Expand Down Expand Up @@ -161,7 +161,9 @@ def fit(self, X, y):
# Fitting n_targets - 1 classifiers
for n in range(len(class_labels[0, :])):

estimator = load_classifier(self.base_classifier, self.parameters)
estimator = load_classifier(
self.base_classifier, param_grid=self.parameters
)
estimator.fit(
X[np.where(class_labels[:, n] != 0)],
np.ravel(class_labels[np.where(class_labels[:, n] != 0), n].T),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ def test_ordinal_decomposition(X, y):
classifier = OrdinalDecomposition(
dtype="ordered_partitions",
decision_method="frank_hall",
base_classifier="sklearn.svm.SVC",
base_classifier="SVC",
parameters={"C": 1.0, "gamma": "scale", "probability": True},
)

Expand Down
16 changes: 8 additions & 8 deletions orca_python/configurations/full_functionality_test.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,18 @@
},
"configurations": {
"SVM": {
"classifier": "sklearn.svm.SVC",
"classifier": "SVC",
"parameters": {
"C": [0.001, 0.1, 1, 10, 100],
"gamma": [0.1, 1, 10]
}
},
"SVMOP": {
"classifier": "orca_python.classifiers.OrdinalDecomposition",
"classifier": "OrdinalDecomposition",
"parameters": {
"dtype": "ordered_partitions",
"decision_method": "frank_hall",
"base_classifier": "sklearn.svm.SVC",
"base_classifier": "SVC",
"parameters": {
"C": [0.01, 0.1, 1, 10],
"gamma": [0.01, 0.1, 1, 10],
Expand All @@ -38,11 +38,11 @@
}
},
"LR": {
"classifier": "orca_python.classifiers.OrdinalDecomposition",
"classifier": "OrdinalDecomposition",
"parameters": {
"dtype": ["ordered_partitions", "one_vs_next"],
"decision_method": "exponential_loss",
"base_classifier": "sklearn.linear_model.LogisticRegression",
"base_classifier": "LogisticRegression",
"parameters": {
"solver": ["liblinear"],
"C": [0.01, 0.1, 1, 10],
Expand All @@ -52,19 +52,19 @@
}
},
"REDSVM": {
"classifier": "orca_python.classifiers.REDSVM",
"classifier": "REDSVM",
"parameters": {
"kernel": "rbf",
"degree": 3,
"gamma": 0.1,
"coef0": 0,
"C": 1,
"tol": 0.001,
"shrinking": 1
"shrinking": true
}
},
"SVOREX": {
"classifier": "orca_python.classifiers.SVOREX",
"classifier": "SVOREX",
"parameters": {
"kernel": "gaussian",
"C": [0.1, 1, 10],
Expand Down
2 changes: 1 addition & 1 deletion orca_python/configurations/nnop_mae_test.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
},
"configurations": {
"NNOP-MAE": {
"classifier": "orca_python.classifiers.NNOP",
"classifier": "NNOP",
"parameters": {
"epsilon_init": 0.5,
"n_hidden": [5, 10, 20, 30, 40, 50],
Expand Down
2 changes: 1 addition & 1 deletion orca_python/configurations/nnop_mze_test.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
},
"configurations": {
"NNOP-MZE": {
"classifier": "orca_python.classifiers.NNOP",
"classifier": "NNOP",
"parameters": {
"epsilon_init": 0.5,
"n_hidden": [5, 10, 20, 30, 40, 50],
Expand Down
2 changes: 1 addition & 1 deletion orca_python/configurations/nnpom_mae_test.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
},
"configurations": {
"NNPOM-MAE": {
"classifier": "orca_python.classifiers.NNPOM",
"classifier": "NNPOM",
"parameters": {
"epsilon_init": 0.5,
"n_hidden": [5, 10, 20, 30, 40, 50],
Expand Down
2 changes: 1 addition & 1 deletion orca_python/configurations/nnpom_mze_test.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
},
"configurations": {
"NNPOM-MZE": {
"classifier": "orca_python.classifiers.NNPOM",
"classifier": "NNPOM",
"parameters": {
"epsilon_init": 0.5,
"n_hidden": [5, 10, 20, 30, 40, 50],
Expand Down
2 changes: 1 addition & 1 deletion orca_python/configurations/redsvm_test.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
},
"configurations": {
"REDSVM": {
"classifier": "orca_python.classifiers.REDSVM",
"classifier": "REDSVM",
"parameters": {
"kernel": "rbf",
"C": [0.001, 0.01, 0.1, 1, 10, 100, 1000],
Expand Down
4 changes: 2 additions & 2 deletions orca_python/configurations/svmop_test.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@
},
"configurations": {
"SVMOP": {
"classifier": "orca_python.classifiers.OrdinalDecomposition",
"classifier": "OrdinalDecomposition",
"parameters": {
"dtype": "ordered_partitions",
"decision_method": "frank_hall",
"base_classifier": "sklearn.svm.SVC",
"base_classifier": "SVC",
"parameters": {
"C": [0.1, 1, 10],
"gamma": [0.1, 1, 10],
Expand Down
2 changes: 1 addition & 1 deletion orca_python/configurations/svorex_test.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
},
"configurations": {
"SVOREX": {
"classifier": "orca_python.classifiers.SVOREX",
"classifier": "SVOREX",
"parameters": {
"kernel": "gaussian",
"C": [0.001, 0.01, 0.1, 1, 10, 100, 1000],
Expand Down
4 changes: 0 additions & 4 deletions orca_python/utilities/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,12 @@

from .utilities import (
Utilities,
check_for_random_state,
check_packages_version,
get_key,
load_classifier,
)

__all__ = [
"Utilities",
"check_packages_version",
"load_classifier",
"check_for_random_state",
"get_key",
]
129 changes: 4 additions & 125 deletions orca_python/utilities/tests/test_utilities.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import pytest

from orca_python.testing import TEST_DATASETS_DIR
from orca_python.utilities import Utilities, load_classifier
from orca_python.utilities import Utilities


@pytest.fixture
Expand Down Expand Up @@ -130,127 +130,6 @@ def test_standardize_data(util):
npt.assert_almost_equal(np.std(std_X_train), 1)


def test_load_algorithm():
# Loading a method from within this framework
from orca_python.classifiers import OrdinalDecomposition

imported_class = load_classifier("orca_python.classifiers.OrdinalDecomposition")
npt.assert_equal(imported_class, OrdinalDecomposition)

# Loading a scikit-learn classifier
from sklearn.svm import SVC

imported_class = load_classifier("sklearn.svm.SVC")
npt.assert_equal(imported_class, SVC)

# Raising exceptions when the classifier cannot be loaded
with pytest.raises(ImportError):
load_classifier("sklearn.svm.SVC.submethod")
with pytest.raises(AttributeError):
load_classifier("sklearn.svm.SVCC")


def test_check_params(util):
"""Testing functionality of check_params method.

It will test the 3 different scenarios contemplated within the framework
for passing the configuration.

"""
# Normal use of configuration file with a non nested method
util.configurations = {
"conf1": {
"classifier": "sklearn.svm.SVC",
"parameters": {
"C": [0.1, 1, 10],
"gamma": [0.1, 1, 100],
"probability": "True",
},
}
}

# Getting formatted_params and expected_params
util._check_params()
formatted_params = util.configurations["conf1"]["parameters"]

random_state = util.configurations["conf1"]["parameters"]["random_state"]
expected_params = {
"C": [0.1, 1, 10],
"gamma": [0.1, 1, 100],
"probability": ["True"],
"random_state": random_state,
}

npt.assert_equal(formatted_params, expected_params)

# Configuration file using an ensemble method
util.configurations = {
"conf2": {
"classifier": "orca_python.classifiers.OrdinalDecomposition",
"parameters": {
"dtype": "OrderedPartitions",
"base_classifier": "sklearn.svm.SVC",
"parameters": {"C": [1, 10], "gamma": [1, 10], "probability": ["True"]},
},
}
}

# Getting formatted_params and expected_params
util._check_params()
formatted_params = util.configurations["conf2"]["parameters"]

random_state = util.configurations["conf2"]["parameters"]["parameters"][0][
"random_state"
]
expected_params = {
"dtype": ["OrderedPartitions"],
"base_classifier": ["sklearn.svm.SVC"],
"parameters": [
{"C": 1, "gamma": 1, "probability": True, "random_state": random_state},
{"C": 1, "gamma": 10, "probability": True, "random_state": random_state},
{"C": 10, "gamma": 1, "probability": True, "random_state": random_state},
{"C": 10, "gamma": 10, "probability": True, "random_state": random_state},
],
}

# Ordering list of parameters from formatted_params to prevent inconsistencies
formatted_params["parameters"] = sorted(
formatted_params["parameters"], key=lambda k: k["C"]
)

npt.assert_equal(expected_params, formatted_params)

# Configuration file where it's not necessary to perform cross-validation
util.configurations = {
"conf3": {
"classifier": "orca_python.classifiers.OrdinalDecomposition",
"parameters": {
"dtype": "OrderedPartitions",
"base_classifier": "sklearn.svm.SVC",
"parameters": {"C": [1], "gamma": [1]},
},
}
}

# Getting formatted_params and expected_params
util._check_params()
formatted_params = util.configurations["conf3"]["parameters"]

random_state = util.configurations["conf3"]["parameters"]["parameters"][
"random_state"
]
expected_params = {
"dtype": "OrderedPartitions",
"base_classifier": "sklearn.svm.SVC",
"parameters": {"C": 1, "gamma": 1, "random_state": random_state},
}

npt.assert_equal(formatted_params, expected_params)

# Resetting configurations to not interfere with other experiments
util.configurations = {}


@pytest.fixture
def main_folder():
return Path(__file__).parent.parent.parent
Expand Down Expand Up @@ -279,15 +158,15 @@ def general_conf(dataset_folder):
def configurations():
return {
"SVM": {
"classifier": "sklearn.svm.SVC",
"classifier": "SVC",
"parameters": {"C": [0.001, 0.1, 1, 10, 100], "gamma": [0.1, 1, 10]},
},
"SVMOP": {
"classifier": "orca_python.classifiers.OrdinalDecomposition",
"classifier": "OrdinalDecomposition",
"parameters": {
"dtype": "ordered_partitions",
"decision_method": "frank_hall",
"base_classifier": "sklearn.svm.SVC",
"base_classifier": "SVC",
"parameters": {
"C": [0.01, 0.1, 1, 10],
"gamma": [0.01, 0.1, 1, 10],
Expand Down
Loading