예제 #1
0
파일: Program.cs 프로젝트: elendil326/UWML
        static void Main(string[] args)
        {
            List <double[]> continuousTrainData = DataWrangler.LoadContinuousDataAsync(TrainingCsv, _indexToIgnore).Result;
            List <double[]> continuousTestData  = DataWrangler.LoadContinuousDataAsync(TestingCsv, _indexToIgnore).Result;

            // Print continuous columns for calculating elbows in external tool(https://bl.ocks.org/rpgove/0060ff3b656618e9136b)
            //foreach (int i in _continuesIndexes)
            //{
            //    using (StreamWriter sw = new StreamWriter($"{i}.txt"))
            //    {
            //        sw.WriteLine(string.Join(",", continuousTrainData.Select(array => array[i])));
            //    }
            //}

            // Convert continuous to discrete
            Dictionary <int, GaussianClusterCollection> indexClusterMapping = DataWrangler.GetIndexClustersMap(continuousTrainData, _indexElbowMap);
            List <int[]> discreteTrainData = DataWrangler.ConvertContinuesToDiscrete(continuousTrainData, indexClusterMapping);
            List <int[]> discreteTestData  = DataWrangler.ConvertContinuesToDiscrete(continuousTestData, indexClusterMapping);

            // Verify clustering
            //foreach (int continuousIndex in _continuousIndexes)
            //{
            //    HashSet<int> clustersTrain = new HashSet<int>();
            //    HashSet<int> clustersTest = new HashSet<int>();

            //    foreach (int[] instance in discreteTrainData)
            //    {
            //        clustersTrain.Add(instance[continuousIndex]);
            //    }
            //    foreach (int[] instance in discreteTestData)
            //    {
            //        clustersTest.Add(instance[continuousIndex]);
            //    }

            //    Console.WriteLine($"Clustering in index {continuousIndex} generated {clustersTrain.Count} unique clusters in train and {clustersTest.Count} unique clusters in test");
            //    Console.WriteLine($"Train: {string.Join(",", clustersTrain.OrderBy(i => i))}");
            //    Console.WriteLine($"Test: {string.Join(",", clustersTest.OrderBy(i => i))}");
            //    Console.WriteLine();
            //}

            List <List <int[]> > samples = Sampler.SampleData(discreteTrainData, BiasVarianceNumOfSamples);

            ConcurrentDictionary <int, ConcurrentDictionary <int, ConcurrentDictionary <int, int> > > id3ClassifierDepthInstanceClassifierPredictionMappings = new ConcurrentDictionary <int, ConcurrentDictionary <int, ConcurrentDictionary <int, int> > >();
            ConcurrentDictionary <int, ConcurrentDictionary <int, ConcurrentDictionary <int, int> > > id3BaggerDepthInstanceClassifierPredictionMappings     = new ConcurrentDictionary <int, ConcurrentDictionary <int, ConcurrentDictionary <int, int> > >();

            ConcurrentDictionary <int, Tuple <double, double, double> > id3ClassifierResult       = new ConcurrentDictionary <int, Tuple <double, double, double> >();
            ConcurrentDictionary <int, Tuple <double, double, double> > id3BaggerClassifierResult = new ConcurrentDictionary <int, Tuple <double, double, double> >();

            // From 0 to 10 maxDepth, calculate the bias and variance of the classifiers in parallel.
            Parallel.For(0, 11, (maxDepth) =>
                         //for (int maxDepth = 0; maxDepth < 2; maxDepth++)
            {
                ConcurrentDictionary <int, ConcurrentDictionary <int, int> > id3BaggerInstanceClassifierPredictionMappings     = id3BaggerDepthInstanceClassifierPredictionMappings.GetOrAdd(maxDepth, new ConcurrentDictionary <int, ConcurrentDictionary <int, int> >());
                ConcurrentDictionary <int, ConcurrentDictionary <int, int> > id3ClassifierInstanceClassifierPredictionMappings = id3ClassifierDepthInstanceClassifierPredictionMappings.GetOrAdd(maxDepth, new ConcurrentDictionary <int, ConcurrentDictionary <int, int> >());

                for (int i = 0; i < BiasVarianceNumOfSamples; i++)
                //Parallel.For(0, BiasVarianceNumOfSamples, i =>
                {
                    // Initialize and train the classifiers in parallel
                    Id3Bagger bagger = new Id3Bagger(BaggerSamples);
                    bagger.Train(samples[i], ClassIndex, 0, maxDepth);

                    // Store predictions on test data
                    //Parallel.For(0, discreteTestData.Count, (j) =>
                    for (int j = 0; j < discreteTestData.Count; j++)
                    {
                        ConcurrentDictionary <int, int> classifierPredictionMapping = id3BaggerInstanceClassifierPredictionMappings.GetOrAdd(j, new ConcurrentDictionary <int, int>());
                        classifierPredictionMapping.GetOrAdd(i, bagger.GetClass(discreteTestData[j]));
                    }
                    ;

                    // Free the memory
                    bagger = null;

                    // Initialize and train the classifiers in parallel
                    Id3Classifier tree = new Id3Classifier(samples[i], ClassIndex, 0, maxDepth);

                    // Store predictions on test data
                    //Parallel.For(0, discreteTestData.Count, (j) =>
                    for (int j = 0; j < discreteTestData.Count; j++)
                    {
                        ConcurrentDictionary <int, int> classifierPredictionMapping = id3ClassifierInstanceClassifierPredictionMappings.GetOrAdd(j, new ConcurrentDictionary <int, int>());
                        classifierPredictionMapping.GetOrAdd(i, tree.GetClass(discreteTestData[j]));
                    }
                    ;

                    // Free the memory
                    tree = null;
                }
                ;

                // Calculate bias and variance for each classifier and store it.
                id3BaggerClassifierResult.GetOrAdd(maxDepth, BiasVarianceHelper.GetBiasVarianceAccuracy(discreteTestData, ClassIndex, id3BaggerInstanceClassifierPredictionMappings));
                id3ClassifierResult.GetOrAdd(maxDepth, BiasVarianceHelper.GetBiasVarianceAccuracy(discreteTestData, ClassIndex, id3ClassifierInstanceClassifierPredictionMappings));
            });

            Console.WriteLine("Id3 Classifier");
            Console.WriteLine("Max Depth, Bias, Variance, Accuracy");
            foreach (int maxDepth in id3ClassifierResult.Keys)
            {
                Console.WriteLine($"{maxDepth}, {id3ClassifierResult[maxDepth].Item1}, {id3ClassifierResult[maxDepth].Item2}, {id3ClassifierResult[maxDepth].Item3}");
            }

            Console.WriteLine();

            Console.WriteLine("Bagger");
            Console.WriteLine("Max Depth, Bias, Variance, Accuracy");
            foreach (int maxDepth in id3BaggerClassifierResult.Keys)
            {
                Console.WriteLine($"{maxDepth}, {id3BaggerClassifierResult[maxDepth].Item1}, {id3BaggerClassifierResult[maxDepth].Item2}, {id3ClassifierResult[maxDepth].Item3}");
            }

            Console.WriteLine();

            Console.WriteLine("Press ENTER to exit...");
            Console.ReadLine();
        }