Ejemplo n.º 1
0
        public static void Main(string[] args)
        {
            // Some manually chosen transactions with some modifications.
            Console.WriteLine("Loading training data...");
            List <TransactionData> trainingData = GetTrainingData();

            Console.WriteLine("Training the model...");
            var trainingService = new BankTransactionTrainingService();

            trainingService.Train(trainingData, "Model.zip");

            Console.WriteLine("Prepare transaction labeler...");
            var labelService = new BankTransactionLabelService();

            labelService.LoadModel("Model.zip");

            Console.WriteLine("Predict some transactions based on their description and type...");
            Console.WriteLine();

            //Starbucks : Coffee
            MakePrediction(labelService, "STARBUCKS", "Debit");
            //PRET A MANGER : Coffee
            MakePrediction(labelService, "MANGER", "Debit");
            //This case use training1.json
            MakePrediction(labelService, "SIMIT SARAYI", "Debit");
        }
        private static void MakePrediction(BankTransactionLabelService labelService, string description)
        {
            string prediction = labelService.PredictCategory(new Transaction
            {
                Description = description,
            });

            Console.WriteLine($"{description}\n => {prediction}\n");
        }
Ejemplo n.º 3
0
        private static void MakePrediction(BankTransactionLabelService labelService, string information, string creditDebitIndicator)
        {
            string prediction = labelService.PredictCategory(new TransactionData
            {
                Information          = information,
                CreditDebitIndicator = creditDebitIndicator
            });

            Console.WriteLine($"{information} ({creditDebitIndicator}) => {prediction}");
        }
        private static void TestPrediction(BankTransactionLabelService labelService, string transactionName, string category)
        {
            var predict = labelService.Predict(new Transaction(transactionName));

            predict.Category.Should().Be(category);

            var categories = labelService.GetCategories();
            var index      = categories.IndexOf(predict.Category);

            // Max score should be the predicted category.
            predict.Score.Max().Should().Be(predict.Score[index]);
        }
Ejemplo n.º 5
0
        public void TestAutoTrain()
        {
            var mlContext       = new MLContext(0);
            var trainingService = new BankTransactionTrainingService(mlContext);

            string trainingDataFile = Path.Combine(AppContext.BaseDirectory, "Data/training.json");
            var    trainingData     = JsonConvert.DeserializeObject <List <Transaction> >(File.ReadAllText(trainingDataFile));
            var    mlModel          = trainingService.AutoTrain(trainingData, 5);

            var labelService = new BankTransactionLabelService(mlContext);

            labelService.LoadModel(mlModel);

            TestModel(labelService);
        }
Ejemplo n.º 6
0
        private static void TestModel(BankTransactionLabelService labelService)
        {
            // Exact matches from the training data.
            labelService.PredictCategory(new Transaction("VISA DEBIT PURCHASE CARD 0012 AMERICAN CONCEPTS PT BRISBANE")).Should().Be("coffee & tea");
            labelService.PredictCategory(new Transaction("VISA DEBIT PURCHASE CARD 0012 DOTNETFOUNDATION.ORG 42553885334 10.00 USD INC O/S FEE $0.42")).Should().Be("investment");

            // Not exact matches, ML Model needs to be to do "Fuzzy" search on them.
            labelService.PredictCategory(new Transaction("coffee")).Should().Be("coffee & tea");
            labelService.PredictCategory(new Transaction("DotNetFoundation.org")).Should().Be("investment");
            labelService.PredictCategory(new Transaction("Anytime Fitness")).Should().Be("health");

            // TODO: Doesn't work for AutoML. Data seems to be too unbalanced and biased toward conferences.
            //labelService.PredictCategory(new Transaction("UBER")).Should().Be("transport");
            labelService.PredictCategory(new Transaction("PubConf")).Should().Be("conference");
            labelService.PredictCategory(new Transaction("DDD")).Should().Be("conference");
            labelService.PredictCategory(new Transaction("DDD Perth")).Should().Be("conference");
        }
Ejemplo n.º 7
0
        public void TestLoadingMLModel()
        {
            var mlContext       = new MLContext(0);
            var trainingService = new BankTransactionTrainingService(mlContext);

            string modelFile        = Path.Combine(AppContext.BaseDirectory, $"{Guid.NewGuid()}.zip");
            string trainingDataFile = Path.Combine(AppContext.BaseDirectory, "Data/training.json");
            var    trainingData     = JsonConvert.DeserializeObject <List <Transaction> >(File.ReadAllText(trainingDataFile));

            var model = trainingService.ManualTrain(trainingData);

            trainingService.SaveModel(modelFile, model);

            var labelService = new BankTransactionLabelService(mlContext);

            labelService.LoadModelFromFile(modelFile);

            TestModel(labelService);

            File.Delete(modelFile);
        }
        public static void Main(string[] args)
        {
            bool doTraining   = !args.Any(arg => arg.Equals("no-training", StringComparison.OrdinalIgnoreCase));
            bool useAutoTrain = args.Any(arg => arg.Equals("auto-ml", StringComparison.OrdinalIgnoreCase));
            var  mlContext    = new MLContext();

            // Training is optional as long it's done at least once.
            if (doTraining)
            {
                string trainingDataFile = Path.Combine(AppContext.BaseDirectory, "Data/training.json");

                // Some manually chosen transactions with some modifications.
                Console.WriteLine("Loading training data...");
                IEnumerable <Transaction> trainingData = GetTrainingData(trainingDataFile);

                Console.WriteLine("Training the model...");
                var trainingService = new BankTransactionTrainingService(mlContext);

                var          timer = Stopwatch.StartNew();
                ITransformer model = useAutoTrain
                    ? trainingService.AutoTrain(trainingData, 15)
                    : trainingService.ManualTrain(trainingData);

                trainingService.SaveModel("Model.zip", model);

                timer.Stop();

                Console.WriteLine($"Training done in {Math.Round(timer.Elapsed.TotalSeconds, 2)} seconds");
                Console.WriteLine();
            }

            Console.WriteLine("Prepare transaction labeler...");
            string modelFile    = Path.Combine(AppContext.BaseDirectory, "Model.zip");
            var    labelService = new BankTransactionLabelService(mlContext);

            labelService.LoadModelFromFile(modelFile);

            Console.WriteLine("Predict some transactions based on their description and type...");
            Console.WriteLine();

            // Should be "coffee & tea".
            MakePrediction(labelService, "VISA DEBIT PURCHASE CARD 0012 AMERICAN CONCEPTS PT BRISBANE");

            // Should be "coffee & tea".
            MakePrediction(labelService, "AMERICAN CONCEPTS PT BRISBANE");

            // The number in the transaction is always random but it will work despite that. Result: rent
            MakePrediction(labelService, "ANZ M-BANKING PAYMENT TRANSFER 513542 TO SPIRE REALITY");

            // In fact, searching just for part of the transaction will give us the same result.
            MakePrediction(labelService, "SPIRE REALITY");

            // Should be "investment".
            MakePrediction(labelService, "VISA DEBIT PURCHASE CARD 0012 DOTNETFOUNDATION.ORG 42553885334 10.00 USD INC O/S FEE $0.42");

            // Should be "investment".
            MakePrediction(labelService, "VISA DEBIT PURCHASE CARD 0012 DOTNETFOUNDATION.ORG 334634543 10.00 USD INC O/S FEE $0.12");

            // Will likely fail.
            MakePrediction(labelService, "DOTNETFOUNDATION.ORG random text");
        }