Skip to content

FIX MLKNNClassificationVoter errors possibly due to scipy deprecations #548

@PSSF23

Description

@PSSF23

My issue is about fixing test errors on MLKNNClassificationVoter.

Reproducing code example:

def test_correct_vote(self):
# set random seed
np.random.seed(0)
# generate training data and classes
X = np.concatenate(
(
np.random.normal(0, 0.5, (100, 100)),
np.random.normal(1, 0.5, (100, 100)),
)
)
Y = np.concatenate((np.zeros((100, 1)), np.ones((100, 1))))
# train model
mlkcv = MLKNNClassificationVoter(5)
mlkcv.fit(X, Y)
# generate testing data and class probability
X_test = np.zeros((6, 100))
Y_test = np.zeros((6, 1))
# check if model predicts as expected
testing.assert_allclose(Y_test, mlkcv.predict(X_test), atol=1e-4)

Error message

__ TestKNNClassificationVoter.TestMLKNNClassificationVoter.test_correct_vote ___

x = 0.0

    def isintlike(x):
        """Is x appropriate as an index into a sparse matrix? Returns True
        if it can be cast safely to a machine int.
        """
        # Fast-path check to eliminate non-scalar values. operator.index would
        # catch this case too, but the exception catching is slow.
        if np.ndim(x) != 0:
            return False
        try:
>           operator.index(x)
E           TypeError: 'numpy.float64' object cannot be interpreted as an integer

venv/lib/python3.9/site-packages/scipy/sparse/_sputils.py:208: TypeError

During handling of the above exception, another exception occurred:

self = <proglearn.tests.test_voter.TestKNNClassificationVoter.TestMLKNNClassificationVoter object at 0x7fb8e1d44130>

    def test_correct_vote(self):
        # set random seed
        np.random.seed(0)
    
        # generate training data and classes
        X = np.concatenate(
            (
                np.random.normal(0, 0.5, (100, 100)),
                np.random.normal(1, 0.5, (100, 100)),
            )
        )
        Y = np.concatenate((np.zeros((100, 1)), np.ones((100, 1))))
    
        # train model
        mlkcv = MLKNNClassificationVoter(5)
>       mlkcv.fit(X, Y)

proglearn/tests/test_voter.py:96: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
proglearn/voters.py:364: in fit
    self.mlknn_.fit(X_flattened, y_flattened)
venv/lib/python3.9/site-packages/skmultilearn/adapt/mlknn.py:218: in fit
    self._cond_prob_true, self._cond_prob_false = self._compute_cond(X, self._label_cache)
venv/lib/python3.9/site-packages/skmultilearn/adapt/mlknn.py:180: in _compute_cond
    cn[label, deltas[0, label]] += 1
venv/lib/python3.9/site-packages/scipy/sparse/_lil.py:211: in __getitem__
    return IndexMixin.__getitem__(self, key)
venv/lib/python3.9/site-packages/scipy/sparse/_index.py:47: in __getitem__
    row, col = self._validate_indices(key)
venv/lib/python3.9/site-packages/scipy/sparse/_index.py:161: in _validate_indices
    if isintlike(col):
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

x = 0.0

    def isintlike(x):
        """Is x appropriate as an index into a sparse matrix? Returns True
        if it can be cast safely to a machine int.
        """
        # Fast-path check to eliminate non-scalar values. operator.index would
        # catch this case too, but the exception catching is slow.
        if np.ndim(x) != 0:
            return False
        try:
            operator.index(x)
        except (TypeError, ValueError):
            try:
                loose_int = bool(int(x) == x)
            except (TypeError, ValueError):
                return False
            if loose_int:
                msg = "Inexact indices into sparse matrices are not allowed"
>               raise ValueError(msg)
E               ValueError: Inexact indices into sparse matrices are not allowed

venv/lib/python3.9/site-packages/scipy/sparse/_sputils.py:216: ValueError
=============================== warnings summary ===============================
venv/lib/python3.9/site-packages/sklearn/utils/multiclass.py:14
  /home/circleci/project/venv/lib/python3.9/site-packages/sklearn/utils/multiclass.py:14: DeprecationWarning: Please use `spmatrix` from the `scipy.sparse` namespace, the `scipy.sparse.base` namespace is deprecated.
    from scipy.sparse.base import spmatrix

venv/lib/python3.9/site-packages/sklearn/utils/optimize.py:18
  /home/circleci/project/venv/lib/python3.9/site-packages/sklearn/utils/optimize.py:18: DeprecationWarning: Please use `line_search_wolfe2` from the `scipy.optimize` namespace, the `scipy.optimize.linesearch` namespace is deprecated.
    from scipy.optimize.linesearch import line_search_wolfe2, line_search_wolfe1

venv/lib/python3.9/site-packages/sklearn/utils/optimize.py:18
  /home/circleci/project/venv/lib/python3.9/site-packages/sklearn/utils/optimize.py:18: DeprecationWarning: Please use `line_search_wolfe1` from the `scipy.optimize` namespace, the `scipy.optimize.linesearch` namespace is deprecated.
    from scipy.optimize.linesearch import line_search_wolfe2, line_search_wolfe1

proglearn/tests/test_voter.py::TestKNNClassificationVoter::TestMLKNNClassificationVoter::test_correct_vote
  /home/circleci/project/venv/lib/python3.9/site-packages/sklearn/utils/validation.py:70: FutureWarning: Pass n_neighbors=5 as keyword args. From version 1.0 (renaming of 0.25) passing these as positional arguments will result in an error
    warnings.warn(f"Pass {args_msg} as keyword args. From version "

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
------ generated xml file: /home/circleci/project/test-reports/junit.xml -------

---------- coverage: platform linux, python 3.9.13-final-0 -----------
Coverage XML written to file coverage.xml

Version information

  • CircleCI Pytest

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions