File: Dynamic\Transforms\Categorical\OneHotEncodingMultiColumn.cs
Web Access
Project: src\docs\samples\Microsoft.ML.Samples\Microsoft.ML.Samples.csproj (Microsoft.ML.Samples)
using System;
using Microsoft.ML;
 
namespace Samples.Dynamic.Transforms.Categorical
{
    public static class OneHotEncodingMultiColumn
    {
        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[]
            {
                new DataPoint {Education = "0-5yrs", ZipCode = "98005"},
                new DataPoint {Education = "0-5yrs", ZipCode = "98052"},
                new DataPoint {Education = "6-11yrs", ZipCode = "98005"},
                new DataPoint {Education = "6-11yrs", ZipCode = "98052"},
                new DataPoint {Education = "11-15yrs", ZipCode = "98005"}
            };
 
            // Convert training data to IDataView.
            IDataView data = mlContext.Data.LoadFromEnumerable(samples);
 
            // Multi column example: A pipeline for one hot encoding two columns
            // 'Education' and 'ZipCode'.
            var multiColumnKeyPipeline =
                mlContext.Transforms.Categorical.OneHotEncoding(
                    new[]
                    {
                        new InputOutputColumnPair("Education"),
                        new InputOutputColumnPair("ZipCode")
                    });
 
            // Fit and Transform data.
            IDataView transformedData =
                multiColumnKeyPipeline.Fit(data).Transform(data);
 
            var convertedData =
                mlContext.Data.CreateEnumerable<TransformedData>(transformedData,
                    true);
 
            Console.WriteLine(
                "One Hot Encoding of two columns 'Education' and 'ZipCode'.");
 
            // One Hot Encoding of two columns 'Education' and 'ZipCode'.
 
            foreach (TransformedData item in convertedData)
                Console.WriteLine("{0}\t\t\t{1}", string.Join(" ", item.Education),
                    string.Join(" ", item.ZipCode));
 
            // 1 0 0                   1 0
            // 1 0 0                   0 1
            // 0 1 0                   1 0
            // 0 1 0                   0 1
            // 0 0 1                   1 0
        }
 
        private class DataPoint
        {
            public string Education { get; set; }
 
            public string ZipCode { get; set; }
        }
 
        private class TransformedData
        {
            public float[] Education { get; set; }
 
            public float[] ZipCode { get; set; }
        }
    }
}