Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FEA add plot_contingency_matrix / ContingencyMatrixDisplay #19147

Closed
wants to merge 9 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
31 changes: 31 additions & 0 deletions .travis.yml
Expand Up @@ -36,6 +36,17 @@ jobs:
- BUILD_WITH_ICC=true
if: type = cron OR commit_message =~ /\[icc-build\]/

<<<<<<< HEAD
- python: 3.7
os: linux
arch: arm64
if: type = cron OR commit_message =~ /\[arm64\]/
env:
- CPU_COUNT=8

# Linux environments to build the scikit-learn wheels
# for the ARM64 arquitecture and Python 3.6 and newer
=======
# Manual trigger of linux/arm64 tests in PR without triggering the full
# wheel building process for all the Python versions.
- python: 3.9
Expand All @@ -51,6 +62,7 @@ jobs:
# a scheduled task to build the weekly dev build on the master branch. The
# weekly frequency is meant to avoid depleting the Travis CI credits too
# fast.
>>>>>>> 9b2a3e8ba50804e5cd1e4302097e86aebd2e8464
- python: 3.6
os: linux
arch: arm64
Expand All @@ -63,16 +75,33 @@ jobs:
os: linux
arch: arm64
if: type = cron or commit_message =~ /\[cd build\]/
<<<<<<< HEAD
env:
- BUILD_WHEEL=true
- CIBW_BUILD=cp37-manylinux_aarch64

- python: 3.8
=======
env:
- BUILD_WHEEL=true
- CIBW_BUILD=cp37-manylinux_aarch64

- python: 3.8
os: linux
arch: arm64
if: type = cron or commit_message =~ /\[cd build\]/
env:
- BUILD_WHEEL=true
- CIBW_BUILD=cp38-manylinux_aarch64

- python: 3.9
>>>>>>> 9b2a3e8ba50804e5cd1e4302097e86aebd2e8464
os: linux
arch: arm64
if: type = cron or commit_message =~ /\[cd build\]/
env:
- BUILD_WHEEL=true
<<<<<<< HEAD
- CIBW_BUILD=cp38-manylinux_aarch64

- python: 3.9
Expand All @@ -81,6 +110,8 @@ jobs:
if: type = cron or commit_message =~ /\[cd build\]/
env:
- BUILD_WHEEL=true
=======
>>>>>>> 9b2a3e8ba50804e5cd1e4302097e86aebd2e8464
- CIBW_BUILD=cp39-manylinux_aarch64

install: source build_tools/travis/install.sh || travis_terminate 1
Expand Down
20 changes: 20 additions & 0 deletions build_tools/travis/install_master.sh
Expand Up @@ -50,8 +50,28 @@ conda update --yes conda
conda create -n testenv --yes python=3.7

source activate testenv
<<<<<<< HEAD

if [[ $TRAVIS_CPU_ARCH == amd64 ]]; then
echo "Upgrading pip and setuptools."
pip install --upgrade pip setuptools
echo "Installing numpy, scipy and pandas master wheels."
dev_anaconda_url=https://pypi.anaconda.org/scipy-wheels-nightly/simple
pip install --pre --upgrade --timeout=60 --extra-index $dev_anaconda_url numpy scipy pandas
echo "Installing cython pre-release wheels."
pip install --pre cython
echo "Installing joblib master."
pip install https://github.com/joblib/joblib/archive/master.zip
echo "Installing pillow master."
pip install https://github.com/python-pillow/Pillow/archive/master.zip
else
conda install -y scipy numpy pandas cython
pip install joblib threadpoolctl
fi
=======
conda install -y scipy numpy pandas cython
pip install joblib threadpoolctl
>>>>>>> 9b2a3e8ba50804e5cd1e4302097e86aebd2e8464

pip install $(get_dep pytest $PYTEST_VERSION) pytest-xdist

Expand Down
44 changes: 44 additions & 0 deletions doc/whats_new/v0.24.rst
Expand Up @@ -860,27 +860,70 @@ Thanks to everyone who has contributed to the maintenance and improvement of
the project since version 0.23, including:

