Chuyển đến nội dung chính

Giới thiệu Machine Learning với ML.NET cho C# Developer

Machine Learning (ML) không còn là sân chơi riêng của Python hay các team AI lớn. Với ML.NET, C# developer có thể xây dựng, train và sử dụng model Machine Learning ngay trong hệ sinh thái .NET quen thuộc.

Bài viết này hướng tới việc giúp bạn hiểu bản chất ML.NET, không chỉ dừng lại ở việc copy code.


1. Machine Learning là gì?

Ở mức đơn giản nhất:

Machine Learning = viết chương trình mà logic không nằm trong code, mà nằm trong dữ liệu.

Thay vì viết các điều kiện if-else ngày càng phức tạp, ta đưa dữ liệu quá khứ cho model học và tự rút ra quy luật.

if (age > 30 && income > 100000)
{
    return "Good Customer";
}

Machine Learning không thay thế developer — nó thay thế những rule-based logic quá cứng nhắc và khó mở rộng.


2. ML.NET giúp C# developer như thế nào?

ML.NET là framework Machine Learning mã nguồn mở do Microsoft phát triển, cho phép bạn:

  • Viết ML 100% bằng C#
  • Chạy trực tiếp trong .NET runtime
  • Train, evaluate, predict ngay trong project hiện tại

Điểm mạnh nhất của ML.NET là:

Machine Learning trở thành một phần của codebase, không phải một thế giới riêng biệt.

3. Supervised Learning là gì?

Trong bài này, chúng ta sử dụng Supervised Learning — loại Machine Learning phổ biến nhất.

Supervised Learning nghĩa là:

  • Dữ liệu có sẵn Label (kết quả đúng)
  • Model học cách ánh xạ từ Feature → Label
Age Income Loan Duration Label
25 50000 12 Bad
40 120000 24 Good

4. Feature và Label – Khái niệm cốt lõi

Feature là gì?

Feature là thông tin đầu vào mà model dùng để học.

  • Tuổi
  • Thu nhập
  • Thời gian vay

Trong Machine Learning:

Feature cuối cùng luôn phải là số.

ML.NET sẽ gộp tất cả Feature thành một vector gọi là Features.

Label là gì?

Label là kết quả mà chúng ta muốn model dự đoán.

  • Good / Bad
  • Yes / No
  • Fraud / Normal

Một model chỉ tốt khi Label đúng và nhất quán.


5. Cài đặt ML.NET

Install-Package Microsoft.ML
// Khởi tạo môi trường (Seed = 0 để kết quả nhất quán)
var mlContext = new MLContext(seed: 0);

// Load dữ liệu từ file CSV
IDataView dataView = mlContext.Data.LoadFromTextFile<ModelInput>(
    "customer_data.csv", 
    hasHeader: true, 
    separatorChar: ',');

6. Định nghĩa ModelInput

public class ModelInput
{
    [LoadColumn(0)]
    public float Age { get; set; }

    [LoadColumn(1)]
    public float Income { get; set; }

    [LoadColumn(2)]
    public float LoanDuration { get; set; }

    [LoadColumn(3)]
    public string Label { get; set; }
}
  • Age, Income, LoanDuration → Feature
  • Label → Ground truth
Ground truth: (dữ liệu thực tế/sự thật nền) là thông tin chính xác, đã được xác minh qua quan sát trực tiếp hoặc nguồn tin cậy, được dùng làm chuẩn mực để huấn luyện, kiểm thử và đánh giá độ chính xác của các mô hình học máy (ML) và trí tuệ nhân tạo (AI). Đây là "câu trả lời đúng" giúp xác nhận mô hình AI hoạt động hiệu quả trên thực tế.

7. ModelOutput

public class ModelOutput
{
    [ColumnName("PredictedLabel")]
    public string Prediction { get; set; }
}

8. Build Pipeline trong ML.NET

var pipeline = mlContext.Transforms
    .Conversion.MapValueToKey("Label")
    .Append(mlContext.Transforms.Concatenate(
        "Features",
        nameof(ModelInput.Age),
        nameof(ModelInput.Income),
        nameof(ModelInput.LoanDuration)))
    .Append(mlContext.MulticlassClassification.Trainers
        .SdcaMaximumEntropy())
    .Append(mlContext.Transforms.Conversion
        .MapKeyToValue("PredictedLabel"));

Pipeline mô tả toàn bộ quá trình:

  • Convert Label → số
  • Gộp Feature → vector
  • Train model
  • Convert prediction về dạng ban đầu
Ngoài ra bạn có thể sử dụng thuật toán L-BFGS (LbfgsMaximumEntropy).

SDCA (Stochastic Dual Coordinate Ascent) là một thuật toán tối ưu dạng iterative, thường được dùng cho logistic regression và linear classification.

L-BFGS là thuật toán tối ưu bậc hai (second-order optimization), được sử dụng phổ biến trong logistic regression.

