File: Dynamic\Transforms\CopyColumns.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 CopyColumns
    {
        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(){ ImageId = 1, Features = new [] { 1.0f, 1.0f,
                    1.0f } },
 
                new InputData(){ ImageId = 2, Features = new [] { 2.0f, 2.0f,
                    2.0f } },
 
                new InputData(){ ImageId = 3, Features = new [] { 3.0f, 3.0f,
                    3.0f } },
 
                new InputData(){ ImageId = 4, Features = new [] { 4.0f, 4.0f,
                    4.0f } },
 
                new InputData(){ ImageId = 5, Features = new [] { 5.0f, 5.0f,
                    5.0f } },
 
                new InputData(){ ImageId = 6, Features = new [] { 6.0f, 6.0f,
                    6.0f } },
            };
 
            // Convert training data to IDataView.
            var dataview = mlContext.Data.LoadFromEnumerable(samples);
 
            // CopyColumns is commonly used to rename columns.
            // For example, if you want to train towards ImageId, and your trainer
            // expects a "Label" column, you can use CopyColumns to rename ImageId
            // to Label. Technically, the ImageId column still exists, but it won't
            // be materialized unless you actually need it somewhere (e.g. if you
            // were to save the transformed data without explicitly dropping the
            // column). This is a general property of IDataView's lazy evaluation.
            var pipeline = mlContext.Transforms.CopyColumns("Label", "ImageId");
 
            // Now we can transform the data and look at the output to confirm the
            // behavior of CopyColumns. Don't forget that this operation doesn't
            // actually evaluate data until we read the data below.
            var transformedData = pipeline.Fit(dataview).Transform(dataview);
 
            // We can extract the newly created column as an IEnumerable of
            // SampleInfertDataTransformed, the class we define below.
            var rowEnumerable = mlContext.Data.CreateEnumerable<TransformedData>(
                transformedData, reuseRowObject: false);
 
            // And finally, we can write out the rows of the dataset, looking at the
            // columns of interest.
            Console.WriteLine($"Label and ImageId columns obtained " +
                $"post-transformation.");
 
            foreach (var row in rowEnumerable)
                Console.WriteLine($"Label: {row.Label} ImageId: {row.ImageId}");
 
            // Expected output:
            // ImageId and Label columns obtained post-transformation.
            //  Label: 1 ImageId: 1
            //  Label: 2 ImageId: 2
            //  Label: 3 ImageId: 3
            //  Label: 4 ImageId: 4
            //  Label: 5 ImageId: 5
            //  Label: 6 ImageId: 6
        }
 
        private class InputData
        {
            public int ImageId { get; set; }
            public float[] Features { get; set; }
        }
 
        private class TransformedData : InputData
        {
            public int Label { get; set; }
        }
    }
}