Abo7atm, Adam Spannbauer, Adrin Jalali, adrinjalali, Agamemnon Krasoulis,
<<<<<<< HEAD
Akshay Deodhar, Albert Villanova del Moral, Alessandro Gentile, Alexander
Lenail, alexandracraciun, Alexandre Gramfort, Alex Henrie, Alex Itkes, Alex
Liang, alexshacked, Allan D Butler, Amanda Dsouza, amy12xx, Anand Tiwari,
Anderson Nelson, Andreas Mueller, Ankit Choraria, Archana Subramaniyan, Arthur
Imbert, Ashutosh Hathidara, Ashutosh Kushwaha, Atsushi Nukariya, Aura Munoz,
AutoViz and Auto_ViML, Avi Gupta, Avinash Anakal, Ayako YAGI, barankarakus,
barberogaston, beatrizsmg, Benjamin Bossan, Benjamin Pedigo, Ben Mainye, Bharat
=======
Akshay Deodhar, Albert Villanova del Moral, Alessandro Gentile, Alex Henrie,
Alex Itkes, Alex Liang, Alexander Lenail, alexandracraciun, Alexandre Gramfort,
alexshacked, Allan D Butler, Amanda Dsouza, amy12xx, Anand Tiwari, Anderson
Nelson, Andreas Mueller, Ankit Choraria, Archana Subramaniyan, Arthur Imbert,
Ashutosh Hathidara, Ashutosh Kushwaha, Atsushi Nukariya, Aura Munoz, AutoViz
and Auto_ViML, Avi Gupta, Avinash Anakal, Ayako YAGI, barankarakus,
barberogaston, beatrizsmg, Ben Mainye, Benjamin Bossan, Benjamin Pedigo, Bharat
>>>>>>> 9b2a3e8ba50804e5cd1e4302097e86aebd2e8464
Raghunathan, Bhavika Devnani, Biprateep Dey, bmaisonn, Bo Chang, Boris
Villazón-Terrazas, brigi, Brigitta Sipőcz, Bruno Charron, Byron Smith, Cary
Goltermann, Cat Chenal, CeeThinwa, chaitanyamogal, Charles Patel, Chiara Marmo,
Christian Kastner, Christian Lorentzen, Christoph Deil, Christos Aridas, Clara
Matos, clmbst, Coelhudo, crispinlogan, Cristina Mulas, Daniel López, Daniel
Mohns, darioka, Darshan N, david-cortes, Declan O'Neill, Deeksha Madan,
<<<<<<< HEAD
Elizabeth DuPre, Eric Fiegel, Erich Schubert, Eric Larson, Erin Khoo, Erin R
=======
Elizabeth DuPre, Eric Fiegel, Eric Larson, Erich Schubert, Erin Khoo, Erin R
>>>>>>> 9b2a3e8ba50804e5cd1e4302097e86aebd2e8464
Hoffman, eschibli, Felix Wick, fhaselbeck, Forrest Koch, Francesco Casalegno,
Frans Larsson, Gael Varoquaux, Gaurav Desai, Gaurav Sheni, genvalen, Geoffrey
Bolmier, George Armstrong, George Kiragu, Gesa Stupperich, Ghislain Antony
Vaillant, Gim Seng, Gordon Walsh, Gregory R. Lee, Guillaume Chevalier,
Guillaume Lemaitre, Haesun Park, Hannah Bohle, Hao Chun Chang, Harry Scholes,
Harsh Soni, Henry, Hirofumi Suzuki, Hitesh Somani, Hoda1394, Hugo Le Moine,
hugorichard, indecisiveuser, Isuru Fernando, Ivan Wiryadi, j0rd1smit, Jaehyun
<<<<<<< HEAD
Ahn, Jake Tae, James Hoctor, Jan Vesely, Jeevan Anand Anne, Jérémie du
Boisberranger, JeroenPeterBos, JHayes, Jiaxiang, Jie Zheng, Jigna Panchal,
jim0421, Jin Li, Joaquin Vanschoren, Joel Nothman, Jona Sassenhagen, Jonathan,
Jorge Gorbe Moya, Joseph Lucas, Joshua Newton, Juan Carlos Alfaro Jiménez,
Julien Jerphanion, Justin Huber, Kartik Chugh, Katarina Slama, kaylani2,
Kendrick Cetina, Kenny Huynh, Kevin Markham, Kevin Winata, Kiril Isakov,
kishimoto, Koki Nishihara, Krum Arnaudov, Kyle Kosic, Lauren Oldja, Laurenz
Reitsam, Lisa Schwetlick, Louis Douge, Louis Guitton, Lucy Liu, Madhura
Jayaratne, maikia, Manimaran, Manuel López-Ibáñez, Maren Westermann, Mariam-ke,
Maria Telenczuk, Marijn van Vliet, Markus Löning, Martina G. Vilas, Martina
Megasari, Martin Scheubrein, Mateusz Górski, mathschy, mathurinm, Matthias
Bussonnier, Max Del Giudice, Michael, Milan Straka, Muoki Caleb, Nadia Tahiri,
Ph. D, Naoki Hamada, Neil Botelho, N. Haiat, Nicolas Hug, Nils Werner, noelano,
Norbert Preining, oj_lappi, Oleh Kozynets, Olivier Grisel, Pankaj Jindal,
Pardeep Singh, Parthiv Chigurupati, Patrice Becker, Pete Green, pgithubs,
Poorna Kumar, Prabakaran Kumaresshan, Probinette4, pspachtholz, pwalchessen, Qi
Zhang, rachel fischoff, Rachit Toshniwal, Rafey Iqbal Rahman, Rahul Jakhar, Ram
Rachum, RamyaNP, rauwuckl, Ravi Kiran Boggavarapu, Ray Bell, Reshama Shaikh,
Richard Decal, Rishi Advani, Rithvik Rao, Rob Romijnders, roei, Romain
Tavenard, Roman Yurchak, Ruby Werman, Ryotaro Tsukada, sadak, Saket Khandelwal,
Sam, Sam Ezebunandu, Sam Kimbinyi, Sarah Brown, Saurabh Jain, Sean O. Stalley,
Sergio, Shail Shah, Shane Keller, Shao Yang Hong, Shashank Singh, Shooter23,
Shubhanshu Mishra, simonamaggio, Soledad Galli, Srimukh Sripada, Stephan
Steinfurt, subrat93, Sunitha Selvan, Swier, SylvainLan, Sylvain Marié, Teon L
Brooks, Terence Honles, Thijs van den Berg, Thomas9292, Thomas J Fan, Thomas J.
Fan, Thomas S Benjamin, Thorben Jensen, tijanajovanovic, Timo Kaufmann,
t-kusanagi2, tnwei, Tom Dupré la Tour, Trevor Waite, ufmayer, Umberto Lupo,
=======
Ahn, Jake Tae, James Hoctor, Jan Vesely, Jeevan Anand Anne, JeroenPeterBos,
JHayes, Jiaxiang, Jie Zheng, Jigna Panchal, jim0421, Jin Li, Joaquin
Vanschoren, Joel Nothman, Jona Sassenhagen, Jonathan, Jorge Gorbe Moya, Joseph
Expand Down Expand Up @@ -908,6 +951,7 @@ Stephan Steinfurt, subrat93, Sunitha Selvan, Swier, Sylvain Marié, SylvainLan,
t-kusanagi2, Teon L Brooks, Terence Honles, Thijs van den Berg, Thomas J Fan,
Thomas J. Fan, Thomas S Benjamin, Thomas9292, Thorben Jensen, tijanajovanovic,
Timo Kaufmann, tnwei, Tom Dupré la Tour, Trevor Waite, ufmayer, Umberto Lupo,
>>>>>>> 9b2a3e8ba50804e5cd1e4302097e86aebd2e8464
Venkatachalam N, Vikas Pandey, Vinicius Rios Fuck, Violeta, watchtheblur, Wenbo
Zhao, willpeppo, xavier dupré, Xethan, Xue Qianming, xun-tang, yagi-3, Yakov
Pchelintsev, Yashika Sharma, Yi-Yan Ge, Yue Wu, Yutaro Ikeda, Zaccharie Ramzi,
Expand Down
1 change: 1 addition & 0 deletions sklearn/__init__.py
Expand Up @@ -42,6 +42,7 @@
__version__ = '1.0.dev0'



