ML.NET - bu C# va F# dasturlash tillari uchun Microsoft tomonidan ishlab chiqilgan bepul ochiq kodli “machine learning” kutubxonasi. Ushbu maqolada ML.NET regressiya modeli asosida ko'chmas mulk narxlarini prognoz qilishni sizlar bo'lishmoqchiman. Modelning vazifasi taqdim etilgan parametrlar asosida ko'chmas mulk narxini bashorat qilishdir.

 

ML.NET paketini o'rnatish

ML.NET dan foydalanish uchun Microsoft.ML paketini o'rnatishingiz kerak. Buning uchun quyidagi buyruqni bajarish kerak:

dotnet add package Microsoft.ML

 

Ma'lumotlar to'plami

Modelni o'rgatish uchun bizga ma'lumotlar bazasi kerak bo'ladi, buning uchun men “Boston housing dataset” ma'lumotlar to'plamidan foydalanaman. Ma'lumot 507 qatorli CSV faylda joylashgan. Bunday kichik to'plamda aniq modelni qurish mumkin emas, lekin mashq qilish uchun yetarli. Har bir qatorda Boston hududidagi alohida ko'chmas mulk haqida ma'lumotlar mavjud. 

U taxminan quyidagi ko'rinshga ega:

CRIMZNINDUSCHASNOXRMAGEDISRADTAXPTRATIOBLSTATMEDV
0.00632182.3100.5386.57565.24.09129615.3396.94.9824

 

Amaliy qism

Avval modelining kiruvchi (BostonHousingData) va chiquvchi (BostonHousingPricePrediction) ma'lumotlarni tavsiflavchi klasslarni yaratamiz.

using Microsoft.ML.Data;

namespace LinearRegression;

/// <summary>
/// Ushbu class kiruvchi ma'lumotlarni tavsiflaydi. O'quv va bashorat operatsiyalarda ishlatiladi
/// Birinchi 11 ta xususiyat bashorat qilish uchun ishlatiladigan parametrlar
/// MedianPrice - bashorat qilinadigan xususiyat, ya'ni Label. Faqat modelni o'rgatish jarayonida ishlatiladi
/// </summary>
public class BostonHousingData
{
	/// <summary>
    /// Shaharlar bo'yicha aholi jon boshiga jinoyat reytingi
    /// </summary>
    [LoadColumn(0)]
    public float CrimeRate { get; set; }

    [LoadColumn(1)]
    public float Zoned { get; set; }

    [LoadColumn(2)]
    public float Proportion { get; set; }

    [LoadColumn(3)]
    public float RiverCoast { get; set; }

    [LoadColumn(4)]
    public float NOConcetration { get; set; }

    [LoadColumn(5)]
    public float NumOfRoomsPerDwelling { get; set; }

    [LoadColumn(6)]
    public float Age { get; set; }

    [LoadColumn(7)]
    public float EmployCenterDistance { get; set; }

    [LoadColumn(8)]
    public float HighwayAccecabilityRadius { get; set; }

    [LoadColumn(9)]
    public float TaxRate { get; set; }

    [LoadColumn(10)]
    public float PTRatio { get; set; }

    /// <summary>
    /// Ko'chmas mukning o'rtacha qiymati ($1000 da)
    /// </summary>
    [LoadColumn(11)]
    public float MedianPrice { get; set; }
}
using Microsoft.ML.Data;

namespace LinearRegression;

/// <summary>
/// Bu klass bashorat natijasini tavsiflaydi.
/// </summary>
public class BostonHousingPricePrediction
{
    [ColumnName("Score")]
    public float MedianPrice;
}

ML kontekstini yaratib, ma'lumotni yuklaymiz:

MLContext mlContext = new();

IDataView trainingDataView = mlContext.Data.LoadFromTextFile<BostonHousingData>("HousingData.csv", hasHeader: true, separatorChar: ',');

var data = mlContext.Data.TrainTestSplit(trainingDataView, testFraction: 0.3);

