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→ FeatureLabel→ Ground truth
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
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 PerceptronPipeline 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
Nhận xét
Đăng nhận xét