Table of Contents

Getting Started with AiDotNet

This guide demonstrates the fundamentals of using AiDotNet for machine learning tasks.

Overview

AiDotNet provides a simple, unified API for machine learning through the AiModelBuilder class. All complexity is handled internally, so you can focus on your data and results.

Quick Start: Linear Regression

using AiDotNet;

// Your training data
var features = new double[][]
{
    new[] { 1.0 },
    new[] { 2.0 },
    new[] { 3.0 },
    new[] { 4.0 },
    new[] { 5.0 }
};

var targets = new double[] { 2.1, 4.0, 5.9, 8.1, 10.0 };

// Build and train a model
var result = await new AiModelBuilder<double, double[][], double[]>()
    .ConfigureRegression()
    .ConfigurePreprocessing()
    .BuildAsync(features, targets);

// Make predictions
var prediction = result.Predict(new double[][] { new[] { 6.0 } });
Console.WriteLine($"Prediction for x=6: {prediction[0]:F2}");
// Output: Prediction for x=6: 12.01

// View model performance
Console.WriteLine($"R-Squared: {result.RSquared:F4}");
Console.WriteLine($"Mean Squared Error: {result.MeanSquaredError:F4}");

Multiple Features (Multivariate Regression)

using AiDotNet;

// House price prediction: [sqft, bedrooms, age]
var houseFeatures = new double[][]
{
    new[] { 1500.0, 3.0, 10.0 },
    new[] { 2000.0, 4.0, 5.0 },
    new[] { 1200.0, 2.0, 20.0 },
    new[] { 1800.0, 3.0, 8.0 },
    new[] { 2500.0, 5.0, 2.0 }
};

var prices = new double[] { 300000, 450000, 200000, 380000, 550000 };

// Build model
var result = await new AiModelBuilder<double, double[][], double[]>()
    .ConfigureRegression(config =>
    {
        config.ModelType = RegressionModelType.Ridge;
        config.RegularizationStrength = 0.1;
    })
    .ConfigurePreprocessing(config =>
    {
        config.NormalizeFeatures = true;
        config.HandleMissingValues = true;
    })
    .BuildAsync(houseFeatures, prices);

// Predict new house price
var newHouse = new double[][] { new[] { 1700.0, 3.0, 12.0 } };
var predictedPrice = result.Predict(newHouse);
Console.WriteLine($"Estimated price: ${predictedPrice[0]:N0}");

// View feature importance
Console.WriteLine("\nFeature Importance:");
Console.WriteLine($"  Square Feet: {result.FeatureImportance[0]:F3}");
Console.WriteLine($"  Bedrooms: {result.FeatureImportance[1]:F3}");
Console.WriteLine($"  Age: {result.FeatureImportance[2]:F3}");

Binary Classification

using AiDotNet;

// Customer churn prediction
var customerData = new double[][]
{
    new[] { 12.0, 50.0, 1.0 },   // tenure, monthly charges, has contract
    new[] { 1.0, 80.0, 0.0 },
    new[] { 24.0, 45.0, 1.0 },
    new[] { 3.0, 95.0, 0.0 },
    new[] { 36.0, 40.0, 1.0 }
};

var churned = new double[] { 0, 1, 0, 1, 0 };

// Build classification model
var result = await new AiModelBuilder<double, double[][], double[]>()
    .ConfigureClassification(config =>
    {
        config.ModelType = ClassificationModelType.LogisticRegression;
        config.ClassCount = 2;
    })
    .ConfigurePreprocessing()
    .BuildAsync(customerData, churned);

// Predict churn probability
var newCustomer = new double[][] { new[] { 6.0, 70.0, 0.0 } };
var churnProbability = result.PredictProbability(newCustomer);
Console.WriteLine($"Churn probability: {churnProbability[0]:P1}");

// View model metrics
Console.WriteLine($"Accuracy: {result.Accuracy:P2}");
Console.WriteLine($"Precision: {result.Precision:P2}");
Console.WriteLine($"Recall: {result.Recall:P2}");
Console.WriteLine($"F1 Score: {result.F1Score:P2}");

Multi-Class Classification

using AiDotNet;

// Iris flower classification
var irisFeatures = new double[][]
{
    new[] { 5.1, 3.5, 1.4, 0.2 },
    new[] { 7.0, 3.2, 4.7, 1.4 },
    new[] { 6.3, 3.3, 6.0, 2.5 },
    // ... more samples
};

var species = new double[] { 0, 1, 2 }; // 0=setosa, 1=versicolor, 2=virginica