Ngoài ra còn có 1 số thuật toán quan trọng khác: FastTree/FastForest, LightGBM, Linear SVM, Averaged Perceptron

Pipeline chỉ là bản vẽ, chúng ta cần "bấm nút" để máy học:

// 1. Chia dữ liệu: 80% để học (Train), 20% để thi (Test)
var dataSplit = mlContext.Data.TrainTestSplit(dataView, testFraction: 0.2);

// 2. Train model (Học từ dữ liệu Train)
var model = pipeline.Fit(dataSplit.TrainSet);

// 3. Evaluate (Kiểm tra trên dữ liệu Test)
var predictions = model.Transform(dataSplit.TestSet);
var metrics = mlContext.MulticlassClassification.Evaluate(predictions);

// In kết quả
Console.WriteLine($"Macro Accuracy: {metrics.MacroAccuracy:P2}");
Console.WriteLine($"LogLoss: {metrics.LogLoss:F4}");
Kết quả chương trình khi dùng L-BFGS
Macro Accuracy: 75.00%
LogLoss: 0.3020

LogLoss đo mức độ tự tin của model trong dự đoán.

LogLoss ≈ 0.69 → gần random LogLoss càng thấp → model càng phân biệt tốt


9. Đánh giá Model – Accuracy, Precision, Recall, F1, AUC

Accuracy

Tỷ lệ dự đoán đúng trên toàn bộ dữ liệu.

Không đáng tin khi data mất cân bằng.

Precision

Trong những lần model nói “Có”, bao nhiêu lần là đúng.

Recall

Trong tất cả các case đúng, model bắt được bao nhiêu.

F1 Score

Trung bình điều hòa giữa Precision và Recall.

F1 là metric phổ biến nhất khi data không cân bằng.

AUC

Đo khả năng phân biệt hai class, không phụ thuộc threshold.


10. Predict trong ứng dụng thực tế

var engine = mlContext.Model
    .CreatePredictionEngine<ModelInput, ModelOutput>(model);

var input = new ModelInput
{
    Age = 35,
    Income = 90000,
    LoanDuration = 24
};

var result = engine.Predict(input);
Console.WriteLine(result.Prediction);
"Lưu ý: PredictionEngine không thread-safe. Nếu dùng trong ASP.NET Core (Web API), hãy dùng PredictionEnginePool để tối ưu hiệu năng và tránh lỗi."

Kết luận

ML.NET giúp C# developer tiếp cận Machine Learning theo cách engineering-first.

Machine Learning không phải magic — nó là sự kết hợp của:

  • Data đúng
  • Feature hợp lý
  • Metric được hiểu đúng

Khi hiểu được điều này, ML trở thành một công cụ rất mạnh trong tay developer

Link download: ML GettingStarted.rar

Tham khảo

ML.NET – Introduction to Machine Learning With C# 

Nhận xét

Bài đăng phổ biến từ blog này

[ASP.NET MVC] Authentication và Authorize

Một trong những vấn đề bảo mật cơ bản nhất là đảm bảo những người dùng hợp lệ truy cập vào hệ thống. ASP.NET đưa ra 2 khái niệm: Authentication và Authorize Authentication xác nhận bạn là ai. Ví dụ: Bạn có thể đăng nhập vào hệ thống bằng username và password hoặc bằng ssh. Authorization xác nhận những gì bạn có thể làm. Ví dụ: Bạn được phép truy cập vào website, đăng thông tin lên diễn đàn nhưng bạn không được phép truy cập vào trang mod và admin.

ASP.NET MVC: Cơ bản về Validation

Validation (chứng thực) là một tính năng quan trọng trong ASP.NET MVC và được phát triển trong một thời gian dài. Validation vắng mặt trong phiên bản đầu tiên của asp.net mvc và thật khó để tích hợp 1 framework validation của một bên thứ 3 vì không có khả năng mở rộng. ASP.NET MVC2 đã hỗ trợ framework validation do Microsoft phát triển, tên là Data Annotations. Và trong phiên bản 3, framework validation đã hỗ trợ tốt hơn việc xác thực phía máy khách, và đây là một xu hướng của việc phát triển ứng dụng web ngày nay.

Tổng hợp một số kiến thức lập trình về Amibroker

Giới thiệu về Amibroker Amibroker theo developer Tomasz Janeczko được xây dựng dựa trên ngôn ngữ C. Vì vậy bộ code Amibroker Formula Language sử dụng có syntax khá tương đồng với C, ví dụ như câu lệnh #include để import hay cách gói các object, hàm trong các block {} và kết thúc câu lệnh bằng dấu “;”. AFL trong Amibroker là ngôn ngữ xử lý mảng (an array processing language). Nó hoạt động dựa trên các mảng (các dòng/vector) số liệu, khá giống với cách hoạt động của spreadsheet trên excel.