# On OSX, we can get a runtime error due to multiple OpenMP libraries loaded
# simultaneously. This can happen for instance when calling BLAS inside a
# prange. Setting the following environment variable allows multiple OpenMP
Expand Down
107 changes: 107 additions & 0 deletions sklearn/metrics/_plot/tests/test_plot_contingency matrix.py
@@ -0,0 +1,107 @@
from itertools import product

import numpy as np

from ...cluster._supervised import contingency_matrix
from ....utils import check_matplotlib_support
from ....utils.multiclass import unique_labels
from ....utils.validation import _deprecate_positional_args
from ....base import is_classifier


class contingencyMatrixDisplay:
@_deprecate_positional_args
def __init__(self, contingency_matrix, *, display_labels=None):
self.contingency_matrix = contingency_matrix
self.display_labels = display_labels

@_deprecate_positional_args
def plot(self, *, include_values=True, cmap='viridis',
xticks_rotation='horizontal', values_format=None,
ax=None, colorbar=True):

check_matplotlib_support("contingencyMatrixDisplay.plot")
import matplotlib.pyplot as plt

if ax is None:
fig, ax = plt.subplots()
else:
fig = ax.figure

cm = self.contingency_matrix
n_classes = cm.shape[0]
self.im_ = ax.imshow(cm, interpolation='nearest', cmap=cmap)
self.text_ = None
cmap_min, cmap_max = self.im_.cmap(0), self.im_.cmap(256)