MLContext - ML.NET uchun boshlangʻich nuqtadir. Bu sinf, EntityFramework`dagi DbContext kabi barcha ishlarni va barcha elementlarni bog'laydi.

IDataView - Ma'lumotlar strukturasini ifodalaydi va ma'lumotlarni saralash, filtrlash, qidirish, o'zgartirish va navigatsiya qilish uchun ishlatiladi. U ma'lumotlarni o'zida saqlamaydi, faqat o'ziga bog'liq DataTable ko'rinishini ifodalaydi. 

DataView`ning ya'na bir imkoniyatlaridan biri, bu ma'lumotlarni yuklash. Yuqorida ko'rsatilgan LoadFromTextFile metodi yordamida ma'lumotlarni yuklab oldik. Keyin uni 70 foizini modelimizni o`rganitish uchun va 30 foizini natijani test qilish uchun TrainTestSplit metodi yordamida ajratib oldik. TrainTestSplit metodi muhim, chunki ML modelini tekshirmasdan, uning bashoratlari qanchalik to'g'ri ekanligini aytib bo'lmaydi. Ideal holda, sizga ikkita kirish ma'lumotlar to'plami kerak bo'ladi: biri o'qitish uchun, ikkinchisi tekshirish uchun. Ba'zan bizda boshidanoq ikkita ma'lumot to'plami mavjud. Ko'pincha faqat bitta ma'lumotlar to'plami mavjud. Bunday holda, biz uni o'quv ma'lumotlar to'plamiga va tekshirish/tasdiqlash ma'lumotlar to'plamiga ajratamiz. Odatda bu bo'linish 80/20 nisbatda amalga oshiriladi, lekin ba'zida u 50/50 bo'lishi mumkin.

 

Ma'lumotlarni tayyorlash

ML.NETdan ma'lumotlarni qayta ishlash uchun foydalanishingiz mumkin. Agar siz oldin MLdan foydalangan bo'lsangiz, bilasizki, haqiqiy misollardan olingan ma'lumotlar juda “xom” yoki strukturalanmagan va jiddiy ishlov berishni talab qiladi. Bunday qayta ishlashning klassik na'munasi normalizatsiya deb ataladigan jarayondir. Agar modelni o'rgatish uchun ishlatiladigan ma'lumotlar “xom” bo'lsa, eng yomon holatda, bu modelning ma'lum bir yechimga kela olmasligiga olib kelishi mumkin. Eng yaxshi holatda, modelni o'rgatish kerak bo'lganidan ancha uzoqroq vaqtni oladi va modelning aniqligi yomonlashishi mumkin. Buning oldini olish uchun ma'lumotlar normallashtiriladi. ML.NET ushbu transformatsiyani bitta kod qatorida amalga oshirish imkoniyatini beradi.

Quyidagi kod yordamida biz ma'lumotlarimizni normallashtiramiz va modelni o'rgatish uchun kerakli algoritmni sozlaymiz:

// Ma'lumotni kerakli ko'rinishga o'zgartirish

var pipeline = mlContext.Transforms
    .CopyColumns("Label", nameof(BostonHousingData.MedianPrice))
    .Append(mlContext.Transforms.Categorical.OneHotEncoding("RiverCoast"))
    .Append(mlContext.Transforms.Concatenate(
        "Features",
        "CrimeRate", "Zoned", "Proportion", "RiverCoast", "NOConcetration", "NumOfRoomsPerDwelling", "Age", "EmployCenterDistance", "HighwayAccecabilityRadius", "TaxRate", "PTRatio"))
    .Append(mlContext.Transforms.NormalizeLogMeanVariance("Features", "Features"))
    .AppendCacheCheckpoint(mlContext)
    // Modelni o'rgatish uchun algoritmni sozlash
    .Append(mlContext.Regression.Trainers.Sdca(labelColumnName: "Label", featureColumnName: "Features"));

 

Modelni o'rgatish

Ma'lumotlarni yuklaganimizdan so'ng modelni o'rgatishni boshlasak bo'ladi.

var model = pipeline.Fit(data.TrainSet);

Yuqorida kuzatish mumkinku, modilimizni o`rgatish uchun 70/30 nisbatda ajratilgan ma'lumotdan 70 foiz o'rgatish uchun ajratilgan ma'lumotdan foydalandik.

