
Merhabalar,
Bu makalede .NET Core C# geliştiricileri için ML.NET hakkında giriş seviyesinde bilgiler vereceğim. Öncelikle bilmenizi isterim ki yapay zeka ve makine öğrenmesinde programlama dili olarak ağırlıklı bir şekilde Python tercih edilmektedir. Geçtiğimiz yıllarda Microsoft CognitiveToolkit’i Python ile piyasaya sürdükten sonra .NET versiyonu talep edilmiş ve Microsoft o zamanlar Python olmadan yapay zekanın düşünülemeyeceğini söylemiştir.
Ben de bunun üzerine Python öğrenmeye karar verdim. Dikkat ederseniz Boston Dynamics’in Spot’u, Hanson Robotics’in Sophia’sı, DWaveSys ve IBM’in kuantum bilgisayar kütüphaneleri gibi bir çok son teknoloji aslında eski bir dil olan Python ile yazılmış API’lerle geliyorlar.
Python’ı incelediğimde kesinlikle C#’ın daha kaliteli ve daha okunaklı bir dil olduğunu söyleyebilirim. Ancak yine de dediğim gibi yeni yapay zeka API’leri için Python’la ilgileniyor olmamız gerekiyor. Öbür taraftan Microsoft, .NET geliştiricileri için de yapay zeka ve makine öğrenmesi kütüphaneleri geliştirmeye devam ediyor.
Makine Öğrenmesinin mantığını anlamak için bu makale yardımcı olacaktır. Öncelikle hali hazırda .NET Core geliştiricisi olduğunuzu varsayıyorum. Benim bilgisayarımda .NET Core 5 yüklü ve şimdi birlikte ML.NET’i inceleyelim.
- ML.NET CLI’ını yükleyin: dotnet tool install -g mlnet
- Yeni Konsol Projesi oluşturun:
mkdir myMLApp
cd myMLApp
dotnet new console -o consumeModelApp
ML.NET ile aşağıdaki Makine Öğrenmesi senaryolarından birini tercih edebilirsiniz:
- Classification (Sınıflandırma) – Bunu ait olduğu kategori verisini tahmin etmek istiyorsanız kullanabilirsiniz (örneğin müşteri görüşlerinin pozitif mi negatif mi duyguda olduğunu analiz etmek için)
- Image classification (Resim Sınıflandırma) – Bunu resmin ait olduğu kategoriyi tahmin etmek istiyorsanız kullanabilirsiniz (örneğin resim kedi resmi mi, veya köpek resmi mi tahmin etmek için)
- Regression (Regresyon, örneğin, değer tahmini) – Bunu sayısal değeri tahmin etmek için kullanabilirsiniz (örneğin ev fiyatını tahmin etmek için)
- Recommendation (Öneri) – Bunu geçmiş oylamalara göre kullanıcıya öğeler önermek istediğiniz zaman kullanabilirsiniz (örneğin, ürün önerileri).
ML.NET’te Öğreticiyi kullanarak Model oluşturma işlemini ML.NET CLI ile komut satırından yapabildiğimiz gibi Windows’taki Visual Studio 2019’un arayüzünde sağlanan özelliklerden yararlanarak ta yapabiliriz. Ama ben bu yazımda AutoML kullanarak nasıl yapabiliriz, onu izah etmeye çalışacağım.
AutoML
Microsoft.ML NuGet pakedini projemize ekledikten sonra Makine Öğrenmesi’nde işlem sırası şöyledir:
- ML Context oluşturulur
- Öğrenme verisi C# kodu ile, veritabanından ya da metin dosyasından yüklenir. ML.NET CLI kullanırsanız komut satırın öğrenme verisini yükleyebiliyorsunuz. Biz AutoML ile C# kodları ile öğrenme verisini yükleyeceğiz.
- Model öğretici pipeline’ı öğrenme verisinden model oluşturulur
- Model’den tahmin motoru ile tahmin gerçekleştirilir
Projeniz içerisinde Regression.cs adında bir C# sınıfı oluşturun. İçeriği şöyle olacaktır:
using System;
using Microsoft.ML;
using Microsoft.ML.Data;
namespace myMLApp.Infrastructure
{
public class HouseData
{
public float Size { get; set; }
public float Price { get; set; }
}
public class Prediction
{
[ColumnName("Score")]
public float Price { get; set; }
}
public class Regression
{
private readonly MLContext mlContext;
public Regression()
{
this.mlContext = new MLContext();
}
public TransformerChain<RegressionPredictionTransformer<Microsoft.ML.Trainers.LinearRegressionModelParameters>> Train() {
// 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
return pipeline.Fit(trainingData);
}
public string MakePrediction(TransformerChain<RegressionPredictionTransformer<Microsoft.ML.Trainers.LinearRegressionModelParameters>> model) {
// 4. Make a prediction
var size = new HouseData() { Size = 2.5F };
var price = this.mlContext.Model.CreatePredictionEngine<HouseData, Prediction>(model).Predict(size);
return $"Predicted price for size: {size.Size*1000} sq ft= {price.Price*100:C}k";
}
}
}
Gördüğünüz üzere yapıcı metotta MLContext’imizi oluşturuyoruz. İki metodumuz bulunuyor: 1) Train 2) MakePrediction. Train metodunda öğrenme verisini yükleyip öğretici ile modelimizi oluşturuyoruz. MakePrediction’da modeli ve size bilgisini veriyoruz ve fiyat tahminimizi yapıyoruz.
Artık Web API controllerınızda aşağıdaki metodu yazıp tarayıcıdan çağırabilirsiniz:
[AllowAnonymous]
[HttpGet("ev-fiyat-tahmini")]
public IActionResult Regresyon() {
var mlRegression = new Regression();
var model = mlRegression.Train();
return Content(mlRegression.MakePrediction(model));
}
ev-fiyat-tahmini Web API’sini tarayıcıdan çağırdığınız şu sonucu alacaksınız:
Predicted price for size: 2500 sq ft= $277.90018k Sizlere bu makalemde AutoML kullanarak .NET Core'da makine öğrenmesini nasıl yapabileceğinizi anlattım, makine öğrenmesi senaryolarından Regresyon'u tercih ettik. Sorularınız için yorum bölümünü kullanabilirsiniz. Mutlu kodlamalar 🙂