دسته بندی گلها با استفاده از  خوشه بندی k-means در ML.NET(قسمت 5)

درک مسئلهاین مشکل در مورد تقسیم مجموعه گلهای عنبیه در گروه های مختلف بر اساس ویژگی های گل است(یعنی یک گل با ویژگیهای خاص خودش در کدام گروه باید قرار گیرد).این ویژگی ها طول و عرض یک کاسبرگ و طول و عرض یک گلبرگ است.برای این آموزش فرض کنید که نوع هر گل ناشناخته است.شما می خواهید ساختار یک مجموعه داده را از ویژگی ها بیاموزید و پیش بینی کنید که چگونه یک نمونه داده با این ساختار متناسب است. http://en.wikipedia.org/wiki/File:Petal-sepal.jpg معرفی کاسبرگ و گلبرک صرفا برای اطلاعات عمومینکته: تصویر بالا ، تصویر گل عنبیه نیست و فقط برای اطلاع عمومی میباشد.انتخاب وظیفه یادگیری ماشین مناسباز آنجا که نمی دانید هر گل به کدام گروه تعلق دارد ، وظیفه unsupervised machine learning (یادگیری ماشین بدون نظارت) را انتخاب می کنید.تقسیم داده ها(data set) در گروه ها به گونه ای تقسیم می شود که عناصر موجود در همان گروه بیشتر از سایر گروه ها به یکدیگر شبیه باشند ،برای این کاز یک وظیفه یادگیری ماشین clustering(خوشه ای) استفاده کنید.ساخت Console application1- یک console applicaton از نوع .NET Core بسازید و نام آن را IrisFlowerClustering بگذارید.2- درون آن یک پوسته با نام Data درست کنید.3- پکیج Microsoft.ML از طریق nuget نصب کنید (این آموزش از نسخه v1.0.0 استفاده میکند).آماده کردن داده ها1- مجموعه داده(data set دیتاست) iris.data دانلود کنید و آن را در پوشه Data قرار دهید. برای اطلاعات بیشتر در مورد مجموعه داده iris صفحه ویکیپدیا Iris flower data set و صفحه Iris Data Set که منبع مجموعه داده ها است را مشاهده کنید.2- روی فایل iris.data کلیک راست کرده و Properties انتخاب کنید. زیر Advanced l مقدار Copy to Output Directory را به Copy if newer تغییر دهید.فایل iris.data شامل پنج ستون است که نشان دهنده:طول کاسبرگ (sepal) در سانتی مترعرض کاسبرگ در سانتی مترطول گلبرگ (petal) در سانتی مترعرض گلبرگ در سانتی مترنوع گل عنبیهبه خاطر مثال خوشه بندی ، این آموزش آخرین ستون را نادیده می گیرد.ایجاد کلاس هاکلاس ها را برای داده های ورودی و پیش بینی ها ایجاد کنید:1- یک کلاس جدید با نام IrisData.cs ایجاد کنید2- از دایرکتیور using استفاده کنید:using Microsoft.ML.Data;تعریف کلاس موجود را حذف کرده و کد زیر را که کلاس های IrisData و ClusterPrediction را تعریف می کند ، به فایل IrisData.cs اضافه کنید:public class IrisData { [LoadColumn(0)] public float SepalLength; [LoadColumn(1)] public float SepalWidth; [LoadColumn(2)] public float PetalLength; [LoadColumn(3)] public float PetalWidth; } public class ClusterPrediction { [ColumnName("PredictedLabel")] public uint PredictedClusterId; [ColumnName("Score")] public float[] Distances; }کلاس IrisData کلاس داده ورودی است و تعاریف برای هر ویژگی از مجموعه داده دارد. برای مشخص کردن شاخص های ستون های منبع در فایل مجموعه داده از صفت LoadColumn استفاده کنید.کلاس ClusterPrediction نشان دهنده خروجی مدل خوشه بندی است که برای نمونه IrisData اعمال می شود.با استفاده از صفت ColumnName ، فیلدهای PredposedClusterId و Distances را به ترتیب در ستون های PredelledLabel و Score قرار دهید(bind کنید).در صورت انجام وظیفه خوشه بندی ، این ستون ها دارای معنی زیر هستند:برچسب پیشبینی شده PredictedLabel :ستون حاوی شناسه(ID) خوشه(cluster) پیش بینی شده است.امتیاز Score :ستون شامل آرایه ای با مسافت اقلیدسی مربع(squared Euclidean distances) تا centroid های خوشه است.توجه از نوع float برای نشان دادن مقادیر نقطه شناور (floating-point) در کلاسهای داده ورودی و پیش بینی استفاده کنید.تعریف داده ها و مسیر مدلبه فایل Program.cs برگردید و دو فیلد را برای نگهداشتن مسیرها به فایل مجموعه داده و فایل ذخیره مدل اضافه کنید:مسیر داده _dataPath : شامل مسیر فایل مجموعه داده ی مورد استفاده برای آموزش مدل است.مسیر مدل _modelPath : شامل مسیر فایلی است که مدل آموزش دیده در آن ذخیره شده است.برای مشخص کردن این مسیرها کد زیر را بالاتر از متد Main اضافه کنید:static readonly string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "iris.data"); static readonly string _modelPath = Path.Combine(Environment.CurrentDirectory, "Data", "IrisClusteringModel.zip");همچنین به فایل Program.cs دستورات زیر را اضافه کنیدusing System; using System.IO;ایجاد ML contextدستورات زیر را به بالای فایل Program.cs اضافه کنیدusing Microsoft.ML; using Microsoft.ML.Data;در متد Main ،بجای Console.WriteLine ("Hello World!") کد زیر را جایگزین کنید :var mlContext = new MLContext(seed: 0);کلاس Microsoft.ML.MLContext نمایانگر محیط یادگیری ماشین است و مکانیزم هایی را برای ورود و ورود به سیستم برای بارگذاری داده ها ، آموزش مدل ، پیش بینی و سایر کارها فراهم می کند. این از نظر مفهومی با استفاده از DbContext در Entity Framework قابل مقایسه است.راه اندازی بارگذاری داده هابرای بارگذاری داده ها ، کد زیر را به متد Main اضافه کنید:IDataView dataView = mlContext.Data.LoadFromTextFile<IrisData>(_dataPath, hasHeader: false, separatorChar: ',');اکستنشن متد جنریک MLContext.Data.LoadFromTextFile شکل وشمای مجموعه داده ها را از نوع IrisData ارائه شده استنباط می کند و IDataView را که می تواند به عنوان ورودی برای ترانسفورماتورها(transformer ها) استفاده شود ، بازمی گرداند.ایجاد یک خط لوله یادگیریبرای این آموزش ، خط لوله یادگیری کار خوشه بندی شامل دو مرحله زیر است:جمع کردن (concatenate) ستونهای بارگذاری شده(loaded columns) در یک ستون Features ، که توسط یک مربی خوشه بندی استفاده می شود.استفاده از یک مربی KMeansTrainer برای آموزش مدل با استفاده از الگوریتم خوشه بندی k-means++.کد زیر را به متد Main اضافه کنید:string featuresColumnName = "Features"; var pipeline = mlContext.Transforms .Concatenate(featuresColumnName, "SepalLength", "SepalWidth", "PetalLength", "PetalWidth") .Append(mlContext.Clustering.Trainers.KMeans(featuresColumnName, numberOfClusters: 3));کد مشخص می کند که مجموعه داده باید در سه خوشه تقسیم شوند.آموزش مدلمراحل اضافه شده در بخش های قبل خط لوله را برای آموزش آماده می کرد ، اما هیچکدام عملی نشده اند. برای انجام بارگذاری داده ها و آموزش مدل ، خط زیر را به متد Main اضافه کنید:var model = pipeline.Fit(dataView);ذخیره مدلدر این مرحله ، شما مدلی دارید که می تواند در هر یک از برنامه های NET موجود یا جدید خود ادغام کنید.برای ذخیره مدل خود در فایل .zip ، کد زیر را به متد Main اضافه کنید:using (var fileStream = new FileStream(_modelPath, FileMode.Create, FileAccess.Write, FileShare.Write)) { mlContext.Model.Save(model, dataView.Schema, fileStream); }استفاده از مدل برای پیش بینی ها برای پیش بینی ، از کلاس PredictionEngine&lt;TSrc,TDst&gt; استفاده کنید که نمونه هایی از نوع ورودی را از طریق خط لوله ترانسفورماتور (transformer) دریافت می کند و نمونه هایی از نوع خروجی را تولید می کند.برای ایجاد نمونه ای از آن کلاس خط زیر را به متد Main اضافه کنید:var predictor = mlContext.Model.CreatePredictionEngine<IrisData, ClusterPrediction>(model);کلاس TestIrisData ایجاد کنید تا نمونه های داده های آزمایشی(تستی) را ذخیره کنید:1- یک کلاس جدید با نام TestIrisData.cs ابجاد کنید.2- کلاس را static کنید:static class TestIrisDataاین آموزش یک نمونه از داده عنبیه را در این کلاس معرفی می کند. برای آزمایش مدل می توانید سناریوهای دیگری را اضافه کنید. کد زیر را وارد کلاس TestIrisData کنید:internal static readonly IrisData Setosa = new IrisData { SepalLength = 5.1f, SepalWidth = 3.5f, PetalLength = 1.4f, PetalWidth = 0.2f };برای پیدا کردن خوشه ای که آیتم مشخص شده به آن تعلق دارد ، به فایل Program.cs برگردید و کد زیر را به متد Main اضافه کنید:var prediction = predictor.Predict(TestIrisData.Setosa); Console.WriteLine($"Cluster: {prediction.PredictedClusterId}"); Console.WriteLine($"Distances: {string.Join(" ", prediction.Distances)}");برنامه را اجرا کنید تا ببینید کدام خوشه شامل نمونه مشخص داده شده و مسافت های مربع (squared distances) از آن نمونه تا centroid های خوشه است.نتایج شما باید مشابه موارد زیر باشد:Cluster: 2Distances: 11.69127 0.02159119 25.59896برای ادامه یادگیری و یافتن نمونه های بیشتر ، از مخزن GitHub ما بازدید کنید. مخزن dotnet / machinelearning GitHubمنبع