Best Python code snippet using molotov_python
test_brain.py
Source:test_brain.py  
1# -*- coding: utf-8 -*-2#3# Authors: Alexandre Gramfort <alexandre.gramfort@inria.fr>4#          Eric Larson <larson.eric.d@gmail.com>5#          Joan Massich <mailsik@gmail.com>6#          Guillaume Favelier <guillaume.favelier@gmail.com>7#          Oleh Kozynets <ok7mailbox@gmail.com>8#9# License: Simplified BSD10import os11import os.path as op12import sys13import pytest14import numpy as np15from numpy.testing import assert_allclose, assert_array_equal16from mne import (read_source_estimate, read_evokeds, read_cov,17                 read_forward_solution, pick_types_forward,18                 SourceEstimate, MixedSourceEstimate, write_surface,19                 VolSourceEstimate, vertex_to_mni)20from mne.minimum_norm import apply_inverse, make_inverse_operator21from mne.source_space import (read_source_spaces,22                              setup_volume_source_space)23from mne.datasets import testing24from mne.fixes import _cell_data25from mne.io import read_info26from mne.utils import check_version27from mne.label import read_label28from mne.viz._brain import Brain, _LinkViewer, _BrainScraper, _LayeredMesh29from mne.viz._brain.colormap import calculate_lut30from matplotlib import cm, image31from matplotlib.lines import Line2D32data_path = testing.data_path(download=False)33subject_id = 'sample'34subjects_dir = op.join(data_path, 'subjects')35sample_dir = op.join(data_path, 'MEG', 'sample')36fname_raw_testing = op.join(sample_dir, 'sample_audvis_trunc_raw.fif')37fname_trans = op.join(sample_dir, 'sample_audvis_trunc-trans.fif')38fname_stc = op.join(sample_dir, 'sample_audvis_trunc-meg')39fname_label = op.join(sample_dir, 'labels', 'Vis-lh.label')40fname_cov = op.join(sample_dir, 'sample_audvis_trunc-cov.fif')41fname_evoked = op.join(sample_dir, 'sample_audvis_trunc-ave.fif')42fname_fwd = op.join(sample_dir, 'sample_audvis_trunc-meg-eeg-oct-4-fwd.fif')43src_fname = op.join(subjects_dir, subject_id, 'bem', 'sample-oct-6-src.fif')44class _Collection(object):45    def __init__(self, actors):46        self._actors = actors47    def GetNumberOfItems(self):48        return len(self._actors)49    def GetItemAsObject(self, ii):50        return self._actors[ii]51class TstVTKPicker(object):52    """Class to test cell picking."""53    def __init__(self, mesh, cell_id, hemi, brain):54        self.mesh = mesh55        self.cell_id = cell_id56        self.point_id = None57        self.hemi = hemi58        self.brain = brain59        self._actors = ()60    def GetCellId(self):61        """Return the picked cell."""62        return self.cell_id63    def GetDataSet(self):64        """Return the picked mesh."""65        return self.mesh66    def GetPickPosition(self):67        """Return the picked position."""68        if self.hemi == 'vol':69            self.point_id = self.cell_id70            return self.brain._data['vol']['grid_coords'][self.cell_id]71        else:72            vtk_cell = self.mesh.GetCell(self.cell_id)73            cell = [vtk_cell.GetPointId(point_id) for point_id74                    in range(vtk_cell.GetNumberOfPoints())]75            self.point_id = cell[0]76            return self.mesh.points[self.point_id]77    def GetProp3Ds(self):78        """Return all picked Prop3Ds."""79        return _Collection(self._actors)80    def GetRenderer(self):81        """Return the "renderer"."""82        return self  # set this to also be the renderer and active camera83    GetActiveCamera = GetRenderer84    def GetPosition(self):85        """Return the position."""86        return np.array(self.GetPickPosition()) - (0, 0, 100)87def test_layered_mesh(renderer_interactive_pyvistaqt):88    """Test management of scalars/colormap overlay."""89    mesh = _LayeredMesh(90        renderer=renderer_interactive_pyvistaqt._get_renderer(size=(300, 300)),91        vertices=np.array([[0, 0, 0], [1, 0, 0], [0, 1, 0], [1, 1, 0]]),92        triangles=np.array([[0, 1, 2], [1, 2, 3]]),93        normals=np.array([[0, 0, 1]] * 4),94    )95    assert not mesh._is_mapped96    mesh.map()97    assert mesh._is_mapped98    assert mesh._current_colors is None99    assert mesh._cached_colors is None100    mesh.update()101    assert len(mesh._overlays) == 0102    mesh.add_overlay(103        scalars=np.array([0, 1, 1, 0]),104        colormap=np.array([(1, 1, 1, 1), (0, 0, 0, 0)]),105        rng=[0, 1],106        opacity=None,107        name='test1',108    )109    assert mesh._current_colors is not None110    assert mesh._cached_colors is None111    assert len(mesh._overlays) == 1112    assert 'test1' in mesh._overlays113    mesh.add_overlay(114        scalars=np.array([1, 0, 0, 1]),115        colormap=np.array([(1, 1, 1, 1), (0, 0, 0, 0)]),116        rng=[0, 1],117        opacity=None,118        name='test2',119    )120    assert mesh._current_colors is not None121    assert mesh._cached_colors is not None122    assert len(mesh._overlays) == 2123    assert 'test2' in mesh._overlays124    mesh.remove_overlay('test2')125    assert 'test2' not in mesh._overlays126    mesh.update()127    assert len(mesh._overlays) == 1128    mesh._clean()129@testing.requires_testing_data130def test_brain_gc(renderer_pyvistaqt, brain_gc):131    """Test that a minimal version of Brain gets GC'ed."""132    brain = Brain('fsaverage', 'both', 'inflated', subjects_dir=subjects_dir)133    brain.close()134@testing.requires_testing_data135def test_brain_routines(renderer, brain_gc):136    """Test backend agnostic Brain routines."""137    brain_klass = renderer.get_brain_class()138    from mne.viz._brain import Brain139    assert brain_klass == Brain140@testing.requires_testing_data141def test_brain_init(renderer_pyvistaqt, tmp_path, pixel_ratio, brain_gc):142    """Test initialization of the Brain instance."""143    from mne.source_estimate import _BaseSourceEstimate144    class FakeSTC(_BaseSourceEstimate):145        def __init__(self):146            pass147    hemi = 'lh'148    surf = 'inflated'149    cortex = 'low_contrast'150    title = 'test'151    size = (300, 300)152    kwargs = dict(subject_id=subject_id, subjects_dir=subjects_dir)153    with pytest.raises(ValueError, match='"size" parameter must be'):154        Brain(hemi=hemi, surf=surf, size=[1, 2, 3], **kwargs)155    with pytest.raises(ValueError, match='.*hemi.*Allowed values.*'):156        Brain(hemi='foo', surf=surf, **kwargs)157    with pytest.raises(ValueError, match='.*view.*Allowed values.*'):158        Brain(hemi='lh', surf=surf, views='foo', **kwargs)159    with pytest.raises(TypeError, match='figure'):160        Brain(hemi=hemi, surf=surf, figure='foo', **kwargs)161    with pytest.raises(TypeError, match='interaction'):162        Brain(hemi=hemi, surf=surf, interaction=0, **kwargs)163    with pytest.raises(ValueError, match='interaction'):164        Brain(hemi=hemi, surf=surf, interaction='foo', **kwargs)165    with pytest.raises(FileNotFoundError, match=r'lh\.whatever'):166        Brain(subject_id, 'lh', 'whatever')167    with pytest.raises(ValueError, match='`surf` cannot be seghead'):168        Brain(hemi='lh', surf='seghead', **kwargs)169    with pytest.raises(ValueError, match='RGB argument'):170        Brain('sample', cortex='badcolor')171    Brain(subject_id, hemi=None, surf=None)  # test no surfaces172    renderer_pyvistaqt.backend._close_all()173    brain = Brain(hemi=hemi, surf=surf, size=size, title=title,174                  cortex=cortex, units='m',175                  silhouette=dict(decimate=0.95), **kwargs)176    assert 'data' not in brain._actors177    with pytest.raises(TypeError, match='not supported'):178        brain._check_stc(hemi='lh', array=FakeSTC(), vertices=None)179    with pytest.raises(ValueError, match='add_data'):180        brain.setup_time_viewer(time_viewer=True)181    brain._hemi = 'foo'  # for testing: hemis182    with pytest.raises(ValueError, match='not be None'):183        brain._check_hemi(hemi=None)184    with pytest.raises(ValueError, match='Invalid.*hemi.*Allowed'):185        brain._check_hemi(hemi='foo')186    brain._hemi = hemi  # end testing: hemis187    with pytest.raises(ValueError, match='bool or positive'):188        brain._to_borders(None, None, 'foo')189    assert brain.interaction == 'trackball'190    # add_data191    stc = read_source_estimate(fname_stc)192    fmin = stc.data.min()193    fmax = stc.data.max()194    for h in brain._hemis:195        if h == 'lh':196            hi = 0197        else:198            hi = 1199        hemi_data = stc.data[:len(stc.vertices[hi]), 10]200        hemi_vertices = stc.vertices[hi]201        with pytest.raises(TypeError, match='scale_factor'):202            brain.add_data(hemi_data, hemi=h, scale_factor='foo')203        with pytest.raises(TypeError, match='vector_alpha'):204            brain.add_data(hemi_data, hemi=h, vector_alpha='foo')205        with pytest.raises(ValueError, match='thresh'):206            brain.add_data(hemi_data, hemi=h, thresh=-1)207        with pytest.raises(ValueError, match='remove_existing'):208            brain.add_data(hemi_data, hemi=h, remove_existing=-1)209        with pytest.raises(ValueError, match='time_label_size'):210            brain.add_data(hemi_data, hemi=h, time_label_size=-1,211                           vertices=hemi_vertices)212        with pytest.raises(ValueError, match='is positive'):213            brain.add_data(hemi_data, hemi=h, smoothing_steps=-1,214                           vertices=hemi_vertices)215        with pytest.raises(TypeError, match='int or NoneType'):216            brain.add_data(hemi_data, hemi=h, smoothing_steps='foo')217        with pytest.raises(ValueError, match='dimension mismatch'):218            brain.add_data(array=np.array([0, 1, 2]), hemi=h,219                           vertices=hemi_vertices)220        with pytest.raises(ValueError, match='vertices parameter must not be'):221            brain.add_data(hemi_data, fmin=fmin, hemi=hemi,222                           fmax=fmax, vertices=None)223        with pytest.raises(ValueError, match='has shape'):224            brain.add_data(hemi_data[:, np.newaxis], fmin=fmin, hemi=hemi,225                           fmax=fmax, vertices=None, time=[0, 1])226        brain.add_data(hemi_data, fmin=fmin, hemi=h, fmax=fmax,227                       colormap='hot', vertices=hemi_vertices,228                       smoothing_steps='nearest', colorbar=(0, 0), time=None)229        with pytest.raises(ValueError, match='brain has no defined times'):230            brain.set_time(0.)231        assert brain.data['lh']['array'] is hemi_data232        assert brain.views == ['lateral']233        assert brain.hemis == ('lh',)234        brain.add_data(hemi_data[:, np.newaxis], fmin=fmin, hemi=h, fmax=fmax,235                       colormap='hot', vertices=hemi_vertices,236                       smoothing_steps=1, initial_time=0., colorbar=False,237                       time=[0])238        with pytest.raises(ValueError, match='the range of available times'):239            brain.set_time(7.)240        brain.set_time(0.)241        brain.set_time_point(0)  # should hit _safe_interp1d242        with pytest.raises(ValueError, match='consistent with'):243            brain.add_data(hemi_data[:, np.newaxis], fmin=fmin, hemi=h,244                           fmax=fmax, colormap='hot', vertices=hemi_vertices,245                           smoothing_steps='nearest', colorbar=False,246                           time=[1])247        with pytest.raises(ValueError, match='different from'):248            brain.add_data(hemi_data[:, np.newaxis][:, [0, 0]],249                           fmin=fmin, hemi=h, fmax=fmax, colormap='hot',250                           vertices=hemi_vertices)251        with pytest.raises(ValueError, match='need shape'):252            brain.add_data(hemi_data[:, np.newaxis], time=[0, 1],253                           fmin=fmin, hemi=h, fmax=fmax, colormap='hot',254                           vertices=hemi_vertices)255        with pytest.raises(ValueError, match='If array has 3'):256            brain.add_data(hemi_data[:, np.newaxis, np.newaxis],257                           fmin=fmin, hemi=h, fmax=fmax, colormap='hot',258                           vertices=hemi_vertices)259    assert len(brain._actors['data']) == 4260    brain.remove_data()261    assert 'data' not in brain._actors262    # add label263    label = read_label(fname_label)264    with pytest.raises(ValueError, match="not a filename"):265        brain.add_label(0)266    with pytest.raises(ValueError, match="does not exist"):267        brain.add_label('foo', subdir='bar')268    label.name = None  # test unnamed label269    brain.add_label(label, scalar_thresh=0., color="green")270    assert isinstance(brain.labels[label.hemi], list)271    overlays = brain._layered_meshes[label.hemi]._overlays272    assert 'unnamed0' in overlays273    assert np.allclose(overlays['unnamed0']._colormap[0],274                       [0, 0, 0, 0])  # first component is transparent275    assert np.allclose(overlays['unnamed0']._colormap[1],276                       [0, 128, 0, 255])  # second is green277    brain.remove_labels()278    assert 'unnamed0' not in overlays279    brain.add_label(fname_label)280    brain.add_label('V1', borders=True)281    brain.remove_labels()282    brain.remove_labels()283    # add foci284    brain.add_foci([0], coords_as_verts=True,285                   hemi=hemi, color='blue')286    # add head and skull287    brain.add_head(color='red', alpha=0.1)288    brain.remove_head()289    brain.add_skull(outer=True, color='green', alpha=0.1)290    brain.remove_skull()291    # add volume labels292    brain.add_volume_labels(293        aseg='aseg', labels=('Brain-Stem', 'Left-Hippocampus',294                             'Left-Amygdala'))295    brain.remove_volume_labels()296    # add sensors297    info = read_info(fname_raw_testing)298    brain.add_sensors(info, trans=fname_trans)299    for kind in ('meg', 'eeg', 'fnirs', 'ecog', 'seeg', 'dbs', 'helmet'):300        brain.remove_sensors(kind)301    brain.add_sensors(info, trans=fname_trans)302    brain.remove_sensors()303    info['chs'][0]['coord_frame'] = 99304    with pytest.raises(RuntimeError, match='must be "meg", "head" or "mri"'):305        brain.add_sensors(info, trans=fname_trans)306    # add text307    brain.add_text(x=0, y=0, text='foo')308    with pytest.raises(ValueError, match='already exists'):309        brain.add_text(x=0, y=0, text='foo')310    brain.remove_text('foo')311    brain.add_text(x=0, y=0, text='foo')312    brain.remove_text()313    brain.close()314    # add annotation315    annots = ['aparc', op.join(subjects_dir, 'fsaverage', 'label',316                               'lh.PALS_B12_Lobes.annot')]317    borders = [True, 2]318    alphas = [1, 0.5]319    colors = [None, 'r']320    brain = Brain(subject_id='fsaverage', hemi='both', size=size,321                  surf='inflated', subjects_dir=subjects_dir)322    with pytest.raises(RuntimeError, match="both hemispheres"):323        brain.add_annotation(annots[-1])324    with pytest.raises(ValueError, match="does not exist"):325        brain.add_annotation('foo')326    brain.close()327    brain = Brain(subject_id='fsaverage', hemi=hemi, size=size,328                  surf='inflated', subjects_dir=subjects_dir)329    for a, b, p, color in zip(annots, borders, alphas, colors):330        brain.add_annotation(a, b, p, color=color)331    view_args = dict(roll=1, distance=500, focalpoint=(1e-5, 1e-5, 1e-5))332    cam = brain._renderer.figure.plotter.camera333    previous_roll = cam.GetRoll()334    brain.show_view(**view_args)335    assert_allclose(cam.GetFocalPoint(), view_args["focalpoint"])336    assert_allclose(cam.GetDistance(), view_args["distance"])337    assert_allclose(cam.GetRoll(), previous_roll + view_args["roll"])338    del view_args339    # image and screenshot340    fname = op.join(str(tmp_path), 'test.png')341    assert not op.isfile(fname)342    brain.save_image(fname)343    assert op.isfile(fname)344    fp = np.array(345        brain._renderer.figure.plotter.renderer.ComputeVisiblePropBounds())346    fp = (fp[1::2] + fp[::2]) * 0.5347    azimuth, elevation = 180., 90.348    for view_args in (dict(azimuth=azimuth, elevation=elevation,349                           focalpoint='auto'),350                      dict(view='lateral', hemi='lh')):351        brain.show_view(**view_args)352        assert_allclose(brain._renderer.figure._azimuth, azimuth)353        assert_allclose(brain._renderer.figure._elevation, elevation)354        assert_allclose(cam.GetFocalPoint(), fp)355    del view_args356    img = brain.screenshot(mode='rgba')357    want_size = np.array([size[0] * pixel_ratio, size[1] * pixel_ratio, 4])358    assert_allclose(img.shape, want_size)359    brain.close()360@testing.requires_testing_data361@pytest.mark.skipif(os.getenv('CI_OS_NAME', '') == 'osx',362                    reason='Unreliable/segfault on macOS CI')363@pytest.mark.parametrize('hemi', ('lh', 'rh'))364def test_single_hemi(hemi, renderer_interactive_pyvistaqt, brain_gc):365    """Test single hemi support."""366    stc = read_source_estimate(fname_stc)367    idx, order = (0, 1) if hemi == 'lh' else (1, -1)368    stc = SourceEstimate(369        getattr(stc, f'{hemi}_data'), [stc.vertices[idx], []][::order],370        0, 1, 'sample')371    brain = stc.plot(372        subjects_dir=subjects_dir, hemi='both', size=300,373        cortex='0.5')  # single cortex string arg374    brain.close()375    # test skipping when len(vertices) == 0376    stc.vertices[1 - idx] = np.array([])377    brain = stc.plot(378        subjects_dir=subjects_dir, hemi=hemi, size=300)379    brain.close()380@testing.requires_testing_data381@pytest.mark.slowtest382def test_brain_save_movie(tmp_path, renderer, brain_gc):383    """Test saving a movie of a Brain instance."""384    from imageio_ffmpeg import count_frames_and_secs385    brain = _create_testing_brain(hemi='lh', time_viewer=False,386                                  cortex=['r', 'b'])  # custom binarized387    filename = str(op.join(tmp_path, "brain_test.mov"))388    for interactive_state in (False, True):389        # for coverage, we set interactivity390        if interactive_state:391            brain._renderer.plotter.enable()392        else:393            brain._renderer.plotter.disable()394        with pytest.raises(TypeError, match='unexpected keyword argument'):395            brain.save_movie(filename, time_dilation=1, tmin=1, tmax=1.1,396                             bad_name='blah')397        assert not op.isfile(filename)398        tmin = 1399        tmax = 5400        duration = np.floor(tmax - tmin)401        brain.save_movie(filename, time_dilation=1., tmin=tmin,402                         tmax=tmax, interpolation='nearest')403        assert op.isfile(filename)404        _, nsecs = count_frames_and_secs(filename)405        assert_allclose(duration, nsecs, atol=0.2)406        os.remove(filename)407    brain.close()408_TINY_SIZE = (350, 300)409def tiny(tmp_path):410    """Create a tiny fake brain."""411    # This is a minimal version of what we need for our viz-with-timeviewer412    # support currently413    subject = 'test'414    (tmp_path / subject).mkdir()415    subject_dir = tmp_path / subject416    (subject_dir / 'surf').mkdir()417    surf_dir = subject_dir / 'surf'418    rng = np.random.RandomState(0)419    rr = rng.randn(4, 3)420    tris = np.array([[0, 1, 2], [2, 1, 3]])421    curv = rng.randn(len(rr))422    with open(surf_dir / 'lh.curv', 'wb') as fid:423        fid.write(np.array([255, 255, 255], dtype=np.uint8))424        fid.write(np.array([len(rr), 0, 1], dtype='>i4'))425        fid.write(curv.astype('>f4'))426    write_surface(surf_dir / 'lh.white', rr, tris)427    write_surface(surf_dir / 'rh.white', rr, tris)  # needed for vertex tc428    vertices = [np.arange(len(rr)), []]429    data = rng.randn(len(rr), 10)430    stc = SourceEstimate(data, vertices, 0, 1, subject)431    brain = stc.plot(subjects_dir=tmp_path, hemi='lh', surface='white',432                     size=_TINY_SIZE)433    # in principle this should be sufficient:434    #435    # ratio = brain.mpl_canvas.canvas.window().devicePixelRatio()436    #437    # but in practice VTK can mess up sizes, so let's just calculate it.438    sz = brain.plotter.size()439    sz = (sz.width(), sz.height())440    sz_ren = brain.plotter.renderer.GetSize()441    ratio = np.median(np.array(sz_ren) / np.array(sz))442    return brain, ratio443@pytest.mark.filterwarnings('ignore:.*constrained_layout not applied.*:')444def test_brain_screenshot(renderer_interactive_pyvistaqt, tmp_path, brain_gc):445    """Test time viewer screenshot."""446    # XXX disable for sprint because it's too unreliable447    if sys.platform == 'darwin' and os.getenv('GITHUB_ACTIONS', '') == 'true':448        pytest.skip('Test is unreliable on GitHub Actions macOS')449    tiny_brain, ratio = tiny(tmp_path)450    img_nv = tiny_brain.screenshot(time_viewer=False)451    want = (_TINY_SIZE[1] * ratio, _TINY_SIZE[0] * ratio, 3)452    assert img_nv.shape == want453    img_v = tiny_brain.screenshot(time_viewer=True)454    assert img_v.shape[1:] == want[1:]455    assert_allclose(img_v.shape[0], want[0] * 4 / 3, atol=3)  # some slop456    tiny_brain.close()457def _assert_brain_range(brain, rng):458    __tracebackhide__ = True459    assert brain._cmap_range == rng, 'brain._cmap_range == rng'460    for hemi, layerer in brain._layered_meshes.items():461        for key, mesh in layerer._overlays.items():462            if key == 'curv':463                continue464            assert mesh._rng == rng, \465                f'_layered_meshes[{repr(hemi)}][{repr(key)}]._rng != {rng}'466@testing.requires_testing_data467@pytest.mark.slowtest468def test_brain_time_viewer(renderer_interactive_pyvistaqt, pixel_ratio,469                           brain_gc):470    """Test time viewer primitives."""471    with pytest.raises(ValueError, match="between 0 and 1"):472        _create_testing_brain(hemi='lh', show_traces=-1.0)473    with pytest.raises(ValueError, match="got unknown keys"):474        _create_testing_brain(hemi='lh', surf='white', src='volume',475                              volume_options={'foo': 'bar'})476    brain = _create_testing_brain(477        hemi='both', show_traces=False,478        brain_kwargs=dict(silhouette=dict(decimate=0.95))479    )480    # test sub routines when show_traces=False481    brain._on_pick(None, None)482    brain._configure_vertex_time_course()483    brain._configure_label_time_course()484    brain.setup_time_viewer()  # for coverage485    brain.callbacks["time"](value=0)486    assert "renderer" not in brain.callbacks487    brain.callbacks["orientation"](488        value='lat',489        update_widget=True490    )491    brain.callbacks["orientation"](492        value='medial',493        update_widget=True494    )495    brain.callbacks["time"](496        value=0.0,497        time_as_index=False,498    )499    # Need to process events for old Qt500    brain.callbacks["smoothing"](value=1)501    _assert_brain_range(brain, [0.1, 0.3])502    from mne.utils import use_log_level503    print('\nCallback fmin\n')504    with use_log_level('debug'):505        brain.callbacks["fmin"](value=12.0)506    assert brain._data["fmin"] == 12.0507    brain.callbacks["fmax"](value=4.0)508    _assert_brain_range(brain, [4.0, 4.0])509    brain.callbacks["fmid"](value=6.0)510    _assert_brain_range(brain, [4.0, 6.0])511    brain.callbacks["fmid"](value=4.0)512    brain.callbacks["fplus"]()513    brain.callbacks["fminus"]()514    brain.callbacks["fmin"](value=12.0)515    brain.callbacks["fmid"](value=4.0)516    _assert_brain_range(brain, [4.0, 12.0])517    brain._shift_time(op=lambda x, y: x + y)518    brain._shift_time(op=lambda x, y: x - y)519    brain._rotate_azimuth(15)520    brain._rotate_elevation(15)521    brain.toggle_interface()522    brain.toggle_interface(value=False)523    brain.callbacks["playback_speed"](value=0.1)524    brain.toggle_playback()525    brain.toggle_playback(value=False)526    brain.apply_auto_scaling()527    brain.restore_user_scaling()528    brain.reset()529    assert brain.help_canvas is not None530    assert not brain.help_canvas.canvas.isVisible()531    brain.help()532    assert brain.help_canvas.canvas.isVisible()533    # screenshot534    # Need to turn the interface back on otherwise the window is too wide535    # (it keeps the window size and expands the 3D area when the interface536    # is toggled off)537    brain.toggle_interface(value=True)538    brain.show_view(azimuth=180., elevation=90.)539    img = brain.screenshot(mode='rgb')540    want_shape = np.array([300 * pixel_ratio, 300 * pixel_ratio, 3])541    assert_allclose(img.shape, want_shape)542    brain.close()543@testing.requires_testing_data544@pytest.mark.parametrize('hemi', [545    'lh',546    pytest.param('rh', marks=pytest.mark.slowtest),547    pytest.param('split', marks=pytest.mark.slowtest),548    pytest.param('both', marks=pytest.mark.slowtest),549])550@pytest.mark.parametrize('src', [551    'surface',552    pytest.param('vector', marks=pytest.mark.slowtest),553    pytest.param('volume', marks=pytest.mark.slowtest),554    pytest.param('mixed', marks=pytest.mark.slowtest),555])556@pytest.mark.slowtest557def test_brain_traces(renderer_interactive_pyvistaqt, hemi, src, tmp_path,558                      brain_gc):559    """Test brain traces."""560    hemi_str = list()561    if src in ('surface', 'vector', 'mixed'):562        hemi_str.extend([hemi] if hemi in ('lh', 'rh') else ['lh', 'rh'])563    if src in ('mixed', 'volume'):564        hemi_str.extend(['vol'])565    # label traces566    brain = _create_testing_brain(567        hemi=hemi, surf='white', src=src, show_traces='label',568        volume_options=None,  # for speed, don't upsample569        n_time=5, initial_time=0,570    )571    if src == 'surface':572        brain._data['src'] = None  # test src=None573    if src in ('surface', 'vector', 'mixed'):574        assert brain.show_traces575        assert brain.traces_mode == 'label'576        brain.widgets["extract_mode"].set_value('max')577        # test picking a cell at random578        rng = np.random.RandomState(0)579        for idx, current_hemi in enumerate(hemi_str):580            if current_hemi == 'vol':581                continue582            current_mesh = brain._layered_meshes[current_hemi]._polydata583            cell_id = rng.randint(0, current_mesh.n_cells)584            test_picker = TstVTKPicker(585                current_mesh, cell_id, current_hemi, brain)586            assert len(brain.picked_patches[current_hemi]) == 0587            brain._on_pick(test_picker, None)588            assert len(brain.picked_patches[current_hemi]) == 1589            for label_id in list(brain.picked_patches[current_hemi]):590                label = brain._annotation_labels[current_hemi][label_id]591                assert isinstance(label._line, Line2D)592            brain.widgets["extract_mode"].set_value('mean')593            brain.clear_glyphs()594            assert len(brain.picked_patches[current_hemi]) == 0595            brain._on_pick(test_picker, None)  # picked and added596            assert len(brain.picked_patches[current_hemi]) == 1597            brain._on_pick(test_picker, None)  # picked again so removed598            assert len(brain.picked_patches[current_hemi]) == 0599        # test switching from 'label' to 'vertex'600        brain.widgets["annotation"].set_value('None')601        brain.widgets["extract_mode"].set_value('max')602    else:  # volume603        assert "annotation" not in brain.widgets604        assert "extract_mode" not in brain.widgets605    brain.close()606    # test colormap607    if src != 'vector':608        brain = _create_testing_brain(609            hemi=hemi, surf='white', src=src, show_traces=0.5,610            initial_time=0,611            volume_options=None,  # for speed, don't upsample612            n_time=1 if src == 'mixed' else 5, diverging=True,613            add_data_kwargs=dict(colorbar_kwargs=dict(n_labels=3)),614        )615        # mne_analyze should be chosen616        ctab = brain._data['ctable']617        assert_array_equal(ctab[0], [0, 255, 255, 255])  # opaque cyan618        assert_array_equal(ctab[-1], [255, 255, 0, 255])  # opaque yellow619        assert_allclose(ctab[len(ctab) // 2], [128, 128, 128, 0], atol=3)620        brain.close()621    # vertex traces622    brain = _create_testing_brain(623        hemi=hemi, surf='white', src=src, show_traces=0.5,624        initial_time=0,625        volume_options=None,  # for speed, don't upsample626        n_time=1 if src == 'mixed' else 5,627        add_data_kwargs=dict(colorbar_kwargs=dict(n_labels=3)),628    )629    assert brain.show_traces630    assert brain.traces_mode == 'vertex'631    assert hasattr(brain, "picked_points")632    assert hasattr(brain, "_spheres")633    assert brain._scalar_bar.GetNumberOfLabels() == 3634    # add foci should work for volumes635    brain.add_foci([[0, 0, 0]], hemi='lh' if src == 'surface' else 'vol')636    # test points picked by default637    picked_points = brain.get_picked_points()638    spheres = brain._spheres639    for current_hemi in hemi_str:640        assert len(picked_points[current_hemi]) == 1641    n_spheres = len(hemi_str)642    n_actors = n_spheres643    if hemi == 'split' and src in ('mixed', 'volume'):644        n_spheres += 1645    assert len(spheres) == n_spheres646    # test that there are actually enough actors647    assert len(brain._actors['data']) == n_actors648    # test switching from 'vertex' to 'label'649    if src == 'surface':650        brain.widgets["annotation"].set_value('aparc')651        brain.widgets["annotation"].set_value('None')652    # test removing points653    brain.clear_glyphs()654    assert len(spheres) == 0655    for key in ('lh', 'rh', 'vol'):656        assert len(picked_points[key]) == 0657    # test picking a cell at random658    rng = np.random.RandomState(0)659    for idx, current_hemi in enumerate(hemi_str):660        assert len(spheres) == 0661        if current_hemi == 'vol':662            current_mesh = brain._data['vol']['grid']663            vertices = brain._data['vol']['vertices']664            values = _cell_data(current_mesh)['values'][vertices]665            cell_id = vertices[np.argmax(np.abs(values))]666        else:667            current_mesh = brain._layered_meshes[current_hemi]._polydata668            cell_id = rng.randint(0, current_mesh.n_cells)669        test_picker = TstVTKPicker(None, None, current_hemi, brain)670        assert brain._on_pick(test_picker, None) is None671        test_picker = TstVTKPicker(672            current_mesh, cell_id, current_hemi, brain)673        assert cell_id == test_picker.cell_id674        assert test_picker.point_id is None675        brain._on_pick(test_picker, None)676        brain._on_pick(test_picker, None)677        assert test_picker.point_id is not None678        assert len(picked_points[current_hemi]) == 1679        assert picked_points[current_hemi][0] == test_picker.point_id680        assert len(spheres) > 0681        sphere = spheres[-1]682        vertex_id = sphere._vertex_id683        assert vertex_id == test_picker.point_id684        line = sphere._line685        hemi_prefix = current_hemi[0].upper()686        if current_hemi == 'vol':687            assert hemi_prefix + ':' in line.get_label()688            assert 'MNI' in line.get_label()689            continue  # the MNI conversion is more complex690        hemi_int = 0 if current_hemi == 'lh' else 1691        mni = vertex_to_mni(692            vertices=vertex_id,693            hemis=hemi_int,694            subject=brain._subject_id,695            subjects_dir=brain._subjects_dir696        )697        label = "{}:{} MNI: {}".format(698            hemi_prefix, str(vertex_id).ljust(6),699            ', '.join('%5.1f' % m for m in mni))700        assert line.get_label() == label701        # remove the sphere by clicking in its vicinity702        old_len = len(spheres)703        test_picker._actors = sum((s._actors for s in spheres), [])704        brain._on_pick(test_picker, None)705        assert len(spheres) < old_len706    screenshot = brain.screenshot()707    screenshot_all = brain.screenshot(time_viewer=True)708    assert screenshot.shape[0] < screenshot_all.shape[0]709    # and the scraper for it (will close the instance)710    # only test one condition to save time711    if not (hemi == 'rh' and src == 'surface' and712            check_version('sphinx_gallery')):713        brain.close()714        return715    fnames = [str(tmp_path / f'temp_{ii}.png') for ii in range(2)]716    block_vars = dict(image_path_iterator=iter(fnames),717                      example_globals=dict(brain=brain))718    block = ('code', """719something720# brain.save_movie(time_dilation=1, framerate=1,721#                  interpolation='linear', time_viewer=True)722#723""", 1)724    gallery_conf = dict(src_dir=str(tmp_path), compress_images=[])725    scraper = _BrainScraper()726    rst = scraper(block, block_vars, gallery_conf)727    assert brain.plotter is None  # closed728    gif_0 = fnames[0][:-3] + 'gif'729    for fname in (gif_0, fnames[1]):730        assert op.basename(fname) in rst731        assert op.isfile(fname)732        img = image.imread(fname)733        assert img.shape[1] == screenshot.shape[1]  # same width734        assert img.shape[0] > screenshot.shape[0]  # larger height735        assert img.shape[:2] == screenshot_all.shape[:2]736@testing.requires_testing_data737@pytest.mark.slowtest738def test_brain_linkviewer(renderer_interactive_pyvistaqt, brain_gc):739    """Test _LinkViewer primitives."""740    brain1 = _create_testing_brain(hemi='lh', show_traces=False)741    brain2 = _create_testing_brain(hemi='lh', show_traces='separate')742    brain1._times = brain1._times * 2743    with pytest.warns(RuntimeWarning, match='linking time'):744        link_viewer = _LinkViewer(745            [brain1, brain2],746            time=True,747            camera=False,748            colorbar=False,749            picking=False,750        )751    brain1.close()752    brain_data = _create_testing_brain(hemi='split', show_traces='vertex')753    link_viewer = _LinkViewer(754        [brain2, brain_data],755        time=True,756        camera=True,757        colorbar=True,758        picking=True,759    )760    link_viewer.leader.set_time_point(0)761    link_viewer.leader.mpl_canvas.time_func(0)762    link_viewer.leader.callbacks["fmin"](0)763    link_viewer.leader.callbacks["fmid"](0.5)764    link_viewer.leader.callbacks["fmax"](1)765    link_viewer.leader.set_playback_speed(0.1)766    link_viewer.leader.toggle_playback()767    brain2.close()768    brain_data.close()769def test_calculate_lut():770    """Test brain's colormap functions."""771    colormap = "coolwarm"772    alpha = 1.0773    fmin = 0.0774    fmid = 0.5775    fmax = 1.0776    center = None777    calculate_lut(colormap, alpha=alpha, fmin=fmin,778                  fmid=fmid, fmax=fmax, center=center)779    center = 0.0780    colormap = cm.get_cmap(colormap)781    calculate_lut(colormap, alpha=alpha, fmin=fmin,782                  fmid=fmid, fmax=fmax, center=center)783    cmap = cm.get_cmap(colormap)784    zero_alpha = np.array([1., 1., 1., 0])785    half_alpha = np.array([1., 1., 1., 0.5])786    atol = 1.5 / 256.787    # fmin < fmid < fmax788    lut = calculate_lut(colormap, alpha, 1, 2, 3)789    assert lut.shape == (256, 4)790    assert_allclose(lut[0], cmap(0) * zero_alpha, atol=atol)791    assert_allclose(lut[127], cmap(0.5), atol=atol)792    assert_allclose(lut[-1], cmap(1.), atol=atol)793    # divergent794    lut = calculate_lut(colormap, alpha, 0, 1, 2, 0)795    assert lut.shape == (256, 4)796    assert_allclose(lut[0], cmap(0), atol=atol)797    assert_allclose(lut[63], cmap(0.25), atol=atol)798    assert_allclose(lut[127], cmap(0.5) * zero_alpha, atol=atol)799    assert_allclose(lut[192], cmap(0.75), atol=atol)800    assert_allclose(lut[-1], cmap(1.), atol=atol)801    # fmin == fmid == fmax802    lut = calculate_lut(colormap, alpha, 1, 1, 1)803    zero_alpha = np.array([1., 1., 1., 0])804    assert lut.shape == (256, 4)805    assert_allclose(lut[0], cmap(0) * zero_alpha, atol=atol)806    assert_allclose(lut[1], cmap(0.5), atol=atol)807    assert_allclose(lut[-1], cmap(1.), atol=atol)808    # divergent809    lut = calculate_lut(colormap, alpha, 0, 0, 0, 0)810    assert lut.shape == (256, 4)811    assert_allclose(lut[0], cmap(0), atol=atol)812    assert_allclose(lut[127], cmap(0.5) * zero_alpha, atol=atol)813    assert_allclose(lut[-1], cmap(1.), atol=atol)814    # fmin == fmid < fmax815    lut = calculate_lut(colormap, alpha, 1, 1, 2)816    assert lut.shape == (256, 4)817    assert_allclose(lut[0], cmap(0.) * zero_alpha, atol=atol)818    assert_allclose(lut[1], cmap(0.5), atol=atol)819    assert_allclose(lut[-1], cmap(1.), atol=atol)820    # divergent821    lut = calculate_lut(colormap, alpha, 1, 1, 2, 0)822    assert lut.shape == (256, 4)823    assert_allclose(lut[0], cmap(0), atol=atol)824    assert_allclose(lut[62], cmap(0.245), atol=atol)825    assert_allclose(lut[64], cmap(0.5) * zero_alpha, atol=atol)826    assert_allclose(lut[127], cmap(0.5) * zero_alpha, atol=atol)827    assert_allclose(lut[191], cmap(0.5) * zero_alpha, atol=atol)828    assert_allclose(lut[193], cmap(0.755), atol=atol)829    assert_allclose(lut[-1], cmap(1.), atol=atol)830    lut = calculate_lut(colormap, alpha, 0, 0, 1, 0)831    assert lut.shape == (256, 4)832    assert_allclose(lut[0], cmap(0), atol=atol)833    assert_allclose(lut[126], cmap(0.25), atol=atol)834    assert_allclose(lut[127], cmap(0.5) * zero_alpha, atol=atol)835    assert_allclose(lut[129], cmap(0.75), atol=atol)836    assert_allclose(lut[-1], cmap(1.), atol=atol)837    # fmin < fmid == fmax838    lut = calculate_lut(colormap, alpha, 1, 2, 2)839    assert lut.shape == (256, 4)840    assert_allclose(lut[0], cmap(0) * zero_alpha, atol=atol)841    assert_allclose(lut[-2], cmap(0.5), atol=atol)842    assert_allclose(lut[-1], cmap(1.), atol=atol)843    # divergent844    lut = calculate_lut(colormap, alpha, 1, 2, 2, 0)845    assert lut.shape == (256, 4)846    assert_allclose(lut[0], cmap(0), atol=atol)847    assert_allclose(lut[1], cmap(0.25), atol=2 * atol)848    assert_allclose(lut[32], cmap(0.375) * half_alpha, atol=atol)849    assert_allclose(lut[64], cmap(0.5) * zero_alpha, atol=atol)850    assert_allclose(lut[127], cmap(0.5) * zero_alpha, atol=atol)851    assert_allclose(lut[191], cmap(0.5) * zero_alpha, atol=atol)852    assert_allclose(lut[223], cmap(0.625) * half_alpha, atol=atol)853    assert_allclose(lut[-2], cmap(0.7475), atol=2 * atol)854    assert_allclose(lut[-1], cmap(1.), atol=2 * atol)855    lut = calculate_lut(colormap, alpha, 0, 1, 1, 0)856    assert lut.shape == (256, 4)857    assert_allclose(lut[0], cmap(0), atol=atol)858    assert_allclose(lut[1], cmap(0.25), atol=2 * atol)859    assert_allclose(lut[64], cmap(0.375) * half_alpha, atol=atol)860    assert_allclose(lut[127], cmap(0.5) * zero_alpha, atol=atol)861    assert_allclose(lut[191], cmap(0.625) * half_alpha, atol=atol)862    assert_allclose(lut[-2], cmap(0.75), atol=2 * atol)863    assert_allclose(lut[-1], cmap(1.), atol=atol)864    with pytest.raises(ValueError, match=r'.*fmin \(1\) <= fmid \(0\) <= fma'):865        calculate_lut(colormap, alpha, 1, 0, 2)866def _create_testing_brain(hemi, surf='inflated', src='surface',867                          size=300, n_time=5, diverging=False, **kwargs):868    assert src in ('surface', 'vector', 'mixed', 'volume')869    meth = 'plot'870    if src in ('surface', 'mixed'):871        sample_src = read_source_spaces(src_fname)872        klass = MixedSourceEstimate if src == 'mixed' else SourceEstimate873    if src == 'vector':874        fwd = read_forward_solution(fname_fwd)875        fwd = pick_types_forward(fwd, meg=True, eeg=False)876        evoked = read_evokeds(fname_evoked, baseline=(None, 0))[0]877        noise_cov = read_cov(fname_cov)878        free = make_inverse_operator(879            evoked.info, fwd, noise_cov, loose=1.)880        stc = apply_inverse(evoked, free, pick_ori='vector')881        return stc.plot(882            subject=subject_id, hemi=hemi, size=size,883            subjects_dir=subjects_dir, colormap='auto',884            **kwargs)885    if src in ('volume', 'mixed'):886        vol_src = setup_volume_source_space(887            subject_id, 7., mri='aseg.mgz',888            volume_label='Left-Cerebellum-Cortex',889            subjects_dir=subjects_dir, add_interpolator=False)890        assert len(vol_src) == 1891        assert vol_src[0]['nuse'] == 150892        if src == 'mixed':893            sample_src = sample_src + vol_src894        else:895            sample_src = vol_src896            klass = VolSourceEstimate897            meth = 'plot_3d'898    assert sample_src.kind == src899    # dense version900    rng = np.random.RandomState(0)901    vertices = [s['vertno'] for s in sample_src]902    n_verts = sum(len(v) for v in vertices)903    stc_data = np.zeros((n_verts * n_time))904    stc_size = stc_data.size905    stc_data[(rng.rand(stc_size // 20) * stc_size).astype(int)] = \906        rng.rand(stc_data.size // 20)907    stc_data.shape = (n_verts, n_time)908    if diverging:909        stc_data -= 0.5910    stc = klass(stc_data, vertices, 1, 1)911    clim = dict(kind='value', lims=[0.1, 0.2, 0.3])912    if diverging:913        clim['pos_lims'] = clim.pop('lims')914    brain_data = getattr(stc, meth)(915        subject=subject_id, hemi=hemi, surface=surf, size=size,916        subjects_dir=subjects_dir, colormap='auto',917        clim=clim, src=sample_src,918        **kwargs)...validate_best_model.py
Source:validate_best_model.py  
1import pandas as pd2import numpy as np3from sklearn.neighbors import KNeighborsClassifier4import matplotlib.pyplot as plt5import seaborn as sns6from sklearn.dummy import DummyClassifier7from util import train_test_model, print_results_cv, read_dataset, input_data, rescale_data8from sklearn.model_selection import GroupKFold, cross_val_score, train_test_split9from sklearn.naive_bayes import GaussianNB10from sklearn.ensemble import AdaBoostClassifier, RandomForestClassifier, BaggingClassifier11from sklearn.tree import DecisionTreeClassifier12import time13from sklearn.manifold import TSNE14from sklearn.feature_selection import RFE, RFECV15from sklearn.feature_selection import SelectKBest16from sklearn.feature_selection import mutual_info_classif17from imblearn.under_sampling import RandomUnderSampler18# Calculando correlação e criando figura19def calc_corr_fig(standardized_values):20    plt.figure(figsize=(17, 15))21    matrix_correlation = standardized_values.corr()22    sns.heatmap(matrix_correlation, annot=True, fmt=".1f")23    plt.show()24# Visualizar em 2 dimensões os dados para facilitar o direcionamento da análise25def tsne_scatterplot(x_without_corr_feat, y):26    tsne = TSNE(n_components=2)27    tsne_x = tsne.fit_transform(x_without_corr_feat)28    sns.scatterplot(x=tsne_x[:, 0], y=tsne_x[:, 1], hue=y)29    plt.show()30def select_features(model, train_x, train_y, picker, test_x=None):31    picker.fit(train_x, train_y)32    train_picker = picker.transform(train_x)33    test_picker = None34    if test_x is not None:35        test_picker = picker.transform(test_x)36    return {'train_picker': train_picker, 'test_picker': test_picker, 'picker': picker}37def validate_models_holdout(train_x, train_y, test_x, test_y, models, k_size):38    for model in models:39        print("Imprimindo resultados da abordagem holdout para o %s" %40              model.__class__)41        t0 = time.time()42        model = train_test_model(model, train_x, train_y, test_x, test_y)43        # Se o classificador não possuir lista de importância de caracterÃsticas, seleciona-se por métrica de filtro44        try:45            picker = select_features(model, train_x, train_y, RFE(46                estimator=model, n_features_to_select=k_size, step=1), test_x)47        except:48            picker = select_features(model, train_x, train_y, SelectKBest(49                mutual_info_classif, k=k_size), test_x)50        print("Selecionando-se as caracterÃsticas com %s" % picker['picker'])51        train_test_model(model, picker['train_picker'],52                         train_y, picker['test_picker'], test_y)53        print("Tempo do modelo %s: %d" %54              (model.__class__, round(time.time()-t0, 3)))55def validate_models_cv(x, y, random_groups, models, k_size):56    for model in models:57        print("Imprimindo resultados da abordagem por validação cruzada para o %s" %58              model.__class__)59        cv = GroupKFold(n_splits=5)60        t0 = time.time()61        results = cross_val_score(62            model, x, y, cv=cv, groups=random_groups, scoring='f1_micro')63        print_results_cv(results)64        try:65            picker = select_features(model, x, y, RFECV(estimator=model, cv=5, step=1, scoring="f1_micro"), None)66        except:67            picker = select_features(model, x, y, SelectKBest(68                mutual_info_classif, k=k_size), None)69        print("Selecionando-se as caracterÃsticas com %s" % picker['picker'])70        results = cross_val_score(71            model, picker['train_picker'], y, cv=cv, groups=random_groups, scoring='f1_micro')72        print("Tempo do modelo %s: %d" %73              (model.__class__, round(time.time()-t0, 3)))74        print_results_cv(results)75def main():76    dataset = read_dataset("https://raw.githubusercontent.com/dataminerdbm/test_data_scientist/main/treino.csv")77    dataset.replace(to_replace=[None], value=np.nan, inplace=True)78    raw_dataset_values = dataset.drop(columns=['inadimplente'])79    transformed_values = input_data(raw_dataset_values)80    standardized_values = rescale_data(transformed_values, raw_dataset_values)81    # calc_corr_fig(standardized_values)82    x = standardized_values83    # Remove-se as demais caracterÃsticas correlacionadas, mantendo-se apenas uma84    x_without_corr_feat = standardized_values.drop(85        columns=['vezes_passou_de_30_59_dias', 'numero_de_vezes_que_passou_60_89_dias'])86    y = dataset.inadimplente87    SEED = 770788    np.random.seed(SEED)89    # Realiza-se a estratificação dos dados tendo em vista o desbalanceamento da base90    train_x, test_x, train_y, test_y = train_test_split(91        x, y, test_size=0.3, stratify=y)92    train_x_without_corr_feat, test_x_without_corr_feat, train_y_without_corr_feat, test_y_without_corr_feat = train_test_split(93        x_without_corr_feat, y, test_size=0.3, stratify=y)94    undersample = RandomUnderSampler(sampling_strategy='majority')95    X_without_corr_feat_under, y_without_corr_feat_under = undersample.fit_resample(x_without_corr_feat, y)96    x_under, y_under = undersample.fit_resample(x, y)97    train_x_under, train_y_under = undersample.fit_resample(train_x, train_y)98    train_x_without_corr_feat_under, train_y_without_corr_feat_under = undersample.fit_resample(train_x_without_corr_feat, train_y_without_corr_feat)99    #tsne_scatterplot(x_without_corr_feat, y)100    # Os classificadores validados foram escolhidos de acordo com o aspecto da base de dados:101    # caracterÃsticas numéricas, multidimensional com alto número de instâncias e problema não linearmente separável102    models = [DummyClassifier(), KNeighborsClassifier(), DecisionTreeClassifier(),103              GaussianNB(), AdaBoostClassifier(n_estimators=100), RandomForestClassifier(),104              BaggingClassifier(base_estimator=GaussianNB(), n_estimators=100)]105    k_size = 5106    # Criando aleatoridade nos grupos de folds (para evitar repetição). Abordagem mais adequada para bases desbalanceadas107    # https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GroupKFold.html#sklearn.model_selection.GroupKFold108    x_under['idade_r'] = x_under.idade + np.random.randint(-2, 3, size=14662)109    x_under.idade_r = x_under.idade + abs(x_under.idade.min()) + 1110    print("Validando modelos com todas as caracterÃsticas")111    validate_models_cv(x_under, y_under, x_under.idade_r, models, k_size)112    validate_models_holdout(train_x_under, train_y_under, test_x, test_y, models, k_size)113    print("Validando modelos sem as caracterÃsticas correlacionadas")114    validate_models_cv(X_without_corr_feat_under, y_without_corr_feat_under, x_under.idade_r, models, k_size)115    validate_models_holdout(train_x_without_corr_feat_under, train_y_without_corr_feat_under,116                            test_x_without_corr_feat, test_y_without_corr_feat, models, k_size)117if __name__ == "__main__":...Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
