File: Dynamic\Transforms\DropColumns.cs
Web Access
Project: src\docs\samples\Microsoft.ML.Samples\Microsoft.ML.Samples.csproj (Microsoft.ML.Samples)
using System;
using System.Collections.Generic;
using Microsoft.ML;
 
namespace Samples.Dynamic
{
    public static class DropColumns
    {
        public static void Example()
        {
            // Create a new ML context, for ML.NET operations. It can be used for
            // exception tracking and logging, as well as the source of randomness.
            var mlContext = new MLContext();
 
            // Create a small dataset as an IEnumerable.
            var samples = new List<InputData>()
            {
                new InputData(){ Age = 21, Gender = "Male", Education = "BS",
                    ExtraColumn = 1 },
 
                new InputData(){ Age = 23, Gender = "Female", Education = "MBA",
                    ExtraColumn = 2 },
 
                new InputData(){ Age = 28, Gender = "Male", Education = "PhD",
                    ExtraColumn = 3 },
 
                new InputData(){ Age = 22, Gender = "Male", Education = "BS",
                    ExtraColumn = 4 },
 
                new InputData(){ Age = 23, Gender = "Female", Education = "MS",
                    ExtraColumn = 5 },
 
                new InputData(){ Age = 27, Gender = "Female", Education = "PhD",
                    ExtraColumn = 6 },
            };
 
            // Convert training data to IDataView.
            var dataview = mlContext.Data.LoadFromEnumerable(samples);
 
            // Drop the ExtraColumn from the dataset.
            var pipeline = mlContext.Transforms.DropColumns("ExtraColumn");
 
            // Now we can transform the data and look at the output.
            // Don't forget that this operation doesn't actually operate on data
            // until we perform an action that requires 
            // the data to be materialized.
            var transformedData = pipeline.Fit(dataview).Transform(dataview);
 
            // Now let's take a look at what the DropColumns operations did.
            // We can extract the transformed data as an IEnumerable of InputData,
            // the class we define below. When we try to pull out the Age, Gender,
            // Education and ExtraColumn columns, ML.NET will raise an exception on
            // the ExtraColumn
            try
            {
                var failingRowEnumerable = mlContext.Data.CreateEnumerable<
                    InputData>(transformedData, reuseRowObject: false);
            }
            catch (ArgumentOutOfRangeException exception)
            {
                Console.WriteLine($"ExtraColumn is not available, so an exception" +
                    $" is thrown: {exception.Message}.");
            }
 
            // Expected output:
            //  ExtraColumn is not available, so an exception is thrown: Could not find  column 'ExtraColumn'.
            //  Parameter name: Schema
 
            // And we can write a few columns out to see that the rest of the data
            // is still available.
            var rowEnumerable = mlContext.Data.CreateEnumerable<TransformedData>(
                transformedData, reuseRowObject: false);
 
            Console.WriteLine($"The columns we didn't drop are still available.");
            foreach (var row in rowEnumerable)
                Console.WriteLine($"Age: {row.Age} Gender: {row.Gender} " +
                    $"Education: {row.Education}");
 
            // Expected output:
            //  The columns we didn't drop are still available.
            //  Age: 21 Gender: Male Education: BS
            //  Age: 23 Gender: Female Education: MBA
            //  Age: 28 Gender: Male Education: PhD
            //  Age: 22 Gender: Male Education: BS
            //  Age: 23 Gender: Female Education: MS
            //  Age: 27 Gender: Female Education: PhD
        }
 
        private class InputData
        {
            public int Age { get; set; }
            public string Gender { get; set; }
            public string Education { get; set; }
            public float ExtraColumn { get; set; }
        }
 
        private class TransformedData
        {
            public int Age { get; set; }
            public string Gender { get; set; }
            public string Education { get; set; }
        }
    }
}