if include_values:
self.text_ = np.empty_like(cm, dtype=object)

# print text with appropriate color depending on background
thresh = (cm.max() + cm.min()) / 2.0

for i, j in product(range(n_classes), range(n_classes)):
color = cmap_max if cm[i, j] < thresh else cmap_min

if values_format is None:
text_cm = format(cm[i, j], '.2g')
if cm.dtype.kind != 'f':
text_d = format(cm[i, j], 'd')
if len(text_d) < len(text_cm):
text_cm = text_d
else:
text_cm = format(cm[i, j], values_format)

self.text_[i, j] = ax.text(
j, i, text_cm,
ha="center", va="center",
color=color)

if self.display_labels is None:
display_labels = np.arange(n_classes)
else:
display_labels = self.display_labels
if colorbar:
fig.colorbar(self.im_, ax=ax)
ax.set(xticks=np.arange(n_classes),
yticks=np.arange(n_classes),
xticklabels=display_labels,
yticklabels=display_labels,
ylabel="True label",
xlabel="Predicted label")

ax.set_ylim((n_classes - 0.5, -0.5))
plt.setp(ax.get_xticklabels(), rotation=xticks_rotation)

self.figure_ = fig
self.ax_ = ax
return self


@_deprecate_positional_args
def plot_contingency_matrix(estimator, X, y_true, *, labels=None,
sample_weight=None, normalize=None,
display_labels=None, include_values=True,
xticks_rotation='horizontal',
values_format=None,
cmap='inferno', ax=None, colorbar=True):

check_matplotlib_support("plot_contingency_matrix")

if not is_classifier(estimator):
raise ValueError("plot_contingency_matrix only supports classifiers")

y_pred = estimator.predict(X)
cm = contingency_matrix(y_true, y_pred, eps=None, sparse=False, dtype=np.int64)

if display_labels is None:
if labels is None:
display_labels = unique_labels(y_true, y_pred)
else:
display_labels = labels

disp = contingencyMatrixDisplay(contingency_matrix=cm,
display_labels=display_labels)
return disp.plot(include_values=include_values,
cmap=cmap, ax=ax, xticks_rotation=xticks_rotation,
values_format=values_format, colorbar=colorbar)