مدل های داخل ml.net و هوش مصنوعی
⚡ خلاصه سریع — اصل کاریها
اینها مهمترین چیزهایی هستن که اگه هیچی ندونی، فقط اینا رو بدونی کافیه:
- نکته ۱: مدل هوش مصنوعی در واقع یک "فرمول ریاضی پیچیده" است که از روی دادههای گذشته ساخته شده تا دادههای آینده را پیشبینی کند.
- نکته ۲: در ML.NET همه چیز با کلاس
MLContextشروع میشود. این کلاس مثل رئیس کارخانه است که به همه بخشها (آموزش، داده، ارزیابی) دستور میدهد. - نکته ۳: دادهها در ML.NET باید به فرمت خاصی به نام
IDataViewتبدیل شوند که حافظه را بهینه مدیریت میکند. - نکته ۴: فرآیند ساخت مدل همیشه ۴ مرحله دارد: ۱. جمعآوری داده ۲. استخراج ویژگی (Transform) ۳. آموزش الگوریتم (Train) ۴. مصرف مدل (Predict).
- نکته ۵: شما نیازی ندارید ریاضیات پیچیده را بلد باشید؛ ML.NET الگوریتمها را کپسوله کرده و شما فقط متد آنها را صدا میزنید.
۳ اشتباه رایج:
- آموزش مدل با دادهای که فرمت یکسانی با دادههای ورودی زمان پیشبینی ندارد (Schema Mismatch).
- نشدن تقسیم دادهها به دو بخش آموزش (Train) و تست (Test) قبل از آموزش.
- استفاده از
PredictionEngineبه جایPredictionEnginePoolدر برنامههای وب (ASP.NET Core) که باعث نشت حافظه (Memory Leak) میشود.
اگر فقط ۵ دقیقه وقت داری:
- یک پروژه کنسول بساز و پکیج
Microsoft.MLرا نصب کن. - کلاسهای ورودی و خروجیات را با ویژگی
[ColumnName]بساز. - با
MLContextدادهها را لود کن، یک الگوریتم مثلSdcaرا بهش وصل کن و متدFitرا صدا بزن تا مدل ذخیره شود. - با متد
CreatePredictionEnginePoolیک پیشبینی انجام بده. - بفهم که جادو نیست، فقط آمار و ریاضی است!
۱. مقدمه
به هوش مصنوعی به چشم یک "شاگرد کارآموز" نگاه کن. اگر به او ۱۰۰۰ عکس از گربه نشان دهی و هر بار بگویی "این گربه است"، او الگویی در ذهنش میسازد. دفعه بعد که عکس گربهای را ببیند، بر اساس آن الگو میفهمد که گربه است. این "الگو" در ذهن ماشین، همان مدل (Model) است.
ML.NET فریمورک رایگان و متنباز مایکروسافت است که به برنامهنویسان داتنت (#C) اجازه میدهد بدون نیاز به یادگیری پایتون یا ریاضیاتِ عمیق، هوش مصنوعی را داخل برنامههای خودشان پیادهسازی کنند. از جستجوی پشت میزی (Desktop Search) گرفته تا پیشبینی قیمت ملک، همگی با همین فریمورک ممکن است.
۲. پیشنیازها
برای شروع این مسیر، فقط به اینها نیاز داری:
- آشنایی پایه با زبان #C (LINQ، کلاسها، و Properties)
- نصب بودن .NET SDK (نسخه ۶ یا بالاتر توصیه میشود)
- درک اولیه از کار با دادهها (مثلاً فایل CSV چیست)
- نیازی به دانش پیشرفته ریاضی یا آمار نیست (ML.NET کارهای سنگین را انجام میدهد).
۳. نصب و راهاندازی
ساخت یک پروژه و نصب پکیج اصلی بسیار ساده است. ترمینال را باز کن و دستورات زیر را بزن:
dotnet new console -n MyFirstAI
cd MyFirstAI
dotnet add package Microsoft.ML
تمام شد! حالا یک پروژه کنسول داریم که موتور هوش مصنوعی در آن نصب شده است.
۴. مفاهیم پایه
قبل از نوشتن کد، باید زبان ML.NET را یاد بگیری. ۴ مفهوم حیاتی داریم:
- MLContext: نقطه شروع همه چیز. کلاسی است که تمام عملیات ML.NET را مدیریت میکند.
- IDataView: در دنیای ML.NET، دادهها درون کلاسهای
Listمعمولی نیستند. آنها درIDataViewقرار میگیرند. اینترفیسی است که دادهها را به صورت جدولی (سطر و ستون) میبیند و نکته جالبش این است که دادهها را به صورت تنبل (Lazy) پردازش میکند؛ یعنی فقط وقتی به دادهای نیاز پیدا کند آن را میخواند که حافظه را برای دادههای حجیم حفظ کند. - Transformer (ترانسفورمر): ماشینها عدد میفهمند، نه متن. پس باید متنها را به عدد تبدیل کنیم. به این عمل "استخراج ویژگی" یا Transform میگویند. مثلاً تبدیل فیلد "تهران"، "اصفهان" به ۰ و ۱.
- Estimator (برآوردگر): ابزاری است که روی دادهها آموزش میبیند تا یک Transformer بسازد. (Estimator وقتی آموزش دید، تبدیل به Transformer میشود).
- Trainer (آموزشگر): نوعی Estimator است که مدل ریاضی را روی دادهها میسازد (مثلاً یاد میگیرد چطور قیمت خانه را پیشبینی کند).
۵. مثالهای کد ساده
بیایید سناریوی سادهای را پیاده کنیم: پیشبینی اینکه آیا یک پیامک اسپم است یا نه (باگبندی متنی - Binary Classification).
ابتدا کلاسهای دادهای خود را تعریف میکنیم:
using Microsoft.ML.Data;
// فرمت دادههای ورودی (یک ردیف از فایل CSV)
public class SmsData
{
[LoadColumn(0)] public string Label { get; set; } // اسپم یا اسپم_نیست
[LoadColumn(1)] public string Message { get; set; } // متن پیامک
}
// خروجی پیشبینی مدل
public class SmsPrediction
{
[ColumnName("PredictedLabel")]
public bool IsSpam { get; set; } // true یعنی اسپم است
}
حالا کد آموزش مدل:
using Microsoft.ML;
// ۱. ساخت نمونه از MLContext
var mlContext = new MLContext(seed: 0);
// ۲. بارگذاری دادهها
IDataView dataView = mlContext.Data.LoadFromTextFile<SmsData>(
path: "spam.csv",
hasHeader: true,
separatorChar: ',');
// ۳. ساخت لوله (Pipeline) پردازش و آموزش
var pipeline = mlContext.Transforms.Text.FeaturizeText(
outputColumnName: "Features",
inputColumnName: nameof(SmsData.Message))
.Append(mlContext.BinaryClassification.Trainers.SdcaLogisticRegression(
labelColumnName: nameof(SmsData.Label),
featureColumnName: "Features"));
// ۴. آموزش مدل (در اینجا دادهها خوانده و مدل ساخته میشود)
Console.WriteLine("در حال آموزش مدل...");
var model = pipeline.Fit(dataView);
// ۵. تست پیشبینی
var predictor = mlContext.Model.CreatePredictionEngine<SmsData, SmsPrediction>(model);
var prediction = predictor.Predict(new SmsData { Message = "Free money! Click here!" });
Console.WriteLine($"آیا اسپم است؟ {prediction.IsSpam}");
توضیح عمیق: در اینجا FeaturizeText متن را به اعداد تبدیل میکند (Transform). سپس SdcaLogisticRegression الگوریتمی است که از این اعداد یاد میگیرد و مدل پیشبینی را میسازد (Train). در نهایت Fit کل این لوله را روشن میکند.
۶. مثال واقعی و کاربردی
سناریو: پیشبینی قیمت خانه بر اساس متراژ و تعداد اتاقها (Regression / رگرسیون).
using Microsoft.ML;
using Microsoft.ML.Data;
public class HouseData
{
public float Size { get; set; }
public float Rooms { get; set; }
public float Price { get; set; }
}
public class HousePrediction
{
[ColumnName("Score")]
public float Price { get; set; }
}
public class Program
{
public static void Main()
{
var mlContext = new MLContext();
// ساخت دادههای فرضی
var houseData = new[]
{
new HouseData { Size = 100f, Rooms = 2, Price = 5000000 },
new HouseData { Size = 150f, Rooms = 3, Price = 7500000 },
new HouseData { Size = 200f, Rooms = 4, Price = 10000000 },
};
IDataView data = mlContext.Data.LoadFromEnumerable(houseData);
// تقسیم دادهها به آموزش (۸۰٪) و تست (۲۰٪)
var split = mlContext.Data.TrainTestSplit(data, testFraction: 0.2);
// لوله آموزش
var pipeline = mlContext.Transforms.Concatenate("Features", nameof(HouseData.Size), nameof(HouseData.Rooms))
.Append(mlContext.Regression.Trainers.LbfgsPoissonRegression(labelColumnName: nameof(HouseData.Price)));
// آموزش روی دادههای Train
var model = pipeline.Fit(split.TrainSet);
// ارزیابی روی دادههای Test
var predictions = model.Transform(split.TestSet);
var metrics = mlContext.Regression.Evaluate(predictions, labelColumnName: nameof(HouseData.Price));
Console.WriteLine($"میزان خطای مدل: {metrics.RootMeanSquaredError}");
// پیشبینی خانهای جدید
var predictor = mlContext.Model.CreatePredictionEngine<HouseData, HousePrediction>(model);
var result = predictor.Predict(new HouseData { Size = 120f, Rooms = 3 });
Console.WriteLine($"قیمت پیشبینی شده: {result.Price}");
}
}
۷. مباحث پیشرفته
وقتی از مطلق صفر عبور کردی، حالا وارد دنیای پرو میشوی:
- ذخیره و بارگذاری مدل: آموزش مدل روی دادههای واقعی ممکن است ساعتها طول بکشد. پس مدل را با
mlContext.Model.Save(model, dataSchema, "model.zip")ذخیره میکنند و در سرور باLoadاستفاده میکنند. - استفاده از مدلهای TensorFlow و ONNX: ML.NET به شما اجازه میدهد مدلهای آموزش دیده در پایتون (مثل شبکههای عصبی تصویر_RESNET) را با فرمت
.pbیا.onnxلود کرده و در #C مصرف کنید. - Model Builder و AutoML: افزونهای در ویژوال استودیو است که فقط فایل CSV به آن میدهی و خودش بهترین الگوریتم را پیدا کرده و کد #C را برایت مینویسد (هیچ کدی نیاز نیست بنویسی!).
- Deep Learning: از طریق
Microsoft.ML.TensorFlowیاMicrosoft.ML.TorchSharpمیتوان شبکههای عصبی پیچیده را اجرا کرد.
۸. اشتباهات رایج
- Memory Leak در
PredictionEngine: این کلاس thread-safe نیست و در محیطهای وب (ASP.NET) با هر بارnewکردن، حافظه نشت میکند. راه حل: استفاده ازPredictionEnginePoolاز طریق تزریق وابستگی. - عدم وجود Data Splitting: اگر همه دادهها را برای آموزش بدی، مدل حفظ میکند (Overfitting) و در دنیای واقعی خراب کار میکند. همیشه باید
TrainTestSplitانجام شود. - تطابق ندادن نام ستونها: مدل با نام "Features" آموزش دیده، اما موقع پیشبینی، داده جدید این نام را ندارد. به شدت مراقب ویژگی
[ColumnName]باشید.
۹. بهترین روشها (Best Practices)
- Normalization (نرمالسازی): دادههای عددی (مثلاً قیمت میلیون تومانی و متراژ دو متری) باید نرمال شوند تا الگوریتم گیج نشود. از
mlContext.Transforms.NormalizeMinMaxاستفاده کن. - استفاده از Data Schema: موقع Save کردن مدل، حتماً
DataViewSchemaرا هم ذخیره کن تا موقع Load کردن ساختار دادهها مشخص باشد. - تیمسازی Data Loading: برای فایلهای حجیم CSV، از
LoadFromTextFileبا پارامترuseThreads: trueاستفاده کن تا پردازش موازی انجام شود. - دیباگ با تعامل (Explainability): از پکیج
Microsoft.ML.FastTreeو قابلیت Feature Importance بگیرید تا بفهمید کدام فیلد در تصمیمگیری مدل بیشترین نقش را داشته است.
۱۰. منابع و ادامه مسیر
- مستندات رسمی: سایت Microsoft Learn (بخش ML.NET)
- ریپازیتوری GitHub: مخزن MachineLearning-Samples مایکروسافت شامل صدها پروژه واقعی.
- Microsoft.ML.ModelBuilder: نصب اکستنشن روی VS و استفاده از Wizard ها برای یادگیری عملی.
۱۱. مرجع کامل توابع و متدها (API Deep Dive)
در اینجا دو متد حیاتی را کالبدشکافی میکنیم.
۱. متد Fit
این متد ضربان قلب ML.NET است؛ یعنی جایی که "آموزش" اتفاق میافتد.
- امضا (Signature):
public static TransformerChain<TLastTransformer> Fit(this IEstimator<ITransformer> estimator, IDataView data) - پارامترها:
نام نوع توضیح estimatorIEstimator<ITransformer>لولهای که شامل ترانسفورمرها و ترینرهاست. dataIDataViewدادههای جدولی که باید مدل روی آن آموزش ببیند. - Return: برمیگردد
TransformerChain<TLastTransformer>که همان مدل آموزشدیده است. - گامبهگام:
- لوله (Pipeline) تمام Estimator ها را به ترتیب آماده میکند.
- دادهها به صورت جریانی (Stream) اولین Estimator میشوند.
- اگر الگوریتم آموزش باشد، وزنهای ریاضی محاسبه شده و مدل ساخته میشود.
- خروجی Estimator اول، به عنوان ورودی Estimator دوم پشت سر هم رد میشود.
- در نهایت یک زنجیره از مدلهای تبدیلشده (Transformer) برمیگردد.
- ۲ مثال:
// مثال ۱: آموزش ساده
var model = pipeline.Fit(trainingData);
// مثال ۲: آموزش و تبدیل همزمان روی دادههای تست
var transformedData = model.Transform(testData);
- Exceptions:
نوع دلیل SchemaMismatchExceptionستونهای مورد انتظار در dataوجود ندارند یا نوع آنها غلط است.InvalidOperationExceptionاگر dataخالی (null) باشد یا الگوریتم نتواند همگرا شود. - Overloadها:
Fit(IDataView)و معمولا همین یک مورد است. - متدهای مرتبط:
Transform,GetOutputSchema.
۲. متد CreatePredictionEnginePool
- امضا:
public PredictionEnginePool<TInput, TOutput> CreatePredictionEnginePool<TInput, TOutput>(ITransformer model, bool ignoreMissingColumns = true, InputColumnNameResolver inputColumnNames = null) where TInput : class, new() where TOutput : class, new() - پارامترها:
نام نوع توضیح modelITransformerمدل آموزش دیده که از متد Fit به دست آمده. ignoreMissingColumnsboolاگر در ورودی ستونی نبود، نادیده گرفته شود یا خطا بدهد. پیشفرض True. inputColumnNamesInputColumnNameResolverبرای مپ کردن نام ستونهای کاستوم. - Return: یک Object Pool از موتورهای پیشبینی (برای استفاده Thread-Safe).
- گامبهگام:
- مدل لود شده را میگیرد.
- تعدادی
PredictionEngineدر حافظه از پیش آماده (Pool) میسازد. - وقتی Request میدهید، یکی از آنها را به شما قرض میدهد و پس از استفاده پس میگیرد.
- ۲ مثال:
// مثال ۱: در برنامه ASP.NET Core
services.AddSingleton<PredictionEnginePool<SmsData, SmsPrediction>>(sp =>
mlContext.Model.CreatePredictionEnginePool<SmsData, SmsPrediction>(model));
// مثال ۲: در برنامه کنسول (با ساخت دستی)
var pool = mlContext.Model.CreatePredictionEnginePool<HouseData, HousePrediction>(model, ignoreMissingColumns: false);
var prediction = pool.Predict(new HouseData { Size = 200 });
- Exceptions:
نوع دلیل ArgumentOutOfRangeExceptionمدل با کلاس TInput و TOutput همخوانی ساختاری نداشته باشد. - Overloadها: یکی پارامتر فایل Path دارد تا مدل را مستقیم لود کند.
- متدهای مرتبط:
CreatePredictionEngine(نسخه غیر Pool شده که برای محیطهای Single-Threaded است).
۱۲. مقایسه کلاسها/توابع مشابه
PredictionEngine در برابر PredictionEnginePool
| ویژگی | PredictionEngine | PredictionEnginePool |
|---|---|---|
| مخاطب هدف | برنامههای کنسول، Batch Processing | وبسایتها (ASP.NET)، APIهای Concurrent |
| Thread Safety | خیر (Thread-safe نیست) | بله (امن برای پردازش همزمان) |
| مصرف حافظه | کم (یک شی ساخته میشود) | بیشتر (چندین شی درون Pool ساخته میشود) |
| سرعت در Multi-thread | افت شدید سرعت (Bottleneck میشود) | فوقالعاده سریع (تفکیک درخواستها) |
| نحوه Dispose | دستی با using |
خودکار توسط DI Container |
۱۳. سناریوهای واقعی
- پیشبینی ریزش مشتری (Churn Prediction): گرفتن دادههای خرید مشتریان، تعداد شکایات و... و پیشبینی اینکه آیا ماه آینده کنسل میکنند یا خیر (Binary Classification).
- سیستم توصیهگر (Recommender): بر اساس Matrix Factorization، به کاربران پلیلیست موسیقی یا محصولات مرتبط پیشنهاد بدهیم.
- کلاسهبندی متن (Text Classification): تیکتهای پشتیبانی را به صورت خودکار به دپارتمانهای IT، مالی یا فروش هدایت کنیم.
- تشخیص ناهنجاری (Anomaly Detection): پیدا کردن تراکنشهای بانکی نامعتبر و تقلبی با الگوریتم PCA.
۱۴. کارایی و Performance
ML.NET به شدت بهینهسازی شده است:
- Native C++ Internals: بسیاری از محاسبات سنگین ریاضی زیر هود ML.NET با C++ نوشته شدهاند (مثل Intel Math Kernel Library) که سرعت را همتراز با پایتون (NumPy) میکند.
- Incremental Training: شما میتوانید مدلی که آموزش داده شده را لود کرده و فقط کمی دادههای جدید به آن بدهید (بدون آموزش از صفر).
- File Loading Optimization: در فایلهای CSV بزرگ،
LoadFromTextFileدادهها را درون RAM نمیریزد؛ بلکه فقط Pointer میسازد و فقط موقعFitخط به خط از روی Hard Disk میخواند. - Tips برای افزایش Perf: از
Cacheکردن IDataView استفاده کن (برای دادههای کم حجم) تا پردازشهای مکرر سریعتر شود:mlContext.Data.Cache(dataView).
۱۵. چکلیست یادگیری
برای اطمینان از درک کامل این آموزش، این چکلیست را تیک بزن:
- میدانم تفاوت مدل و داده چیست.
- موفق شدهام اولین پیشبینی (مثلاً قیمت) را در یک کنسول ساده انجام دهم.
- میتوانم دادهها را به Train و Test تقسیم کنم و خطای مدل را ببینم.
- میدانم چطور مدل را در فایل ZIP ذخیره کنم و از کد دیگری آن را لود کنم.
- میدانم که در یک وبسایت حتماً باید از
PredictionEnginePoolاستفاده کنم. - حداقل یک بار با Microsoft Model Builder در ویژوال استودیو کار کردهام.