public DataSource<T> loadDataSource(Path csvPath, String responseName) throws IOException {
        return loadDataSource(csvPath, Collections.singleton(responseName));
    }
@Test
    public void testLoadMultiOutput() throws IOException {
        URL path = CSVLoaderTest.class.getResource("/org/tribuo/data/csv/test-multioutput.csv");
        Set<String> responses = new HashSet<>(Arrays.asList("R1", "R2"));
        CSVLoader<MockMultiOutput> loader = new CSVLoader<>(new MockMultiOutputFactory());
        DataSource<MockMultiOutput> source = loader.loadDataSource(path, responses);
        MutableDataset<MockMultiOutput> data = new MutableDataset<>(source);
        assertEquals(6, data.size());

        Example<MockMultiOutput> example = data.getExample(0);
        MockMultiOutput y = example.getOutput();
        assertTrue(y.contains("R1"));
        assertFalse(y.contains("R2"));
        assertEquals(1.0, example.lookup("A").getValue(), 1e-7);

        //
        // Row #1: R1=True, R2=True
        assertTrue(data.getExample(1).getOutput().contains("R1"));
        assertTrue(data.getExample(1).getOutput().contains("R2"));

        //
        // Row #2: R1=False and R2=False.
        // In this case, the labelSet is empty and the labelString is the empty string.
        assertEquals(0, data.getExample(2).getOutput().getLabelSet().size());
        assertEquals("", data.getExample(2).getOutput().getLabelString());
        assertTrue(data.getExample(2).validateExample());

        URL singlePath = CSVLoaderTest.class.getResource("/org/tribuo/data/csv/test-multioutput-singlecolumn.csv");
        DataSource<MockMultiOutput> singleSource = loader.loadDataSource(singlePath, "Label");
        MutableDataset<MockMultiOutput> singleData = new MutableDataset<>(singleSource);
        assertEquals(6, singleData.size());

        for (int i = 0; i < 6; i++) {
            assertEquals(data.getExample(i).getOutput().getLabelString(), singleData.getExample(i).getOutput().getLabelString());
        }
    }