بالاخره دیروز در همزمان با کنفرانس Microsoft Build نسخه 1.0 ML.NET منتشر شد.
همانطور که قبلا هم گفتم (این و این البته برای نسخه نمایشی بودن اما الان نسخه رسمی منتشر شده)ML به شما توانایی اضافه کردن یادگیری ماشین به برنامه های .NET را می دهد. با استفاده از این قابلیت، می توانید پیش بینی های خودکار را با استفاده از داده های موجود در نرم افزار خود انجام دهید. این مقاله اصول اولیه یادگیری ماشین را در ML.NET توضیح می دهد.
نمونه هایی از انوع پیش بینی هایی که می توانید با ML.NET ایجاد کنید عبارتند از:
برای اضافه کردن ml به visual studio باید به بخش manage extensions بروید و ml.net را نصب کنید و یا از این صفحه دانلود و نصب کنید.
کد زیر ساده ترین برنامه ML.NET را نشان می دهد. در این مثال یک مدل رگرسیون خطی(linear regression model) برای پیش بینی قیمت های خانه با استفاده از اندازه خانه و قیمت داده می شود. در برنامه های کاربردی واقعی، داده ها و مدل های شما بسیار پیچیده تر خواهد شد.
class Program { public class HouseData { public float Size { get; set; } public float Price { get; set; } } public class Prediction { [ColumnName("Score")] public float Price { get; set; } } static void Main(string[] args) { MLContext mlContext = new MLContext(); // 1. Import or create training data HouseData[] houseData = { new HouseData() { Size = 1.1F, Price = 1.2F }, new HouseData() { Size = 1.9F, Price = 2.3F }, new HouseData() { Size = 2.8F, Price = 3.0F }, new HouseData() { Size = 3.4F, Price = 3.7F } }; IDataView trainingData = mlContext.Data.LoadFromEnumerable(houseData); // 2. Specify data preparation and model training pipeline var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" }) .Append(mlContext.Regression.Trainers.Sdca(labelColumnName: "Price", maximumNumberOfIterations: 100); // 3. Train model var model = pipeline.Fit(trainingData); // 4. Make a prediction var size = new HouseData() { Size = 2.5F }; var price = mlContext.Model.CreatePredictionEngine<HouseData, Prediction>(model).Predict(size); Console.WriteLine($"Predicted price for size: {size.Size*1000} sq ft= {price.Price*100:C}k"); // Predicted price for size: 2500 sq ft= $261.98k } }
نمودار زیر نشان دهنده ساختار کد برنامه است و همچنین روند تکراری توسعه مدل:
بیایید کمی عمیق تر به این مفاهیم بپردازیم.
یک مدل ML.NET یک شیء است که حاوی تبدیل هایی برای انجام در داده های ورودی خود را برای رسیدن به خروجی پیش بینی شده است.
پایه - basic
اکثر مدل پایه (The most basic model) رگرسیون خطی دو بعدی هستند(two-dimensional linear regression)، جایی که یک مقدار پیوسته متناسب با دیگری است، همانطور که در مثال قیمت خانه در بالا است.
این مدل به سادگی : Price=b+Size∗w(قیمت = b +اندازه*w). پارامترهای b و w توسط یک خط در مجموعه ای از جفت ها (size، price) تخمین زده(برآورده) میشوند(همان خط آبی رنگ). داده های مورد استفاده برای پیدا کردن پارامترهای مدل training data (داده های آموزشی) نامیده می شود. ورودی های یک مدل یادگیری ماشین features (ویژگی ها) نامیده می شوند.در این مثال، اندازه(size) تنها ویژگی(feature) است.مقادیر حقیقی که برای آموزش یک مدل یادگیری ماشین استفاده می شوند، labels (برچسب ها) نامیده میشوند.در اینجا، مقادیر قیمت (price) در مجموعه داده های آموزشی، برچسب ها (labels) هستند.
پیچیدگی بیشتر
یک مدل پیچیده تر، معاملات مالی را به دسته بندی ها با استفاده از توضیحات متن معامله، طبقه بندی می کند.
هر شرح معامله با حذف کلمات و کاراکترهای اضافی و شمارش ترکیبات کلمه و کاراکتر به مجموعه ای از ویژگی ها(features) شکسته می شود. مجموعه ویژگی ها برای آموزش یک مدل خطی بر اساس مجموعه ای از دسته ها در داده های آموزشی (training data) استفاده می شود. یک شرح جدید مشابه آن است که در مجموعه آموزشی وجود دارد، بیشتر احتمال دارد که آن را به یک دسته اختصاص داده شود.
هر دو مدل قیمت خانه و مدل طبقه بندی متن، مدل های خطی(linear) هستند.بسته به ماهیت داده های شما و نحوه حل مشکل شما ، می توانید از مدل های درخت تصمیم گیری(decision tree)، مدل های افزایشی تعمیم یافته (generalized additive) و ... استفاده کنید. شما می توانید در مورد مدل ها در وظایف بیشتر بدانید.
در اغلب موارد، اطلاعاتی که شما در دسترس دارید مناسب نیست که به طور مستقیم برای آموزش یک مدل یادگیری ماشین استفاده شود. داده های خام نیاز به آماده شدن دارند یا قبل از پیش پردازش از آن می توانید برای پیدا کردن پارامترهای مدل مورد استفاده قرار گیرد.داده های شما ممکن است نیاز به تبدیل از مقادیر رشته به نمایش عددی داشته باشند. ممکن است اطلاعات بیش از حد در داده های ورودی خود داشته باشید. ممکن است لازم باشد ابعاد داده های ورودی خود را کاهش یا گسترش دهید. داده های شما ممکن است نیاز به نرمال شدن(normalized) یا مقیاس پذیری(scaled) داشته باشند.
آموزش ML.NET به شما در مورد خطوط لوله پردازش داده های متفاوت برای داده های متنی، تصویری، عددی و سری زمانی مورد استفاده برای وظایف یادگیری ماشین اختصاص می دهد.
چگونه اطلاعات خود را آماده کنید به شما نشان می دهد چگونه به طور کلی داده های آماده سازی را اعمال کنید.
شما می توانید یک ضمیمه از تمام تبدیل ها موجود در بخش منابع پیدا کنید.
هنگامی که مدل خود را آموزش داده اید، چطور می دانید که پیش بینی های آینده چگونه خواهد بود؟ با ML.NET، شما می توانید مدل خود را در برابر تعدادی از داده های تست جدید ارزیابی کنید.
هر نوع وظیفه (task) یادگیری ماشین دارای معیارهای مورد استفاده برای ارزیابی دقت و دقت مدل در برابر مجموعه داده های آزمون است.
برای نمونه قیمت خانه ما، ما از وظیفه Regression (رگرسیون) استفاده کردیم. برای ارزیابی مدل، کد زیر را به نمونه اصلی اضافه کنید.
HouseData[] testHouseData = { new HouseData () { Size = 1.1F, Price = 0.98F }, new HouseData () { Size = 1.9F, Price = 2.1F }, new HouseData () { Size = 2.8F, Price = 2.9F }, new HouseData () { Size = 3.4F, Price = 3.6F } }; var testHouseDataView = mlContext.Data.LoadFromEnumerable (houseData); var testPriceDataView = model.Transform (testHouseDataView); var metrics = mlContext.Regression.Evaluate (testPriceDataView, labelColumnName: "Price"); Console.WriteLine ($"R^2: {metrics.RSquared:0.##}"); Console.WriteLine ($"RMS error: {metrics.RootMeanSquaredError:0.##}"); // R^2: 0.99 // RMS error: 0.09
معیار ارزیابی به شما می گوید که خطا کم است(low-ish) و همبستگی بین خروجی پیش بینی شده و خروجی آزمون بالا است. آسان بود! در نمونه های واقعی، برای رسیدن به معیارهای مدل خوب، تنظیم بیشتری لازم است.
در این بخش، به سراغ الگوهای معماری ML.NET می رویم. اگر شما یک توسعه دهنده دات نت با تجربه هستید، برخی از این الگوهای برای شما آشنا هستند و بعضی از آنها کمتر شناخته شده خواهند بود.
یک برنامه ML.NET با یک شیء MLContext شروع می شود. این شی singleton لیست شامل catalogs (کاتالوگ ها) است. یک catalog (کاتالوگ) یک کارخانه برای بارگیری (loading) و ذخیره(saving) اطلاعات، تبدیل(transforms)، آموزش(trainers-مربیان)، و اجزای عملکرد مدل(model operation components) است. هر شیء کاتالوگ روش هایی (methods) برای ایجاد انواع مختلف اجزا دارد:
لینک عکس بالا برای دسترسی به لینک هایی که درون عکس میبینید
شما می توانید به روش های ایجاد شده در هر یک از دسته های بالا حرکت کنید. با استفاده از ویژوال استودیو، کاتالوگ ها از طریق IntelliSense نشان داده می شوند.
ساخت خط لوله(pipeline)
درون هر کاتالوگ مجموعه ای از extension method ها(روش های توسعه) است. بیایید نگاه کنیم چگونه extension method ها برای ایجاد خط لوله آموزش استفاده می شود.
var pipeline = mlContext.Transforms.Concatenate ("Features", new [] { "Size" }) .Append (mlContext.Regression.Trainers.Sdca (labelColumnName: "Price", maximumNumberOfIterations : 100);
در قطعه بالا, Concatenate (به معنی ترکیب کردن) و Sdca هر دو method در کاتالوگ هستند. هر کدام یک شیء IEstimator (شی برآوردگر-تخمین زننده) ایجاد می کند که به خط لوله اضافه شده است.
در این مرحله، اشیاء تنها ایجاد می شوند اما اجرا نشده اند.
آموزش مدل Train the model
هنگامی که اشیاء در خط لوله ایجاد شده است، داده ها را می توان برای آموزش مدل استفاده کرد.
var model = pipeline.Fit(trainingData);
فراخوانی Fit() از داده های آموزش ورودی برای تخمین پارامترهای مدل استفاده می کند، که به عنوان آموزش مدل شناخته شده است. به یاد داشته باشید که مدل regression خطی بالا دو پارامتر مدل دارد: size و price(وزن و اندازه).بعد از فراخوانی Fit() مقادیر پارامترها شناخته شده است. بیشتر مدل ها پارامترهای بیشتری از این را دارند.
شما می توانید در مورد آموزش مدل در نحوه آموزش مدل خود بیاموزید.
نتیجه شی مدل اینترفیس ITransformer را پیاده سازی می کند. به عبارت دیگر، مدل اطلاعات ورودی را به پیش بینی تبدیل می کند.
IDataView predictions = model.Transform(inputData);
استفاده از مدل - Use the model
شما می توانید داده های ورودی را به صورت فله ای (bulk - یعنی دسته جمعی) یا یک ورودی در یک زمان ،به پیشبینی ها (predictions) تبدیل کنید. ما در مثال قیمت خانه، هر دو: به صورت عمده برای ارزیابی مدل، و یکی در یک زمان برای پیش بینی جدید،انجام دادیم.
var size = new HouseData() { Size = 2.5F }; var predEngine = model.CreatePredictionEngine<HouseData, Prediction>(mlContext); var price = predEngine.Predict(size);
متد CreatePredictionEngine() (ایجاد موتور پیش بینی) یک کلاس ورودی و یک کلاس خروجی می گیرد. نام فیلدها(field ها) و/یا کد صفات (code attributes) نام ستونهای داده مورد استفاده در آموزش و پیش بینی مدل را تعیین می کند.
شما می توانید در مورد چگونگی ایجاد یک پیش بینی تنها در قسمت نحوه خواندن بخوانید.
مدل های داده و طرح Data models and schema
در هسته ML.NET ماشین یادگیری خطوط شی DataView است.
هر تغییری در خط لوله یک طرح ورودی(input schema) دارد (نام داده ها، انواع و اندازه هایی که انتظار می رود در انتظار تبدیل روی ورودی آن باشد)؛ و یک طرح خروجی(output schema) (نام داده ها، انواع و اندازه هایی که تبدیل پس از تحول ایجاد می شود).
اگر طرح خروجی از یک تبدیل در خط لوله با طرح ورودی تبدیل بعدی (طرح ورودی تبدیل بعد از خودش)مطابقت نداشته باشد، ML.NET یک استثناء را پرتاب می کند.
یک شی data view دارای ستون ها و ردیف ها است. هر ستون دارای نام و نوع و طول است. به عنوان مثال: ستون های ورودی در مثال قیمت خانه عبارتند از اندازه(Size) و قیمت(Price).
تمام الگوریتم های ML.NET برای یک ستون ورودی که یک بردار است نگاه می کنند. به طور پیش فرض نام این ستون بردار Features است. به همین دلیل ما ستون Size را به یک ستون جدید به نام Features در مثال خانه اضافه کردیم.
var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" })
همه الگوریتم ها همچنین پس از انجام پیش بینی، ستون های جدیدی ایجاد می کنند. نام ثابت این ستون های جدید به نوع الگوریتم یادگیری ماشین بستگی دارد. برای وظیفه regression ، یکی از ستون های جدید نامیده می شود Score (امتیاز). به همین دلیل ما داده قیمت (price) خود را با این نام نسبت دادیم.
public class Prediction { [ColumnName ("Score")] public float Price { get; set; } }
شما می توانید اطلاعات بیشتر در مورد ستون های خروجی از وظایف مختلف یادگیری ماشین را در راهنمای Tasks یادگیری ماشین بیشتر بدانید.
یک خاصیت(property) مهم از اشیاء DataView این است که آنها به طور تنبل (lazily) مورد ارزیابی قرار می گیرند. نمایش داده ها فقط در طول آموزش و ارزیابی مدل و پیش بینی داده ها، بارگیری و اجرا می شوند. در حالی که شما در حال نوشتن و تست برنامه ML.NET خود هستید، می توانید از debugger ویژوال استودیو استفاده کنید تا بتوانید با استفاده از متد Preview (پیش نمایش)، مشاهده کنید(peek).
var debug = testPriceDataView.Preview();
شما می توانید متغیر debug در debugger (اشکال زدایی) را مشاهده کرده و محتویات آن را بررسی کنید. از متد Preview() در محصول نهایی استفاده نکنید، زیرا عملکرد به طور قابل توجهی کاهش می یابد.
استقرار مدل Model Deployment
در برنامه های کاربردی واقعی، آموزش مدل و کد ارزیابی شما از پیش بینی شما جداگانه خواهد بود. در واقع، این دو فعالیت اغلب توسط تیم های جداگانه انجام می شود. تیم توسعه دهنده مدل شما می تواند مدل را برای استفاده در برنامه پیش بینی ذخیره کند.