ProgLearn icon indicating copy to clipboard operation
ProgLearn copied to clipboard

FIX MLKNNClassificationVoter errors possibly due to scipy deprecations

Open PSSF23 opened this issue 3 years ago • 0 comments

My issue is about fixing test errors on MLKNNClassificationVoter.

Reproducing code example:

https://github.com/neurodata/ProgLearn/blob/ca15f3b22496bee14f85627ad30e433c1bcd58b8/proglearn/tests/test_voter.py#L81-L104

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

PSSF23 avatar Sep 07 '22 13:09 PSSF23