Model o'z vazifasini bajarayotganligini bilishning yagona yo'li - tekshirish. ML.NET da bu jarayon imkon qadar soddalashtirilgan.

// Evaluate trained model.
var testSetTransform = model.Transform(data.TestSet);
var modelMetrics = mlContext.Regression.Evaluate(testSetTransform);

Modelni to'grililigini tekshirish uchun mlContext.Regression.Evaluatemetodidan foydalanib, natijada kerakli ko'rsatkichlarni ko'rishimiz mumkin. Bu ko'rsatkichlardan biri RSquared ko`rsatgichi. Buni determinatsiya koeffitsienti, R2 deb atash mumkin. U 0 dan 1 gacha, 0 modelning past aniqligini va 1 yuqori aniqlikni ko'rsatadi. Siz R2 ni 0,8 yoki 0,9 dan yuqori bo'lishiga intilishingiz kerak. 

Men modelni tekshirish uchun dasturni ishga tushuraman va natijasni konsolga chiqaraman:

Ko'rib turganingizdek, R2 ko'rsatgichi 0.19 ga teng. Bu esa juda past hisoblanadi. Buning sababi, maqolaning boshida ta'kidlab o'tganimdek modelni o'rgatish uchun yetalicha ma'lumot yo'qligi.

 

Bashorat qilish

Nihoyat yuqorida barcha amallar muvaffaqiyatli o'tganidan keyin, biz tayyor bo'lgan modelimizni bashorat qilish uchun foydalansak bo'ladi.

Buning uchun men avval yangi ko'chmas mulk ob'ektini, uni narxini bashorat qilish uchun yarataman:  

 var newHouse = new BostonHousingData
{
    Age = 51.7f,
    CrimeRate = 0.00329f,
    EmployCenterDistance = 4.0900f,
    HighwayAccecabilityRadius = 15.3f,
    NOConcetration = 0.538f,
    NumOfRoomsPerDwelling = 6.575f,
    Proportion = 1f,
    PTRatio = 15.3f,
    RiverCoast = 0f,
    TaxRate = 296f,
    Zoned = 23f
};

Yangi ob'ektni bashorat qilamiz va natijani konsolga chiqaramiz:


var predictionEngine = mlContext.Model.CreatePredictionEngine<BostonHousingData, BostonHousingPricePrediction>(model);
var prediction = predictionEngine.Predict(newHouse);

Console.WriteLine("------------------------------");
Console.WriteLine($"Prediction: {prediction.MedianPrice:#.##}");
Console.WriteLine("------------------------------");

Natijada quyidagini oldim:

Ya'ni yangi uyimizni bashorat qilingan narxi - 388.69

Endi men huddi shu uyni yana bir marta bashorat qilaman, faqat bu gal CrimeRate - ushbu hudud jinoyat reytingini CrimeRate = 0.99f ga o'zgartiraman va dasturni qayta ishga tushiraman. 

Natijada quyidagini oldim:

Uyimizni bashorat qilingan narxi - 349.74

Ko'rishimiz mumkinki, jinoyat ko'rsatkichi yuqori bo'lgan hududdagi uy-joyning narxi oldingi uyimizdan pastroq.

 

Xulosa

Maqolada regressiya modeli asosida ko'chmas mulk narxlarini bashorat qilishni ko'rib chiqdik. Bundan tashqari, ML.NET`ni foydalanuvchilarnig sharhlarini avtomatik ravishda ijobiy yoki salbiy deb tasniflashda, bank operatsiyalaridagi soxta tranzaksiyalarni aniqlashda, onlayn xaridorlar oldingi xaridlari asosida sotib olishlari mumkin bo'lgan mahsulot taklif qilishda, moliya va meditsina sohasida ishlatsa bo'ladi. 

ML.NET - C# va F# dasturlash tillari uchun ochiq kodli ML kutubxonasi. U Python modellari bilan ham ishlay oladi. Ushbu saytda batafsil ma'lumot olishingiz mumkin.