// Build model
var result = await new AiModelBuilder<double, double[][], double[]>()
    .ConfigureClassification(config =>
    {
        config.ModelType = ClassificationModelType.RandomForest;
        config.ClassCount = 3;
    })
    .ConfigurePreprocessing()
    .BuildAsync(irisFeatures, species);

// Predict species
var newFlower = new double[][] { new[] { 5.9, 3.0, 5.1, 1.8 } };
var predicted = result.Predict(newFlower);
var probabilities = result.PredictProbability(newFlower);

Console.WriteLine($"Predicted species: {predicted[0]}");
Console.WriteLine($"Confidence: {probabilities.Max():P1}");

Working with Data

Automatic Preprocessing

using AiDotNet;

// Data with missing values and different scales
var rawData = new double[][]
{
    new[] { 1000.0, 25.0, double.NaN },
    new[] { 2000.0, 30.0, 3.0 },
    new[] { double.NaN, 35.0, 5.0 },
    new[] { 1500.0, double.NaN, 4.0 }
};

var targets = new double[] { 100, 200, 180, 150 };

// AiModelBuilder handles preprocessing automatically
var result = await new AiModelBuilder<double, double[][], double[]>()
    .ConfigureRegression()
    .ConfigurePreprocessing(config =>
    {
        config.HandleMissingValues = true;         // Impute missing values
        config.NormalizeFeatures = true;           // Scale to 0-1 range
        config.RemoveOutliers = true;              // Remove statistical outliers
        config.EncodeCategories = true;            // One-hot encode categories
    })
    .BuildAsync(rawData, targets);

Train/Test Split

using AiDotNet;

var result = await new AiModelBuilder<double, double[][], double[]>()
    .ConfigureRegression()
    .ConfigurePreprocessing()
    .ConfigureValidation(config =>
    {
        config.ValidationSplit = 0.2;    // 20% for validation
        config.Shuffle = true;
        config.RandomSeed = 42;
    })
    .BuildAsync(features, targets);

Console.WriteLine($"Training R-Squared: {result.TrainingRSquared:F4}");
Console.WriteLine($"Validation R-Squared: {result.ValidationRSquared:F4}");

Cross-Validation

using AiDotNet;

var result = await new AiModelBuilder<double, double[][], double[]>()
    .ConfigureClassification()
    .ConfigurePreprocessing()
    .ConfigureValidation(config =>
    {
        config.CrossValidationFolds = 5;
    })
    .BuildAsync(features, labels);

Console.WriteLine($"CV Accuracy: {result.CrossValidationAccuracy:P2}");
Console.WriteLine($"CV Std Dev: {result.CrossValidationStdDev:F4}");

Saving and Loading Models

using AiDotNet;

// Train and save
var result = await new AiModelBuilder<double, double[][], double[]>()
    .ConfigureRegression()
    .BuildAsync(features, targets);

result.SaveModel("my_model.aimodel");
Console.WriteLine("Model saved!");

// Load and use later
var loadedModel = AiModelResult<double>.Load("my_model.aimodel");
var prediction = loadedModel.Predict(newData);
Console.WriteLine($"Prediction: {prediction[0]}");

Batch Predictions

using AiDotNet;

// Make predictions on multiple samples at once
var testData = new double[][]
{
    new[] { 1.5 },
    new[] { 2.5 },
    new[] { 3.5 },
    new[] { 4.5 }
};

var predictions = result.Predict(testData);

Console.WriteLine("Batch Predictions:");
for (int i = 0; i < predictions.Length; i++)
{
    Console.WriteLine($"  Input {testData[i][0]}: {predictions[i]:F2}");
}

Model Comparison

using AiDotNet;

// Compare different model types
var models = new[]
{
    RegressionModelType.Linear,
    RegressionModelType.Ridge,
    RegressionModelType.Lasso,
    RegressionModelType.ElasticNet
};

Console.WriteLine("Model Comparison:");
Console.WriteLine("Model\t\t\tR-Squared\tMSE");
Console.WriteLine("-----\t\t\t---------\t---");

foreach (var modelType in models)
{
    var result = await new AiModelBuilder<double, double[][], double[]>()
        .ConfigureRegression(c => c.ModelType = modelType)
        .ConfigurePreprocessing()
        .ConfigureValidation(c => c.ValidationSplit = 0.2)
        .BuildAsync(features, targets);

    Console.WriteLine($"{modelType}\t\t{result.ValidationRSquared:F4}\t\t{result.ValidationMse:F4}");
}

Summary

AiDotNet's AiModelBuilder provides:

  • Simple, fluent API for all ML tasks
  • Automatic preprocessing and feature engineering
  • Built-in validation and cross-validation
  • Model saving and loading
  • Performance metrics and feature importance

All complexity is handled internally. You focus on your data and business problem.