.NET Core’da AutoML ile Makine Öğrenmesi


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.

  1. ML.NET CLI’ını yükleyin: dotnet tool install -g mlnet
  2. 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:

  1. ML Context oluşturulur
  2. Öğ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.
  3. Model öğretici pipeline’ı öğrenme verisinden model oluşturulur
  4. 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 🙂

Full Stack Yapay Zeka Rehberi


Çok fazla teknoloji seçeneği olduğundan Yapay Zeka çağında ne öğrenip hangi konuda uzmanlaşmak istediğinize karar verecek rehber niteliğinde makalelere ihtiyaç oluyor.

Yapay Zeka ve Blockchain hızla yaygınlaşıyor. Yapay Zeka dünyasında Python kullanılırken BlockChain’de yavaş olduğu için Python kullanılmıyor. C# ta kullanılmıyor. Solidity, Move, GoLang gibi diller kullanılıyor.

O yüzden bazen birden fazla dil bilmek gerekiyor, fakat herşeyi bilmek te iyi değil, belirli alanlarda uzmanlaşmak daha üretken olmanızı sağlayacaktır.

Microsoft dünyasından geliyorsanız deneyimlerime göre söyleyebilirim ki aşağıdaki teknolojilerden ilerleyebilirsiniz:

Backend için .NET Core 5

Python’u inceledim, eski. Yeni olan GoLang ise nesne-yönelimli programlamayı desteklemiyor.

O yüzden Backend için .NET Core 5 kullanabilirsiniz. .NET Core 5 güncel, hızlı ve C# çok kaliteli bir nesne-yönelimli dildir. Platform-bağımsızdır, Linux’ta da çalışır. (Yeni başlayanlara Python ve TensorFlow öneririm)

Web için Angular:

React ve React Native de iyidir. Ama Web ve Mobil denilince akla Google gelir, o yüzden Angular öneriyorum. Öğrenmesi zordur fakat mimarisi kaliteli ve tam donanımlıdır.

Mobil için Ionic veya Flutter:

Web projenizi mobile dönüştürmek veya Angularla hibrit mobil uygulama yazmak isterseniz Ionic tavsiye ederim. Biraz yavaş ve telefonun her özelliğini kullanamıyorsunuz ama pratik.

Native yazmak isterseniz, hem güzel görünsün hem hızlı olsun derseniz Flutter tavsiye ederim. Ancak bilmenizi isterim ki React ve React Native ile Web ve mobili aynı kişi kolayca geliştirsin diye düşünebilirsiniz, saygı duyarım.

Oyun geliştirmek isterseniz Swift ve Java ile Native mobil uygulama yazabilirsiniz.

Yapay Zeka için Tensorflow.js

Aslında TensorFlow daha yaygındır ama Python gerektirir. Backend’te .NET ya da başka teknoloji kullanıyorsanız yapay zeka için TensorFlow.js kullanabilirsiniz.

ChatBot yapacaksanız Dialogflow kullanabilirsiniz. Google teknolojileri yapay zekada daha iyidir.

Umarım teknoloji tercihlerinizde yol gösterici olabilmişimdir.

Özetle seçeneklerimiz şunlar:

1) Python, Tensorflow

2) .NET Core, TensorFlow.js

3) Angular, Ionic, Flutter

4) React, Ionic, React Native

Mutlu kodlamalar 🙂

Not: En avantajlı olanlar Java bilenler olsa da ister .NET Core, ister Python, ister Java, ister NodeJS kullanın, GoLang performans olarak diğerlerinden çok daha hızlı olduğu için Python devrinden sonra GoLang devri başlayacağını söyleyebiliriz. Bu durumda şimdiden GoLang kullanalım diye düşünenler olabilir, ancak şu dönemde Python devrini yaşamaktayız.

GoLang nesne-yönelimli değil, fakat yüksek performans için nesne-yönelimli yapılmamış. Onu garbage-collectoru bulunan yeni nesil C dili diye düşünebilirsiniz.

O halde ne yapalım?

  1. Yeni başlayanlar Python ve TensorFlow ile başlamalılar
  2. Eskiler ise mevcut teknolojilerinde kalıp TensorFlow.js ile yapay zekayı yakalayacaklar ve sonra stabil olduğunda GoLang’e geçecekler demektir.

Dikkat ederseniz robot sdkları, yapay zeka frameworkleri ve kuantum bilgisayarlar Python kullanıyorlar ama sonunda GoLang’te buluşacağız.

Soru: .NET Core bilenler Python öğrenmeli midiler? Eğer mevcut yapay zeka ve robot çağını yakalamak istiyorlarsa evet bu bir gereklilik görünüyor. Microsoft dahi Python olmaksızın yapay zekanın düşünülemeyeceğini söylemiş, yapay zeka için .NET yerine Python tavsiye etmiştir.