آموزش کامل مدل های داخل ml.net و هوش مصنوعی — از صفر تا حرفه‌ای | + تحلیل متدها و پارامترها

مدل های داخل ml.net و هوش مصنوعی همه سطوح
parsakarimidev.ir

آموزش کامل مدل های داخل ml.net و هوش مصنوعی — از صفر تا حرفه‌ای | + تحلیل متدها و پارامترها

مدل های داخل ml.net و هوش مصنوعیمفهوم سطح: همه سطوح 1405/07/19

مدل های داخل ml.net و هوش مصنوعی

⚡ خلاصه سریع — اصل کاری‌ها

این‌ها مهم‌ترین چیزهایی هستن که اگه هیچی ندونی، فقط اینا رو بدونی کافیه:

  • نکته ۱: مدل هوش مصنوعی در واقع یک "فرمول ریاضی پیچیده" است که از روی داده‌های گذشته ساخته شده تا داده‌های آینده را پیش‌بینی کند.
  • نکته ۲: در ML.NET همه چیز با کلاس MLContext شروع می‌شود. این کلاس مثل رئیس کارخانه است که به همه بخش‌ها (آموزش، داده، ارزیابی) دستور می‌دهد.
  • نکته ۳: داده‌ها در ML.NET باید به فرمت خاصی به نام IDataView تبدیل شوند که حافظه را بهینه مدیریت می‌کند.
  • نکته ۴: فرآیند ساخت مدل همیشه ۴ مرحله دارد: ۱. جمع‌آوری داده ۲. استخراج ویژگی (Transform) ۳. آموزش الگوریتم (Train) ۴. مصرف مدل (Predict).
  • نکته ۵: شما نیازی ندارید ریاضیات پیچیده را بلد باشید؛ ML.NET الگوریتم‌ها را کپسوله کرده و شما فقط متد آن‌ها را صدا می‌زنید.

۳ اشتباه رایج:

  1. آموزش مدل با داده‌ای که فرمت یکسانی با داده‌های ورودی زمان پیش‌بینی ندارد (Schema Mismatch).
  2. نشدن تقسیم داده‌ها به دو بخش آموزش (Train) و تست (Test) قبل از آموزش.
  3. استفاده از PredictionEngine به جای PredictionEnginePool در برنامه‌های وب (ASP.NET Core) که باعث نشت حافظه (Memory Leak) می‌شود.

اگر فقط ۵ دقیقه وقت داری:

  1. یک پروژه کنسول بساز و پکیج Microsoft.ML را نصب کن.
  2. کلاس‌های ورودی و خروجی‌ات را با ویژگی [ColumnName] بساز.
  3. با MLContext داده‌ها را لود کن، یک الگوریتم مثل Sdca را بهش وصل کن و متد Fit را صدا بزن تا مدل ذخیره شود.
  4. با متد CreatePredictionEnginePool یک پیش‌بینی انجام بده.
  5. بفهم که جادو نیست، فقط آمار و ریاضی است!

۱. مقدمه

به هوش مصنوعی به چشم یک "شاگرد کارآموز" نگاه کن. اگر به او ۱۰۰۰ عکس از گربه نشان دهی و هر بار بگویی "این گربه است"، او الگویی در ذهنش می‌سازد. دفعه بعد که عکس گربه‌ای را ببیند، بر اساس آن الگو می‌فهمد که گربه است. این "الگو" در ذهن ماشین، همان مدل (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 را یاد بگیری. ۴ مفهوم حیاتی داریم:

  1. MLContext: نقطه شروع همه چیز. کلاسی است که تمام عملیات ML.NET را مدیریت می‌کند.
  2. IDataView: در دنیای ML.NET، داده‌ها درون کلاس‌های List معمولی نیستند. آن‌ها در IDataView قرار می‌گیرند. اینترفیسی است که داده‌ها را به صورت جدولی (سطر و ستون) می‌بیند و نکته جالبش این است که داده‌ها را به صورت تنبل (Lazy) پردازش می‌کند؛ یعنی فقط وقتی به داده‌ای نیاز پیدا کند آن را می‌خواند که حافظه را برای داده‌های حجیم حفظ کند.
  3. Transformer (ترانسفورمر): ماشین‌ها عدد می‌فهمند، نه متن. پس باید متن‌ها را به عدد تبدیل کنیم. به این عمل "استخراج ویژگی" یا Transform می‌گویند. مثلاً تبدیل فیلد "تهران"، "اصفهان" به ۰ و ۱.
  4. Estimator (برآوردگر): ابزاری است که روی داده‌ها آموزش می‌بیند تا یک Transformer بسازد. (Estimator وقتی آموزش دید، تبدیل به Transformer می‌شود).
  5. 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 می‌توان شبکه‌های عصبی پیچیده را اجرا کرد.

۸. اشتباهات رایج

  1. Memory Leak در PredictionEngine: این کلاس thread-safe نیست و در محیط‌های وب (ASP.NET) با هر بار new کردن، حافظه نشت می‌کند. راه حل: استفاده از PredictionEnginePool از طریق تزریق وابستگی.
  2. عدم وجود Data Splitting: اگر همه داده‌ها را برای آموزش بدی، مدل حفظ می‌کند (Overfitting) و در دنیای واقعی خراب کار می‌کند. همیشه باید TrainTestSplit انجام شود.
  3. تطابق ندادن نام ستون‌ها: مدل با نام "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)
  • پارامترها:
    نام نوع توضیح
    estimator IEstimator<ITransformer> لوله‌ای که شامل ترانسفورمرها و ترینرهاست.
    data IDataView داده‌های جدولی که باید مدل روی آن آموزش ببیند.
  • Return: برمی‌گردد TransformerChain<TLastTransformer> که همان مدل آموزش‌دیده است.
  • گام‌به‌گام:
    1. لوله (Pipeline) تمام Estimator ها را به ترتیب آماده می‌کند.
    2. داده‌ها به صورت جریانی (Stream) اولین Estimator می‌شوند.
    3. اگر الگوریتم آموزش باشد، وزن‌های ریاضی محاسبه شده و مدل ساخته می‌شود.
    4. خروجی Estimator اول، به عنوان ورودی Estimator دوم پشت سر هم رد می‌شود.
    5. در نهایت یک زنجیره از مدل‌های تبدیل‌شده (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()
  • پارامترها:
    نام نوع توضیح
    model ITransformer مدل آموزش دیده که از متد Fit به دست آمده.
    ignoreMissingColumns bool اگر در ورودی ستونی نبود، نادیده گرفته شود یا خطا بدهد. پیش‌فرض True.
    inputColumnNames InputColumnNameResolver برای مپ کردن نام ستون‌های کاستوم.
  • Return: یک Object Pool از موتورهای پیش‌بینی (برای استفاده Thread-Safe).
  • گام‌به‌گام:
    1. مدل لود شده را می‌گیرد.
    2. تعدادی PredictionEngine در حافظه از پیش آماده (Pool) می‌سازد.
    3. وقتی 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 در ویژوال استودیو کار کرده‌ام.

Rejoining the server...

Rejoin failed... trying again in seconds.

Failed to rejoin.
Please retry or reload the page.

The session has been paused by the server.

Failed to resume the session.
Please retry or reload the page.