Dotnet Konferansı 2024:Geleceğin Kodlayıcıları için ML .NET: Makine Öğreniminde Yeni Yollar

Kardel Rüveyda ÇETİN
40 min readMay 25, 2024

Merhaba Değerli Okurlar,

Kardel Rüveyda Çetin olarak, bu heyecan dolu yolculuğu sizlerle paylaşmaktan büyük mutluluk duyuyorum. 2024 yılı itibariyle ikinci kez konuşmacı olarak katıldığım bu konferansın Medium yazısına hoş geldiniz! Eğer geçen senenin detaylarına göz atmak isterseniz, linkte bulabilirsiniz. :)

Geçtiğimiz yıl SignalR üzerine bir konu ile konferansa katılmıştım. Ancak bu yıl, geleceğin kodlayıcıları için önemli bir konu olan “Geleceğin Kodlayıcıları için ML.NET: Makine Öğreniminde Yeni Yollar” konusuna odaklandım. Bu seçimdeki temel neden, bu alanda yaptığım tez çalışmalarıyla yoğunlaşmamdı. Ancak çalışmalarım genellikle Python dilindeydi. Sonra kendi kendime, “Acaba .NET dünyasında bu konuda neler yapılabilir?” diye düşündüm ve ML.NET ile tanıştım. Bu yazıda, ML.NET hakkında sizlere detaylı bilgi sunmaya çalışacağım. Eğer bu satırları okuyorsanız, konferans bitmiş demektir. Umarım keyifli vakit geçirmişsinizdir! Haydi, başlayalım!

Konu Başlıkları

  • Ben kimim?
  • Bu konuyu neden seçtim?
  • Yapay Zeka ve Makine Öğrenimi (AI ve ML) Nedir?
  • Geleneksel Yaklaşım vs Modern Yaklaşım ( Makine Öğrenmesi)
  • Makine öğreniminde yaygın programlama dilleri
  • Makine öğrenmesi ile neler yapılabilir?
  • Makine öğrenmesi Çalışma Akışı
  • Makine Öğreniminde Top 10 Kelimeler
  • ML.Net Nedir?
  • ML.Net Mimarisi
  • ML.NET ile ilgili Merak Edilen Sorular
  • ML.Net Kurulumu nasıl gerçekleşir?
  • ML.Net nerelerde kullanılabilir?
  • ML.NET ile Makine Öğrenimine Başlamanın Yolları
  • ML.NET’in Performansı
  • DEMO

Ben Kimim?

Ben Kardel Rüveyda Çetin. Yıldız Teknik Üniversitesi Matematik Mühendisliği 2018 yılı mezunuyum. Akabinde Yıldız Teknik Üniversitesi Bilgisayar Mühendisliği Tezsiz Yüksek Lisans programından mezun oldum. 2023 yııl itibariyle ise gene Yıldız Teknik Üniversitesi Matematik Mühendisliği’nde tezli yüksek lisans programında eğitim ve öğretim hayatıma devam etmekteyim.Şu anda tez sürecindeyim. Tezimde büyük dil modelleriyle çalışmalar gerçekleştiriyorum.

Son 3 senedir Doğuş Teknoloji’de kariyerime devam ediyorum. Şu anda Expert Software Engineer olarak görev alıyorum. Daha öncesinde üç seneye yakın bir Kariyer.net geçmişim bulunuyor. Kendimi bildim bileli Full Stack olarak çalışıyorum. Backend tarafında C#, .Net Teknolojileri ilgimi çekerken önyüz tarafı ile de yakından ilgilenmeye çalışıyorum. Dil sempatizanı değilim, her dili öğrenmeye hevesli ve istekliyim ama dotnet ilk göz ağrım orası da ayrı mesele. Geçtiğimiz sene itibariyle çalışmalarıma ek olarak bir de yapay zeka konuları eklendi. Bu alanda da kendimi geliştirip çalışmalar yapmaya çalışıyorum.

Neden bu konuyu seçtim?

Konu temasını “Geleceğin Kodlayıcıları için ML .NET: Makine Öğreniminde Yeni Yollar” olarak belirlememin nedeni, makine öğreniminin kodlama dünyasında nasıl bir dönüşüm yaratabileceğini derinlemesine keşfetmek istememdir. Günümüzde, bilgisayar başında kod yazmaya başladığımız andan itibaren adeta farklı bir dünyanın kapılarını aralamış oluyoruz. Her yeni sorun, ardı ardına yeni soruları ve bu soruların peşinde yapılan araştırmaları beraberinde getiriyor. Bu sürekli öğrenme ve keşfetme süreci, hem bireysel gelişimimize hem de teknolojinin ilerlemesine büyük katkılar sağlıyor.

Ancak, son zamanlarda yapay zeka gibi kuvvetli bir teknolojik oyuncunun sahneye çıkmasıyla birlikte, yazılımcıların geleceği üzerine bir endişe dalgası da yayılmaya başladı. Yapay zeka, pek çok kişinin sorularına neden oluyor: Acaba bu yeni teknoloji, yazılımcıların yerini mi alacak? Hatta Nvidia CEO’su Jensen Huang’ın “Kodlama öğrenmeyin, bu işi artık yapay zeka yapacak.” şeklindeki ifadesi, bu endişeleri daha da alevlendirdi.

İşte bu bağlamda, ML .NET’in potansiyelini keşfetmek ve .NET ekosistemi içinde makine öğrenimine dair neler yapılabileceğini öğrenmek amacıyla bu konuyu seçmeye karar verdim. Çoğunlukla Python gibi diller üzerinden yürütülen makine öğrenimi çalışmalarına alternatif olarak, .NET ile neler başarabileceğimizi görmek, hem .NET kullanıcılarına hem de teknoloji alanında çeşitliliği artırmak isteyenlere yeni perspektifler sunacak. Bu konferans, makine öğreniminin sadece Python ile sınırlı olmadığını ve .NET kullanarak da nasıl etkili çözümler üretilebileceğini gösterme fırsatı verecek.

Geçen günlerde Amerikalı Yazar Mark Twain’in yazmış olduğu “İnsan Nedir?” kitabında şu satırlara rastladım:

“İnsan beyni öyle yapılandırılmıştır ki, ne olursa olsun hiçbir şey oluşturamaz. Ancak dışarıdan elde edilmiş malzemeyi kullanabilir. Sadece bir makinedir ve otomatik olarak çalışır, irade gücüyle değil. Kendi üzerinde hiçbir komutası yoktur. İnsan bir makinedir ve makineler yaratmazlar.

Bu satırları okurken aklıma yapay zeka geldi. Sonuçta yapay zeka da, günün sonunda bakıldığında, bir makine ve belirli talimatlarla elindeki verileri kullanarak hizmet veriyor. On yıl sonra yapay zekanın, fotoğrafta gördüğünüz gibi, dost mu yoksa düşman mı olacağını tahmin etmek zor; ancak bildiğim bir şey var: Kendimizi yapay zeka alanındaki gelişmelere hazırlamak ve bu alanda ilerlemek bizi geliştirecektir. Zamanla, bu alandan uzak olan yazılımcılar ile bu alanda uzmanlaşanlar arasında bariz farklar oluşacaktır. Yapay zekanın teorik bilgilerinin yanı sıra, yapay zeka tabanlı araçları kullanan yazılımcılar ile kullanmayanlar arasında da gözle görülür farklar oluşacaktır. Çünkü bu araçlar, zamanımızı daha verimli kullanmamıza ve daha kısa sürede daha fazla iş yapmamıza olanak tanıyacak araçlardır. Özetle, yazılımcılar olarak korkmamız gereken şey yapay zeka değil, yapay zekanın getirdiği yeni sorumluluklar ve öğrenmemiz gereken yeni bilgiler olmalıdır. :)

Yapay Zeka ve Makine Öğrenimi (AI ve ML) Nedir?

Yapay zeka (AI) ve makine öğrenimi (ML), teknoloji dünyasında son derece önemli iki kavramdır ve bu alanlar, bilgisayar sistemlerine insan benzeri zeka ve öğrenme yetenekleri kazandırarak belirli görevleri yerine getirmelerini sağlar. Bu terimler arasındaki farklar şu şekilde açıklanabilir:

Yapay Zeka (AI — Artificial Intelligence): AI, genel olarak insanlar tarafından yapılan işleri otomatize edebilen ve karar verme süreçlerini gerçekleştirebilen bilgisayar sistemlerini tanımlar. Örneğin, spam e-postaları filtrelemek gibi belirli kurallara dayalı işlemleri başarıyla yerine getirebilir.

Makine Öğrenimi (ML — Machine Learning): Makine öğrenimi, büyük veri kümelerinden öğrenerek desenleri tanımlama yeteneği üzerine kuruludur. Bu dal, müşteri yorumlarından duygusal analiz yapma veya görüntülerdeki nesneleri tanıma gibi işlemleri otomatize edebilir.

Derin Öğrenme (Deep Learning): Makine öğreniminin daha ileri bir alt dalı olan derin öğrenme, çok katmanlı yapay sinir ağları kullanarak daha karmaşık problemleri çözme kapasitesine sahiptir. Bu teknoloji, ses ve görüntü tanıma gibi daha zorlu görevlerde sıklıkla kullanılır.

Generative AI: Yapay zekanın bir başka heyecan verici uygulaması olan generative AI, derin öğrenme modellerini kullanarak tamamen yeni içerikler üretebilir. Bu, metin, resim, müzik ve hatta video gibi çeşitli formatlarda olabilir ve bu teknoloji sayesinde yaratıcılık sınırları genişlemektedir.

Makine Öğrenmesine Giriş

Bizim seçtiğimiz konu makine öğrenmesi ile ilgili olduğu için çalışmalarımızı onun üzerinden devam ettireceğiz. Peki makine öğrenmesini daha iyi bir şekilde anlamak için bunu bir örnekle hikayeleştirerek açıklayalım:

Bir gün, bir yazılım ekibi, “Makine Öğrenimi nedir?” diye merak etti. Bir araştırma yapmaya başladı:

Merak Uyanıyor: Bilgisayarları nasıl daha akıllı hale getirebileceğini düşünürken “Makine Öğrenimi” kavramıyla karşılaştı. Bu konunun ne olduğunu anlamak için bir adım atmaya karar verdi.

Köpek mi, Kedi mi?: Önce, bir fotoğrafın bir köpek resmi mi yoksa bir kedi resmi mi olduğunu anlamak istediğini düşündü. Ama bu iş, sıradan bir programlama yaklaşımıyla zor olurdu.

Geleneksel Yol: Eski zamanlarda, bir köpek veya bir kedi resmi olduğunu belirlemek için belirli özelliklere dayalı bir program yazmak gerekirdi. “Peki, kulakları ne kadar büyük? Dil var mı? Pençeleri var mı?” gibi bir sürü soruyu kendi başına yanıtlamak zorunda kalırdı.

Yeni Yaklaşım: Neyse ki, makine öğrenimiyle tanıştı. Bu, resimlerden öğrenme yeteneği kazanan bir program türüydü. Yani, ona binlerce köpek ve kedi resmi verirseniz, program bu resimleri inceleyip neyin köpek, neyin kedi olduğunu kendi kendine öğrenebilirdi.

Akıllı Program: Makine öğrenme programı, resimlerdeki özellikleri öğrendikçe daha da akıllı hale geldi. Artık bir resmin köpek mi yoksa kedi mi olduğunu anlamak için daha az bilgiye ihtiyacı vardı.

Yeni Bir Dünya: Bu yeni teknolojiyle neler yapılabileceğini gördü. Ses algılama, metin analizi, hatta görüntü işleme gibi birçok alanda kullanılabileceğini öğrendi.

Sonunda makine öğreniminin gerçekten de programlanamayanı programlamakla ilgili olduğunu anladı. Artık, bir resmin köpek mi yoksa kedi mi olduğunu belirlemek için sıfırdan bir program yazmak zorunda kalmayacak, makine öğrenme programının öğrendiklerini kullanabilecekti.

Makine öğreniminde yaygın programlama dilleri

Python: Python, makine öğrenimi için en popüler dil olarak öne çıkar. Kullanıcı dostu sözdizimi, geniş kütüphane ekosistemi ve topluluk desteği ile hem amatörler hem de profesyoneller tarafından sıklıkla tercih edilir. Python; TensorFlow, PyTorch, Scikit-learn gibi kapsamlı makine öğrenimi kütüphanelerine sahiptir.

R: Özellikle istatistiksel analiz ve veri bilimi projelerinde güçlü olan R, makine öğrenimi için de sıkça kullanılır. R, karmaşık veri işleme, istatistiksel testler ve veri görselleştirme için geniş bir paket koleksiyonuna sahiptir.

Java: Java, ölçeklenebilirlik ve hız nedeniyle büyük veri platformları ve kurumsal çevrelerde popülerdir. Weka, Deeplearning4j gibi Java tabanlı makine öğrenimi kütüphaneleri bulunmaktadır.

C++: Performans gerektiren düşük düzeyli sistemlerde, C++ makine öğrenimi algoritmalarının hızlı bir şekilde çalıştırılmasını sağlar. Ayrıca, birçok makine öğrenimi kütüphanesi C++ ile yazılmıştır, bu yüzden doğrudan bu dili kullanmak performans avantajı sağlayabilir.

Julia: Yüksek performanslı sayısal ve teknik hesaplama işlemleri için tasarlanmış olan Julia, makine öğrenimi ve veri işleme projelerinde giderek daha fazla kullanılmaktadır. Julia, Python’a kıyasla bazı durumlarda daha iyi performans sunabilir.

JavaScript : Web tabanlı uygulamalar ve tarayıcı içi makine öğrenimi projeleri için JavaScript ve TensorFlow.js gibi kütüphaneler kullanılır. Bu, makine öğrenimi modellerinin doğrudan bir web tarayıcısı üzerinde çalıştırılmasını sağlar.

Scala: Apache Spark gibi büyük veri işleme araçlarıyla entegrasyon sağlayan Scala, özellikle büyük veri ekosistemlerinde makine öğrenimi uygulamaları için tercih edilir. Bu diller, makine öğrenimi alanında farklı ihtiyaçları karşılamak için çeşitli özellikler ve kütüphaneler sunar. Proje gereksinimlerine göre en uygun dilin seçilmesi, geliştirme sürecinin verimliliğini ve sonucun başarısını doğrudan etkileyebilir.

C# : C# için .NET platformu, ML.NET kütüphanesi ile makine öğrenmesi uygulamaları geliştirmeye olanak sağlar. Bu kütüphane, özellikle Microsoft tarafından geliştirilen bir araçtır ve C# geliştiricilerine, kodlarını kolayca entegre edebilmeleri için güçlü ve esnek API’ler sunar. ML.NET, modelleri eğitmek için yerel makine kaynaklarını kullanır, bu da yüksek performans ve hız sağlar. Ayrıca, çeşitli senaryoları destekleyerek, veri işleme ve model eğitimi süreçlerini otomatize eden zengin bir algoritma seti içerir.

Makine Öğrenmesi Kullanım Alanları

1. Öngörüsel Analitik

  • Tahmin: ML, tarihsel verileri analiz ederek gelecekteki eğilimleri ve davranışları öngörebilir. Bu, finansta hisse fiyatlarının tahmin edilmesi, perakendede envanter yönetimi ve hava durumu tahmini için özellikle faydalıdır.
  • Risk Değerlendirmesi: Finans ve sigortacılıkta, ML modelleri, geçmiş müşteri verilerine dayanarak kredilerin veya sigorta poliçelerinin risk seviyelerini değerlendirir.

2. Doğal Dil İşleme (NLP)

  • Konuşma Tanıma: Sanal asistanlar (örn. Siri, Alexa) gibi sesle çalışan sistemler, insan konuşmasını yorumlamak için ML kullanır.
  • Çeviri Hizmetleri: Google Translate gibi araçlar, gerçek zamanlı dil çevirisi sağlamak ve zamanla dil doğruluğunu artırmak için ML kullanır.
  • Duygu Analizi: Şirketler, ürünler veya hizmetlere yönelik kamuoyu duyarlılığını ölçmek için müşteri geri bildirimlerini, incelemelerini ve sosyal medya yorumlarını analiz eder.

3. Görüntü ve Video Analizi

  • Yüz Tanıma: Güvenlik sistemlerinde bireyleri tanımak ya da pazarlamada müşteri tepkilerini analiz etmek için kullanılır.
  • Tıbbi Görüntüleme: ML algoritmaları, X-ışınları, MR’lar ve diğer tıbbi görüntülerde insan gözünün görmekte zorlandığı desenleri tespit ederek hastalıkları teşhis etmeye yardımcı olabilir.
  • Video Gözetimi: Güvenliği artırmak için gerçek zamanlı görüntüleri analiz ederek olağandışı davranışları tespit etmek veya nesneleri takip etmek.

4. Otomasyon ve Optimizasyon

  • Otonom Araçlar: ML algoritmaları, araç sensörlerinden gelen verileri işleyerek direksiyon, hızlanma ve frenleme gibi kararlar alır.
  • Akıllı Üretim: AI destekli robotlar ve makineler, üretim hatlarında verimliliği artırır ve insan hatasını azaltır.
  • Lojistik Optimizasyonu: ML modelleri, nakliye rotalarını ve programlarını optimize ederek maliyetleri düşürür ve teslimat sürelerini iyileştirir.

5. Kişiselleştirme ve Tavsiye Sistemleri

  • E-ticaret: Web siteleri, kullanıcıların gezinme ve satın alma geçmişine dayanarak ürün önerir.
  • İçerik Akışı: Netflix ve Spotify gibi platformlar, kullanıcıların geçmiş tercihlerine dayanarak filmler, şovlar veya müzik önerir.

6. Anormallik Tespiti

  • Dolandırıcılık Tespiti: Finans kurumları, dolandırıcılık faaliyetini işaret edebilecek olağandışı işlemleri saptamak için ML kullanır.
  • Ağ Güvenliği: ML algoritmaları, ağ davranışındaki tehditleri ve anomalleri tespit eder ve yanıt verir, siber güvenliği artırır.

7. Sağlık

  • Hastalık Tahmini ve Yönetimi: ML, hastalık salgınlarını öngörmeye yardımcı olur ve hasta verilerini kullanarak kronik hastalıkların yönetimini ve izlenmesini destekler.
  • İlaç Keşfi: Çeşitli kimyasal kombinasyonların etkinliğini tahmin ederek yeni ilaçların keşif sürecini hızlandırır.

8. Çevresel İzleme

  • Yaban Hayatı Koruma: ML, hayvan popülasyonlarını ve habitatlarını izlemek için kullanılarak koruma çabalarına yardımcı olur.
  • İklim Değişikliği Analizi: ML modelleri, çevresel verileri analiz ederek iklim değişikliklerini tahmin eder ve etkilerini değerlendirir.

9. Eğitim ve Araştırma

  • Uyarlanabilir Öğrenme Platformları: Eğitim içeriğini, öğrencilerin öğrenme hızına ve tarzına uyacak şekilde özelleştirir.
  • Araştırma Analizi: Bilimsel araştırmalarda veri analizini otomatikleştirerek zaman kazandırır ve doğruluğu artırır.

Makine öğreniminin uyarlama kabiliyeti, veriye dayalı karar verme sürecine sahip neredeyse her sektör için uyarlanabilir olmasını sağlar, bu da onu dijital çağda dönüştürücü bir teknoloji yapar.

Makine Öğrenmesi Çalışma Akışı

Makine öğrenimi, veriden anlamlı bilgiler çıkarmak ve bu bilgileri kullanarak modeller oluşturmak için kullanılan bir yapay zeka dalıdır. Bu süreç, veri toplamadan başlayarak modelin gerçek dünya senaryolarında kullanılmasına kadar bir dizi adımdan oluşur

Model Eğitim Aşamaları

Veri Toplama

Makine öğreniminin ilk ve en kritik adımı, analiz edilecek verilerin toplanmasıdır. Veri, çeşitli kaynaklardan elde edilebilir: kamuya açık veri kümeleri, şirket içi veritabanları, internet üzerinden toplanan veriler veya sensörlerden alınan gerçek zamanlı veriler gibi. Verinin kalitesi ve miktarı, modelin başarısını doğrudan etkileyen faktörlerdendir, bu yüzden bu aşama üzerinde dikkatle durulması gerekir.

Veri Temizleme ve Hazırlama

Toplanan veriler genellikle eksik bilgiler, hatalar veya tutarsızlıklar içerir. Veri temizleme işlemi, bu tür sorunları gidermek için gerçekleştirilir. Veri temizleme süreci, eksik değerlerin doldurulması, aykırı değerlerin düzeltilmesi veya kaldırılması ve gereksiz verilerin elenmesini içerir. Ayrıca, verilerin makine öğrenimi algoritmaları tarafından daha iyi işlenebilmesi için özellik mühendisliği adımları uygulanır. Bu adımlar, verinin normalleştirilmesi, kategorik verilerin sayısal verilere dönüştürülmesi ve veri boyutunun azaltılması işlemlerini içerebilir.

Model Seçimi

Veri hazırlandıktan sonra, en uygun makine öğrenimi modelinin seçilmesi gerekir. Bu seçim, problemin türüne (sınıflandırma, regresyon, kümeleme vb.) ve verinin doğasına bağlı olarak değişir. Çeşitli algoritmalar denenebilir ve her biri için çapraz doğrulama gibi tekniklerle modelin performansı değerlendirilir.

Model Eğitimi

Model seçildikten sonra, algoritma eğitim veri seti üzerinde çalıştırılarak modelin ağırlıkları ayarlanır. Bu süreçte, modelin veri üzerindeki genellemesini artırmak için çeşitli yöntemler uygulanabilir. Model eğitimi, bilgisayarın veriler arasındaki ilişkileri öğrenmesi ve bu bilgileri yeni verilere uygulayabilmesi sürecidir.

Model Değerlendirme

Modelin başarısını ölçmek için test veri seti kullanılır. Bu aşamada, modelin eğitim sırasında görmediği veriler üzerinde nasıl performans gösterdiği test edilir. Modelin doğruluğu, hassasiyeti, geri çağırma oranı ve F1 skoru gibi metriklerle değerlendirilir.

Makine öğrenimi modellerinin uygulanması ve kullanımı

Makine öğrenimi modellerinin uygulanması ve kullanımı (deployment ve inference), modelin geliştirilmesinden sonra gerçekleşen önemli adımlardır. Bu süreçler, eğitilmiş bir modelin gerçek dünya verileri üzerinde tahminler yapmasını ve bu tahminleri uygulamalar aracılığıyla son kullanıcıya sunmasını içerir.

Modelin Dağıtımı (Deployment)

Model deployment, eğitilmiş bir makine öğrenimi modelini bir üretim ortamına entegre etme sürecidir. Bu, modelin sürekli olarak veri alıp sonuç üretebilmesi için gereklidir. Dağıtım, modelin stabilitesi, erişilebilirliği ve güvenliği açısından kritik bir aşamadır.

  • Entegrasyon: Model, genellikle bir API aracılığıyla çeşitli uygulama ve hizmetlerle entegre edilir. Bu API’ler, diğer yazılımların modeli kolayca sorgulamasına ve tahminler almasına olanak tanır.
  • Otomasyon: Dağıtım süreci, modelin düzenli olarak güncellenmesi, bakımının yapılması ve performansının izlenmesi için otomatize edilebilir.
  • Ölçeklenebilirlik: Cloud platformlar (AWS, Azure, GCP gibi) kullanılarak model, yüksek talep durumlarında ölçeklenebilir ve yönetilebilir şekilde dağıtılabilir.

Tahmin Yapma (Inference)

Inference, eğitilmiş modelin yeni verilere dayanarak tahminler yapma sürecidir. Bu adım, modelin gerçek değerini ortaya koyar çünkü model burada öğrendiği bilgileri kullanarak gerçek problemlere çözümler üretir.

  • Gerçek Zamanlı İşleme: Bazı uygulamalar, anlık veri akışıyla çalışır ve modelden anında yanıt bekler (örneğin, finansal işlemlerde dolandırıcılık tespiti).
  • Toplu İşleme: Büyük veri setleri üzerinde tahminler yapmak için modeller bazen toplu işleme (batch processing) modunda çalıştırılır. Bu, genellikle büyük miktarda verinin işlenmesi gerektiğinde kullanılır.
  • Performans İzleme: Modelin doğruluğunu ve diğer performans metriklerini sürekli izlemek, modelin sağlığını ve etkinliğini garantiler. Eğer performans düşerse, modelin yeniden eğitilmesi veya ayarlanması gerekebilir.

Modelin dağıtımı ve inference işlemleri, modelin gerçek dünya verileri üzerinde etkili bir şekilde çalışabilmesi için kritik öneme sahiptir. Bu süreçler, modelin değerini maksimize eder ve son kullanıcılar için somut faydalar sağlar.

Makine Öğreniminde Top 10 Kelimeler

Eğer ML.Net ile çalışmaya başlayacaksanız ve daha önce makine öğrenmesi alanında tecrübeniz yoksa, bu alandaki işlemleri daha iyi anlamanız için öğrenmeniz gereken 10 temel terimi öneririm. Daha fazla terim için makaleyi ziyaret edebilirsiniz.

  1. Fine-tuning (İnce Ayarlama): Önceden eğitilmiş bir makine öğrenimi modelinin, belirli bir görev için daha iyi performans göstermesi amacıyla, genellikle sınırlı bir veri kümesiyle veya hedef görevin özel gereksinimlerine uyacak şekilde yeniden eğitilmesidir.
  2. Full Training (Tam Eğitim): Bu terim, bir makine öğrenimi modelinin tüm veri kümesi üzerinde eğitildiği anlamına gelir. Bu, tüm veri kümesinin model için kullanıldığı anlamına gelir, yani veri seti bir eğitim seti, doğrulama seti ve test seti olarak ayrılmaz.
  3. Train/Test Split (Eğitim/Test Bölünmesi): Veri kümesinin bir kısmının modelin eğitimi için kullanıldığı, diğer kısmının ise modelin performansının değerlendirilmesi için ayrıldığı işlemdir. Bu, modelin genelleme yeteneğini değerlendirmeye yardımcı olur.
  4. Training Data (Eğitim Verisi): Makine öğrenimi modelinin eğitildiği veri kümesidir. Bu veri, modelin belirli bir görevi öğrenmesi için kullanılır.
  5. Validation Data (Doğrulama Verisi): Modelin eğitimi sırasında kullanılan, ancak modelin performansını doğrulamak için ayrılan veri kümesidir. Modelin aşırı uydurmayı (overfitting) önlemek için kullanılır.
  6. Test Data (Test Verisi): Eğitim süreci tamamlandıktan sonra modelin gerçek dünya performansını değerlendirmek için ayrılan veri kümesidir. Modelin ne kadar iyi genelleme yaptığını belirlemek için kullanılır.
  7. Overfitting (Aşırı Uydurma): Modelin eğitim verisine çok iyi uyması, ancak yeni verilere genelleme yapma yeteneğinin düşük olması durumudur. Bu, modelin gereksiz karmaşıklığının veya eğitim verisindeki gürültünün bir sonucu olabilir.
  8. Epoch (Dönem): Bir eğitim setinin tamamının bir kez model tarafından görüldüğü zaman bir dönem olarak adlandırılır. Bir modelin eğitimi sırasında kaç dönem geçirileceği belirlenir.
  9. RAG (Retrieval-Augmented Generation): RAG, dilsel nesne oluşturma modellerinde kullanılan bir yöntemdir. Bu yöntem, büyük bir bilgi bankasından metin parçalarını alarak ve ardından bir modelin bu metinleri kullanarak yeni metinler oluşturmasını sağlayarak çalışır.
  10. Bert-Cased: “Cased” BERT modeli, metin verisini büyük/küçük harf duyarlılığını koruyarak işler. Yani, metin verisindeki büyük ve küçük harfler arasındaki farkı dikkate alır. Örneğin, “Apple” ve “apple” kelimelerini farklı kelimeler olarak algılar.
  11. Bert-Uncased: “Uncased” BERT modeli, metin verisini tamamen küçük harflere dönüştürerek işler. Bu durumda, metin verisindeki tüm harfler küçük harfe dönüştürülür. Bu yöntem, metin verisindeki harf büyüklüğünün önemli olmadığı durumlarda tercih edilir ve genellikle daha fazla veriyi öğrenme yeteneğine sahiptir.

ML.Net Nedir?

ML.NET, Microsoft tarafından geliştirilen ve .NET geliştiricilerinin kendi uygulamalarına makine öğrenimi yetenekleri eklemelerine olanak tanıyan açık kaynaklı bir kütüphanedir. C# veya F# gibi .NET dillerinde makine öğrenimi modelleri oluşturmak ve entegre etmek için tasarlanmıştır. ML.NET, veri bilimcileri ve geliştiriciler arasında köprü kurarak, makine öğrenimi modellerini daha erişilebilir hale getirmeyi amaçlar.

ML.NET, Microsoft’un iç kullanımı için on yılı aşkın bir süredir geliştirdiği bir araçtır. Ancak, Mayıs 2018'de açık kaynak olarak kamuoyuna sunuldu. Bu, Microsoft’un makine öğrenimi yeteneklerini geniş bir geliştirici topluluğuna açma çabasının bir parçasıydı. İlk açıklandığından bu yana, ML.NET sürekli olarak yeni özellikler ve iyileştirmeler ile güncellenmiştir.

ML.NET şu anda 3.0 sürümündedir. Bu sürüm, daha önceki sürümlerde bulunan birçok özelliği geliştirmenin yanı sıra, daha verimli algoritma seçimleri, daha iyi model değerlendirme araçları ve daha geniş model dağıtım seçenekleri sunmaktadır. Ayrıca, otomatik makine öğrenimi (AutoML) özelliği, geliştiricilere en iyi modeli otomatik olarak seçme ve ayarlama imkanı tanır. AutoML, zaman sınırlamaları ve performans kriterleri baz alınarak en uygun modeli bulmayı kolaylaştırır.

ML.NET, bir dizi makine öğrenimi görevini destekler, bu da geliştiricilerin sınıflandırma, regresyon, kümeleme, anomalilerin tespiti ve öneri sistemleri gibi çeşitli problemlere çözüm geliştirmesine olanak tanır. Ayrıca, ML.NET, TensorFlow ve ONNX gibi diğer popüler makine öğrenimi kütüphaneleriyle entegrasyon sağlar, bu sayede geliştiriciler mevcut modelleri .NET uygulamalarına kolayca entegre edebilirler.

ML.NET Mimarisi

1. Veri Yükleme

ML.NET ile ilk adım, çeşitli kaynaklardan veri yüklemektir. Bu veriler metin dosyaları, CSV dosyaları veya veritabanları şeklinde olabilir. Veri yükleme süreci, verilerin işlenmek üzere sistem içine alınmasını ve ilk hazırlığını kapsar.

2. Veri Dönüşümü

Yüklenen veriler, model eğitimi için uygun hale getirilmelidir. Bu aşamada, veriler normalleştirilir, temizlenir ve gerekli dönüşümler uygulanır. Örneğin, eksik alanlar sıfır veya boş değerlerle doldurulabilir veya gereksiz veri satırları kaldırılabilir. Bu süreç, veri kalitesini artırarak modelin daha doğru sonuçlar vermesini sağlar.

3. Model Oluşturma

Veriler hazırlandıktan sonra, belirli algoritmalar kullanılarak bir makine öğrenimi modeli oluşturulur. ML.NET, sınıflandırma, regresyon ve öneri sistemleri gibi çeşitli algoritmaları destekler. Bu aşamada, kullanılacak algoritma veriye ve çözülmesi gereken soruna göre seçilir.

4. Model Eğitimi

Model oluşturulduktan sonra, belirlenen algoritma kullanılarak model eğitilir. Bu süreçte, genellikle veri setinin bir kısmı test verisi olarak ayrılır. Model, kalan veriler üzerinde eğitilir ve test verisi ile modelin performansı değerlendirilir.

5. Model Değerlendirme

Model eğitimi tamamlandıktan sonra, modelin performansı çeşitli metriklerle değerlendirilir. Bu metrikler arasında doğruluk oranı, hata oranları ve diğer istatistiksel ölçümler bulunur. Performans değerlendirme, modelin gerçek dünya verileriyle ne kadar iyi çalışacağını tahmin etmek için önemlidir.

6. Model Dağıtımı ve Kullanımı

Eğitilen model, web uygulamaları, mobil uygulamalar, masaüstü uygulamaları ve hatta IoT ve bulut uygulamaları gibi çeşitli platformlarda kullanılmak üzere dağıtılabilir. Modelin uygulamalarda entegrasyonu, API’ler aracılığıyla gerçekleştirilir.

7. Performans ve Ölçeklendirme

Son olarak, modelin performansı sürekli olarak izlenir ve gerektiğinde ölçeklendirme yapılabilir. Bu, modelin daha fazla kullanıcıya veya daha büyük veri setlerine hizmet verebilmesi için gereklidir.

ML.NET, .NET geliştiricilerine güçlü, esnek ve kolayca entegre edilebilen bir makine öğrenimi çözümü sunarak, uygulamalarını zenginleştirmelerine olanak tanır. Her adım, verilerin daha iyi anlaşılmasını ve modelin daha etkili kullanılmasını sağlar, böylece daha akıllı ve otomatik sistemler oluşturulabilir.

ML.NET ile ilgili Merak Edilen Sorular

Neden ML.NET Kullanmalıyım ve Microsoft’un Diğer AI/ML Ürünlerinden Farkı Nedir?

  • ML.NET: .NET uygulamalarınıza entegre edebileceğiniz özel makine öğrenimi çözümleri geliştirmenizi sağlar.
  • Azure Cognitive Services: Görüş ve konuşma gibi doğal iletişim yöntemleri için çeşitli önceden oluşturulmuş AI ve ML modellerini uygulamalarınıza eklemenize olanak tanıyan bulut tabanlı hizmetlerdir.
  • Azure Machine Learning: Model eğitimi, versiyonlama, dağıtım ve sürüm yönetimini kapsayan kapsamlı bir bulut ortamı sunar.

ML.NET Modellerini Hangi Tür Uygulamalara Dağıtabilirsiniz?

ML.NET, web uygulamaları ve hizmetler, mikroservisler/konteynerler, masaüstü uygulamaları (WPF ve WinForms), Azure Functions ve diğer Azure sunucu uygulamaları ile konsol uygulamaları dahil olmak üzere hemen hemen tüm .NET uygulamalarıyla kullanılabilir.

ML.NET ile Hangi Çerçeveleri(Framework) Kullanabilirim?

ML.NET, .NET, .NET Core (sürüm 2.0 ve üstü) ve .NET Framework (sürüm 4.6.1 ve üstü) ile uyumludur.

ML.NET Hangi İşlemci Mimarilerini Destekler?

ML.NET, x64 ve x86 işlemci mimarilerini desteklemektedir.

ML.NET Hangi İşletim Sistemlerinde Kullanılabilir?

ML.NET, Windows, Linux ve macOS dahil olmak üzere çeşitli işletim sistemlerinde çalışabilen platformlar arası bir kütüphanedir.

ML.NET Ücretsiz Mi?

ML.NET tamamen ücretsizdir. .NET platformunun diğer bileşenleri gibi, ML.NET de %100 ücretsizdir ve MIT lisansı altında lisanslanmıştır.

ML.NET İçin En Uygun Programlama Dili Hangisidir?

ML.NET şu anda hem C# hem de F# dillerini desteklemektedir.

ML.Net Kurulumu nasıl gerçekleşir?

Model Builder’ı Yüklemek

  • Visual Studio 2022 kurulumunuzu bulun ve “Değiştir” seçeneğine tıklayın.
  • “.NET masaüstü geliştirme” iş yükünü seçin.
  • Sağ panelde ML.NET Model Builder bileşeninin seçili olduğundan emin olun.
  • “Değiştir” düğmesine tıklayın.

Model Builder’ın En Son Sürümünü Yükleme

Bu adımları takip ederek ML.Net kurulumunu gerçekleştirebilirsiniz.

ML.Net nerelerde kullanılabilir?

ML.Net, çeşitli alanlarda makine öğrenimi çözümleri oluşturmak için kullanılabilir. Örneğin, tahminleme ve öngörü modelleri oluşturmak için kullanılabilir, böylece satış tahminleri, stok yönetimi ve müşteri talebi gibi konularda yardımcı olur. Ayrıca, sınıflandırma modelleriyle e-posta spam tespiti, müşteri segmentasyonu ve görüntü tanıma gibi alanlarda kullanılabilir. Anomali tespiti ile dolandırıcılık önleme ve makine arızalarını önceden belirleme gibi uygulamalarda da etkili bir şekilde kullanılabilir. ML.Net, .NET geliştiricilerinin mevcut becerilerini kullanarak bu tür projeleri kolayca hayata geçirmelerini sağlar.

Gerçek dünyada kullanımını bir örnekte açıklayalım:

ML.NET ile Stok Yönetimi Senaryosu: ML.NET kullanarak, geçmiş satış verileri, mevsimsel trendler ve diğer etkenleri analiz eden bir model geliştirilir. Bu model, gelecekteki ürün talebini ve optimal stok seviyelerini tahmin eder, böylece hem fazla stoktan hem de stok yetersizliğinden kaynaklanan maliyetler minimize edilir.

Geleneksel Yöntemlerle Stok Yönetimi Senaryosu: İstatistiksel yöntemler veya Excel kullanılarak, basit geçmiş satış ortalamaları ve trend analizleri yapılır. Bu yöntem, stok tahminleri için hızlı ve kolay bir çözüm sunar ancak büyük veri setleri ve değişken talep paternleriyle başa çıkmada sınırlıdır.

Karşılaştırma Senaryosu: Bir şirket, ürün talebini ve stok seviyelerini daha doğru tahmin etmek için ML.NET’e geçiş yapmaya karar verir. Yeni sistem, veri analizi kapasitesi ve öğrenme yeteneği ile daha az stok fazlası ve daha iyi müşteri hizmeti sağlar. Geleneksel yöntemlere göre, başlangıç maliyeti ve eğitim gereksinimleri daha yüksek olsa da, uzun vadede maliyet tasarrufu ve operasyonel verimlilik sağlar.

ML.NET ile Makine Öğrenimine Başlamanın Yolları

Makine öğrenimi projeleri geliştirmek isteyen .NET geliştiricileri için ML.NET, güçlü ve esnek bir platform sunar. Başlamak için üç ana yol sunan ML.NET, geliştiricilere farklı deneyim seviyelerine uygun çözümler sağlar. İşte ML.NET ile çalışmaya başlamanın üç ana yöntemi bulunmaktadır. Gelin hepbirlikte bunların detaylarına bakalım.

1. Model Builder Aracı ile Başlama

Model Builder, Visual Studio içinde bir eklenti olarak geliştiricilere sunulmuş görsel bir araçtır. Makine öğrenimi konusunda deneyimi olmayan geliştiriciler için özellikle kullanışlı olan bu araç, kullanıcı dostu bir arayüz aracılığıyla model oluşturmanızı sağlar. Visual Studio’yu açarak ve projenize sağ tıklayıp “Makine Öğrenimi(Machine Learning)” seçeneğini seçerek başlayabilirsiniz. Seçeceğiniz senaryo (örneğin, duygu analizi veya fiyat tahmini) doğrultusunda verilerinizi yükleyip özelliklerinizi belirler ve Model Builder, otomatik makine öğrenimi algoritmaları kullanarak en uygun modeli seçer ve eğitir. Modeliniz hazır olduğunda, doğrudan uygulamanıza entegre edebilirsiniz.

Model Builder aracında bahsedilen süreç aslında AutoML (Otomatik Makine Öğrenimi) kapsamında gekleştirilmektedir. Model Builder, Visual Studio eklentisi olarak geliştirilmiş olup, kullanıcı dostu bir arayüz sunarak makine öğrenimi modellerinin otomatik olarak oluşturulmasını sağlar. Geliştiricilerin önceden belirledikleri senaryolara göre veri yükleyip özellikleri belirlemelerinden sonra, Model Builder bu verilere en uygun makine öğrenimi modelini otomatik olarak seçer ve eğitir. Bu süreç, çeşitli makine öğrenimi algoritmaları arasından en iyi performans göstereni seçme ve hiperparametre ayarlama işlemlerini otomatik olarak yönetir, böylece geliştiricilerin makine öğrenimi konusundaki teknik detaylarla derinlemesine ilgilenmelerine gerek kalmaz.

Ne zaman tercih edilmeli?
-
Makine öğrenimi konusunda yeniyseniz veya konsept kanıtlamak için hızlı bir şekilde model geliştirmek istiyorsanız.

- Sınırlı bir zaman çerçevesinde ve az miktarda kodla makine öğrenimi modelleri oluşturmak istediğinizde.

- Uygulamanız için basit ama etkili bir model yeterli olduğunda.

Model Builder, Visual Studio içinde kolayca erişilebilen bir eklenti olarak gelir ve özellikle görsel araçları tercih eden kullanıcılar için idealdir. Kodlama yapmadan makine öğrenimi modelleri oluşturmayı mümkün kılar.

UYGULAMA

Adım 1 (Projeyi Oluşturun)

Visual Studio 2022'yi açarak başlayın. Açılış ekranında “Create a new project” (Yeni bir proje oluştur) seçeneğini tıklayın.Karşınıza gelen şablon seçenekleri arasından C# Console App (C# Konsol Uygulaması) şablonunu seçin. Bu şablon, temel bir konsol uygulaması oluşturmanıza yardımcı olacaktır.

Projenize anlamlı bir ad verin. Bu rehberde proje adını örneğni myMLApp olarak belirleyeceğiz. Proje adını girdikten sonra, “Place solution and project in the same directory” (Çözümü ve projeyi aynı dizine yerleştir) seçeneğinin işaretli olmadığından emin olun. Bu, çözüm dosyası ile proje dosyasının ayrı dizinlerde oluşturulmasını sağlar.Açılan pencerede, projeniz için kullanmak istediğiniz çerçeveyi (framework) seçmeniz istenecek. Buradan .NET 8.0 (Long Term Support) seçeneğini seçin. Bu, uzun vadeli destek sunan en güncel çerçeve sürümüdür ve projenizin daha uzun süre güncel kalmasını sağlar.

Adım 2 ( Makine Öğrenmesini Projeye Entegre Etmek)

Visual Studio’da oluşturduğunuz myMLApp projesini Solution Explorer penceresinde bulun. Proje adına sağ tıklayın ve Add > Machine Learning Model (Ekle > Makine Öğrenimi Modeli) seçeneğini seçin.

Add New Item (Yeni Öğeyi Ekle) dialog penceresi açılacaktır. Bu pencerede, Machine Learning Model (ML.NET) seçeneğinin seçili olduğundan emin olun. Bu seçenek, ML.NET kullanarak makine öğrenimi modeli oluşturmanızı sağlar.

Bu işlem sonucunda, projenize SentimentModel.mbconfig adlı yeni bir dosya eklenir. Bu dosya, Model Builder kullanıcı arayüzü (UI) ile çalışmanızı sağlayan ve UI’nın durumunu takip eden bir JSON dosyasıdır. Model Builder UI, Visual Studio’da yeni bir docked araç penceresinde açılacaktır.

Adım 3 ( Senaryo Seç )

  • Model Builder’da, çeşitli makine öğrenimi senaryoları desteklenir.
  • Bu örnekte, müşteri yorumlarının içeriğine (metin) dayalı olarak duygu (sentiment) tahmini yapılacak.Bu senaryo, yorumların hangi kategoriye (pozitif veya negatif) düştüğünü tahmin etmek için kullanılır.
  • Eğitim ortamı olarak Local (Yerel) ortamı seçili tutun, çünkü sınıflandırma senaryosu şu anda yalnızca yerel eğitim desteği sunmaktadır.

Senaryo ve eğitim ortamı seçimlerinden sonra, veri adımına geçin.

Adım 4 ( Veriyi İndirme)

myMLApp
├── Properties
├── References
├── yelp_labelled.txt
└── Program.cs
  • yelp_labelled.txt dosyasındaki her satır, Yelp’te bir kullanıcı tarafından bırakılan farklı bir restoran incelemesini temsil eder.
  • İlk sütun: Kullanıcının bıraktığı yorum.
  • İkinci sütun: Metnin duygu durumu (0 negatif, 1 pozitif).
  • Sütunlar sekme ile ayrılmıştır ve veri setinin başlığı yoktur.
The food was great!   1
Service was slow. 0

Adım 5 ( Veri kaynağını seçme )

  • Model Builder’da veri eklerken, yerel dosyadan veya bir SQL Server veritabanına bağlanarak veri ekleyebilirsiniz.
  • Bu örnekte, yelp_labelled.txt dosyasını bir dosyadan ekleyeceğiz.
  • Input data source type (Giriş veri kaynağı türü) olarak File (Dosya) seçeneğini seçin.
  • yelp_labelled.txt dosyasına göz atın ve seçin.
  • Verinizi seçtikten sonra, Data Preview (Veri Önizleme) bölümünde verinizin bir önizlemesi görünür. Veri setinizin başlığı olmadığı için başlıklar otomatik olarak oluşturulur (“col0” ve “col1”).
  • Column to predict (Label) (Tahmin edilecek kolon) altında “col1” seçin. Label, tahmin edeceğiniz değerdir, bu örnekte veri setinin ikinci sütunundaki (col1) duygu durumudur.
  • Label dışındaki tüm sütunlar otomatik olarak Features (Özellikler) olarak seçilir. Bu örnekte, inceleme yorum sütunu (“col0”) özellik sütunudur.
  • Gelişmiş veri seçeneklerinde (Advanced data options) özellik sütunlarını güncelleyebilir ve diğer veri yükleme seçeneklerini değiştirebilirsiniz, ancak bu örnek için gerekli değildir.

Verilerinizi ekledikten sonra, Train (Eğitim) adımına geçebilrsiniz.

Adım 6 ( Eğitim )

  • Model Builder, verilen eğitim süresine bağlı olarak çeşitli algoritmalar ve ayarlarla birçok modeli değerlendirir ve en iyi performansı gösteren modeli oluşturur.
  • Time to train (Eğitim süresi) seçeneğini 60 saniye olarak ayarlayın. Eğitim süresini artırarak daha fazla modelin değerlendirilmesini sağlayabilirsiniz. Büyük veri setleri için eğitim süresi daha uzun olacaktır. Model Builder, veri setinin boyutuna göre eğitim süresini otomatik olarak ayarlar.
  • Advanced training options (Gelişmiş eğitim seçenekleri) bölümünde optimizasyon metriğini ve kullanılan algoritmaları güncelleyebilirsiniz, ancak bu örnek için gerekli değildir.
  • Start training (Eğitimi başlat) butonuna tıklayarak eğitim sürecini başlatın. Eğitim başladıktan sonra kalan süreyi görebilirsiniz.

Adım 7 ( Eğitim Sonuçları )

Bu özet, eğitim süreci tamamlandıktan sonra Model Builder’ın sağladığı temel eğitim sonuçlarını ve bilgileri içermektedir.

  • Best MacroAccuracy: Model Builder’ın bulduğu en iyi modelin doğruluğunu gösterir. Yüksek doğruluk, modelin test verilerinde daha doğru tahminler yaptığını gösterir.
  • Best model: Model Builder’ın keşfi sırasında en iyi performansı gösteren algoritmayı gösterir.
  • Training time: Modellerin eğitimi ve keşfi için harcanan toplam süreyi gösterir.
  • Models explored (total) : Belirtilen süre içinde Model Builder tarafından keşfedilen toplam model sayısını gösterir.
  • Generated code-behind: Modeli kullanmanıza veya yeni bir model eğitmenize yardımcı olmak için oluşturulan dosyaların adlarını gösterir.

Model eğitimi tamamlandıktan sonra Değerlendir adımına geçebilirsiniz.

Adım 8 ( Modeli Değerlendir )

  • Try your model bölümünde örnek girişlerle tahminler yapabilirsiniz.
  • Metin kutusu, veri setinizden alınan ilk satırla önceden doldurulmuştur, ancak girişi değiştirip Predict (Tahmin et) butonuna basarak farklı duygu tahminleri deneyebilirsiniz.

Adım 9 ( Kod Oluşturma )

  • Model Builder ile model eğitimi tamamlandığında, SentimentModel.mbconfig dosyasının yanında dört adet dosya otomatik olarak eklenir. Bu dosyalar, modelin kullanımını ve değerlendirilmesini kolaylaştırır. Modelin girdi ve çıktı sınıflarını içerir. Modeli tüketmek (kullanmak) için kullanılabilecek Predict metodunu barındırır. Bu dosya, modelin gerçek dünyada kullanılmasını sağlar. Modelin tahminler yapmasını sağlayan metodlar ve veri yapılarını içerir.
  • SentimentModel.consumption.cs dosyası, ML.NET projelerinde, eğitilmiş bir modelin nasıl kullanılacağını gösteren kodları içerir. Bu dosya, modeli yüklemek, girdi üzerinde tahminler yapmak ve çıktıları işlemek için kullanılır.
  • SentimentModel.evaluate.cs Modelin girdi ve çıktı sınıflarını içerir. Modeli değerlendirmek için kullanılabilecek Predict metodunu barındırır. Bu dosya, modelin performansını ve doğruluğunu değerlendirmek için kullanılır. Tahminler yaparak modelin ne kadar iyi çalıştığını test edebilirsiniz.
  • SentimentModel.mlnet Eğitilmiş ML.NET modelini içerir.Bu, serileştirilmiş bir zip dosyasıdır. Bu dosya, modelin eğitim sürecinde oluşturulan ve saklanan gerçek makine öğrenimi modelidir. Modeli tekrar yükleyerek kullanabilirsiniz.
  • SentimentModel.training.cs dosyası, ML.NET kullanan bir projede, duygu analizi modelinin nasıl eğitileceği ile ilgili kodları içerir. Bu dosya, veri setini yüklemek, veriyi işlemek, özellikleri ayarlamak, modeli eğitmek ve son olarak eğitilmiş modeli kaydetmek için gerekli işlemleri gerçekleştirir.

Adım 10 (Modeli Kullanma )

  • Consume (Tüket) adımında, Model Builder size model için örnek bir girdi oluşturup bu girdi üzerinde tahmin yapacak bir kod parçacığı sağlar.Bu kod parçacığı, eğitilmiş modeli nasıl kullanacağınızı ve bu modelle nasıl tahmin yapacağınızı gösterir. Örneğin, bir metin yorumunun duygu analizini yapmak için gerekli adımları içerir.
  • İsteğe bağlı olarak, konsol uygulaması veya web API şablonlarını çözümünüze ekleyebilirsiniz. Bu şablonlar, model tüketimi için hazır kod içerir ve hızlı bir şekilde çalışmaya başlamanızı sağlar.
  • Eğitilmiş modelinizi son kullanıcı uygulamanızda kullanmak için, Program.cs dosyasını aşağıdaki kod ile değiştirin.
  • sampleData değişkeni, modelin tahmin yapması için kullanılacak örnek girdi verisini içerir. Bu örnekte, "This restaurant was wonderful." ifadesi kullanılmıştır.
  • SentimentModel.Predict(sampleData) metodu, eğitilmiş modeli yükler ve verilen girdi verisi için tahmin yapar.
  • result.PredictedLabel == 1 ? "Positive" : "Negative" ifadesi, tahmin sonucunu yorumlar. Eğer tahmin 1 ise, duygu "Positive" olarak değerlendirilir; aksi halde "Negative" olarak değerlendirilir.
  • Console.WriteLine metodu, girdi metnini ve tahmin edilen duyguyu konsola yazdırır.
  • myMLApp projenizde, uygulamayı çalıştırmak için Ctrl+F5 tuşlarına basın veya Debug > Start Without Debugging (Hata Ayıklama > Hata Ayıklamadan Başlat) seçeneğini seçin.Aşağıdaki çıktıyı görmelisiniz, bu girdi ifadesinin pozitif mi negatif mi olduğunu tahmin eder
Text: This restaurant was wonderful.
Sentiment: Positive

2. ML.NET API’si Kullanarak Başlama

ML.NET API’si, geliştiricilere .NET kodu üzerinden doğrudan makine öğrenme modelleri oluşturma ve özelleştirme imkanı tanır. Bu yöntemle başlamak için ilk olarak bir ML bağlamı oluşturmanız gerekir. Bu bağlam, makine öğrenme işlemleri için gerekli olan temel altyapıyı ve işlevleri sağlar. İlk adım olarak, modeliniz için giriş verilerini yüklemeniz ve uygun özellikleri çıkarmanız gerekir. Örneğin, duygu analizi modeli kuruyorsanız, analiz edilecek metinleri özellik olarak belirleyebilirsiniz.

Sonrasında, uygun bir eğitim algoritması seçerek modelinizi eğitirsiniz. ML.NET, çok çeşitli eğitim algoritmaları sunar ve bu sayede veri setinize en uygun olanı seçebilirsiniz. Model eğitimi tamamlandıktan sonra, performansını değerlendirir ve uygulamanıza entegre edersiniz. Bu süreç, makine öğrenimi konusunda bir miktar deneyime sahip olan geliştiriciler için idealdir.

Ne zaman tercih edilmeli?

Makine öğrenimi konusunda deneyimliyseniz ve modelinizi daha fazla özelleştirmek istiyorsanız.

Özel bir iş problemi üzerinde çalışıyor ve mevcut modellerin ötesinde bir çözüm arıyorsanız.

Performans ve ölçeklenebilirlik konusunda daha fazla kontrol sahibi olmak istiyorsanız.

ML.NET API’si, detaylı ve özelleştirilmiş makine öğrenme işlemleri yapmanıza olanak tanır. Veri işleme ve modelleme süreçlerinde tam kontrol isteyen geliştiriciler için uygundur.

UYGULAMA

Adım 1( ML.Net Context Oluşturma)

MLContext, ML.NET operasyonlarının başlangıç noktasıdır ve ML.NET modelinin oluşturulması ve kullanılmasıyla ilgili tüm yönlerde kullanılır. Entity Framework’teki DbContext kavramına benzer.

Örneğin, var mlContext = new MLContext(); ile bir MLContext örneği oluşturduktan sonra, verileri yükleyebilir ve dönüştürebilir, makine öğrenimi göreviniz için en iyi algoritmayı seçebilir, modelinizi eğitebilirsiniz. Eğitim tamamlandıktan sonra, modelinizin doğruluğunu test edebilir, diske kaydedebilir ve tahminler yapmak için kullanabilirsiniz. Ayrıca, daha önce diske kaydedilmiş bir modelden de bir MLContext başlatılabilir.

Adım 2 ( Verinin Yüklenmesi)

Makine öğrenimi, bilinen verileri (örneğin, eğitim verileri) kullanarak desenleri bulur ve bu desenler aracılığıyla yeni, bilinmeyen veriler üzerinde tahminler yapar. Makine öğreniminde girdilere Özellikler (Features) denir; bu özellikler tahminler yapmak için kullanılan niteliklerdir. Makine öğreniminin çıktısı ise Etiket (Label) olarak adlandırılır ve bu, yapılan gerçek tahmindir.

ML.NET’te veriler, satırlar ve sütunlar gibi tabular verileri esnek ve verimli bir şekilde tanımlayan IDataView olarak temsil edilir. IDataView nesneleri sayılar, metinler, booleanlar, vektörler ve daha fazlasını içerebilir. Veriler, dosyalardan veya gerçek zamanlı akış kaynaklarından bir IDataView’a yüklenebilir. LoadFromTextFile, TXT, CSV, TSV ve diğer dosya formatlarından veri yüklemeye olanak tanır. Örneğin:

IDataView trainingData = mlContext.Data
.LoadFromTextFile<SentimentInput>(dataPath, separatorChar: ',', hasHeader: true);

LoadFromEnumerable, bellekteki koleksiyonlardan, JSON/XML, ilişkisel ve ilişkisel olmayan veritabanlarından (örneğin,CosmosDB, MongoDB) ve diğer birçok veri kaynağından veri yüklemeyi mümkün kılar. Örneğin:

IDataView trainingData = mlContext.Data
.LoadFromEnumerable<SentimentInput>(inMemoryCollection);

Adım 3 (Verilerin Dönüştürülmesi)

Çoğu durumda, elinizdeki veriler doğrudan bir makine öğrenimi modelini eğitmek için uygun değildir. Ham veriler, veri dönüşümleri kullanılarak ön işleme tabi tutulmalıdır. Transformer’lar, verileri alır, üzerinde işlem yapar ve yeni, dönüştürülmüş veriler üretir. FeaturizeText yöntemi, bir metin parçasını alarak makine öğrenimi için kullanılabilecek bir dizi sayıya dönüştürür. Eksik değerlerin değiştirilmesi, veri dönüşümü, metin özelliklerinin çıkarılması ve daha fazlası için yerleşik veri dönüşüm setleri vardır. Örneğin:

// Duygu metnini sayısal özelliklere dönüştürme
IEstimator<ITransformer> dataTransformPipeline = mlContext.Transforms.Text
.FeaturizeText("Features", "SentimentText");

Bu işlem, metin tabanlı verilerin makine öğrenimi algoritmaları tarafından işlenebilmesi için sayısal özelliklere dönüştürülmesini sağlar. Verilerin uygun şekilde dönüştürülmesi, modelin doğruluğunu ve performansını artırmada önemli bir adımdır.

Adım 4 ( Algoritma Seçimi )

Makine öğrenimi ve ML.NET kullanırken, senaryonuza uygun bir makine öğrenimi görevini seçmeniz gerekmektedir. ML.NET, çeşitli makine öğrenimi görevleri için 30'dan fazla algoritma (veya eğitici) sunar.

Örneğin, ikili sınıflandırma görevi için AveragedPerceptron algoritmasını kullanabilirsiniz:

IEstimator<ITransformer> trainer = mlContext.BinaryClassification.Trainers
.AveragedPerceptron(labelColumnName: "Sentiment", featureColumnName: "Features"));
  • IEstimator<ITransformer> trainer: Bu, bir eğitici (trainer) oluşturmak için kullanılan bir değişkendir. Eğiticiler, belirli bir makine öğrenimi algoritmasını kullanarak modeli eğitir.
  • mlContext.BinaryClassification.Trainers: Bu kısım, ML.NET içinde ikili sınıflandırma (binary classification) algoritmaları arasından seçim yapmanıza olanak tanır. İkili sınıflandırma, iki sınıf arasında ayrım yapmak için kullanılır (örneğin, olumlu veya olumsuz duygu analizi).
  • AveragedPerceptron(labelColumnName: “Sentiment”, featureColumnName: “Features”): Bu yöntem, Averaged Perceptron algoritmasını kullanarak bir ikili sınıflandırma modeli oluşturur.
  • labelColumnName: “Sentiment”: Modelin tahmin edeceği hedef değişkeni belirtir (bu örnekte, duygu analizi için “Sentiment”).
  • featureColumnName: “Features”: Modelin tahmin yapmak için kullanacağı özellikleri belirtir (bu örnekte, özellikler “Features” olarak adlandırılır).

Sonuç olarak, bu kod parçası, duygu analizi gibi bir ikili sınıflandırma görevi için Averaged Perceptron algoritmasını kullanarak bir model oluşturur ve eğitir. Model, “Sentiment” etiket sütununu tahmin etmek için “Features” özellik sütununu kullanır.

IEstimator<ITransformer> trainingPipeline = dataTransformPipeline.Append(trainer);

Bu adımlar, verilerinizi uygun şekilde dönüştürdükten sonra seçtiğiniz algoritma ile modeli eğitmenizi sağlar. Modeli eğittikten sonra, doğruluğunu test edebilir, iyileştirebilir ve tahminler yapmak için kullanabilirsiniz. Makine öğrenimi görevinize uygun algoritmayı seçmek, model performansını optimize etmede kritik bir rol oynar.

Adım 5 (Eğitim)

ML.NET’in (lazy loading) yaklaşımı nedeniyle, belirttiğiniz veri dönüşümleri ve algoritmalar, Fit() yöntemi çağrılana kadar çalıştırılmaz. Model eğitimi de bu noktada gerçekleşir.

Bir estimator (tahmin edici), verileri alır, verilerden öğrenir ve bir transformer (dönüştürücü) oluşturur. Model eğitimi durumunda, eğitim verileri girdi olarak alınır ve eğitimli model çıktı olarak üretilir. Eğitimli model, yeni verilerin girdi özelliklerini (Features) çıktı tahminlerine dönüştüren bir dönüştürücü (transformer) olarak işlev görür.

ITransformer model = pipeline.Fit(trainingData);

Bu kod, eğitim verilerini kullanarak belirtilen veri dönüşümleri ve algoritmalarla bir model eğitir. pipeline.Fit(trainingData) yöntemi çağrıldığında, model eğitilir ve eğitimli model (ITransformer), yeni veriler üzerinde tahminler yapmak için kullanılabilir hale gelir. Bu, ML.NET'te model eğitiminin ve kullanılabilir hale getirilmesinin temel adımlarından biridir.

Adım 6 (Model Değerlendirme)

ML.NET, modelinizin performansını çeşitli metrikler üzerinden değerlendiren değerlendiriciler sunar.

  • Doğruluk (Accuracy): Modelin doğru tahmin ettiği örneklerin oranını gösterir.
  • Eğri Altındaki Alan (AUC): Modelin sınıflandırma başarısını ölçer.
  • R-Kare (R-Squared): Modelin verileri ne kadar iyi açıkladığını gösterir.
  • Kök Ortalama Kare Hatası (RMSE): Tahminlerin ne kadar hatalı olduğunu gösterir.
// Test verileri üzerinde tahminler yapma
IDataView predictions = model.Transform(testDataView);

// Modeli değerlendir ve metrikleri döndür
var metrics = mlContext.BinaryClassification
.Evaluate(predictions, labelColumnName: "Sentiment");

// Doğruluk metriğini yazdır
Console.WriteLine("Accuracy: " + metrics.Accuracy);

Bu kod, testDataView verilerini kullanarak modelin tahminlerini yapar ve ardından Evaluate yöntemi ile bu tahminlerin performansını değerlendirir. Son olarak, modelin doğruluk metriğini konsola yazdırır. Bu değerlendirme süreci, modelin ne kadar iyi performans gösterdiğini anlamak için kritik öneme sahiptir.

Adım 7 ( Modeli kaydetme ve kaydedilen veriyi kullanma)

Modeli Kaydetmek: Eğitilmiş modeli bir ikili dosya olarak kaydedebilirsiniz, bu sayede modelinizi .NET uygulamalarınıza entegre edebilirsiniz.

mlContext.Model.Save(Bu satır, eğitilmiş modeli model.zip adıyla bir dosyaya kaydeder. model eğitilmiş model, trainingData ise modelin eğitim verileridir.model, trainingData, "model.zip");

Bu satır, eğitilmiş modeli model.zip adıyla bir dosyaya kaydeder. model eğitilmiş model, trainingData ise modelin eğitim verileridir. Kaydedilmiş modeli diğer .NET uygulamalarınıza yükleyebilirsiniz.

MLContext mlContext = new MLContext();
DataViewSchema predictionPipelineSchema;
ITransformer trainedModel = mlContext.Model.Load("model.zip", out predictionPipelineSchema);

Bu kod parçacığı, model.zip dosyasından modeli yükler. predictionPipelineSchema, yüklenen modelin şemasını içeren bir değişkendir.

3. ML.NET CLI ile Başlama

ML.NET CLI, özellikle Mac veya Linux kullanıcıları için tasarlanmış bir komut satırı aracıdır ve .NET projelerinde makine öğrenme modelleri oluşturmanıza olanak tanır. Bu aracı kullanmak için, terminalinizi açın ve gerekli komutları çalıştırarak projenizi oluşturun ve modelinizi eğitin. CLI, otomatik makine öğrenimi teknikleri kullanarak verileriniz için en uygun modeli seçer ve eğitir. Modeliniz tamamlandığında, bunu uygulamanıza entegre edersiniz.

Ne Zaman Tercih Edilmeli?

Cross-platform geliştirme yapıyorsanız ve Windows dışında bir işletim sistemi kullanıyorsanız (örneğin, macOS veya Linux).

Otomatik makine öğrenimi özelliklerini kullanarak hızlı bir şekilde prototip oluşturmak istiyorsanız.

Komut satırı araçlarıyla rahat çalışıyor ve gelişmiş otomasyon süreçleri kurmak istiyorsanız.

ML.NET CLI, özellikle terminal veya komut satırı üzerinden çalışmayı tercih eden ve birden fazla platformda çalışabilme esnekliğine ihtiyaç duyan geliştiriciler için uygun bir seçenektir.

UYGULAMA

Adım 1 (ML.Net CLI Kurulumu)

Öncelikle ML.NET CLI aracını kurmanız gerekiyor. Terminalinizi açın ve aşağıdaki komutu çalıştırarak ML.NET CLI’yı kurun:

dotnet tool install -g mlnet

Adım 2: Yeni Bir ML.NET Projesi Oluşturma

Bir proje dizini oluşturun ve bu dizine gidin:

mkdir myMLApp
cd myMLApp

Adım 3: Verileri Kullanarak Model Eğitimi

Elinizdeki verileri kullanarak modelinizi eğitin. Örneğin, elimizde “veri.csv” adlı bir dosya olduğunu varsayalım:

mlnet auto-train --task binary-classification --dataset "veri.csv" --label-column-name "Etiket" --max-exploration-time 600

Bu komut, “veri.csv” dosyasını kullanarak ikili sınıflandırma görevi için otomatik olarak en iyi modeli seçer ve eğitir. --max-exploration-time parametresi ile eğitim için ayrılan maksimum süreyi belirleyebilirsiniz (saniye cinsinden).

ML.NET’in Performansı

Zorlu Rakip Python’un Popülerliği:

  • Kullanım Kolaylığı: Python, öğrenmesi kolay ve okunması kolay bir sözdizimine sahiptir, bu da onu veri bilimcileri ve programcılar arasında popüler yapar. Jupyter gibi not defteri uygulamaları, kodu bölümler halinde çalıştırma ve sonuçları anında gözlemleme imkanı sunar. Bu, özellikle veri analizi ve modelleme sırasında çok faydalıdır.
  • Geniş Kütüphane Ekosistemi: Python, veri işleme (pandas), matematiksel işlemler (numpy) ve görselleştirme (matplotlib) gibi çeşitli alanlarda güçlü kütüphanelere sahiptir. Bu kütüphaneler, veri bilimcilerin ihtiyaç duyduğu araçları sağlar.
  • Makine Öğrenimi Kaskadları: Scikit-learn gibi kütüphaneler, makine öğrenimi modellerini eğitmek ve bu modelleri birleştirmek için kullanılabilir. Bu tür iş akışları, karmaşık veri setleri üzerinde çeşitli işlemler yapılmasını sağlar.

Peki zorluğu yok mu?

  • Python kodu, çalışma zamanında yorumlanır, bu da derlenmiş dillere kıyasla genellikle daha yavaş çalışmasına neden olabilir.
  • Python, değişkenlerin veri türünü çalışma zamanında belirler, bu esneklik sağlasa da bazen hata yapma olasılığını artırır ve performansı azaltabilir.
  • Python programlama dilinin kullanımı, özellikle veri bilimi ve makine öğrenimi alanlarında geniş çapta tercih edilirken, bazı teknik zorlukları da beraberinde getirir. Bu zorlukların başında Python kodunun çalışma zamanında yorumlanması gelir; bu özellik, Python’u derlenmiş dillere göre genellikle daha yavaş yapar. Ayrıca, Python dinamik tip belirleme özelliğine sahiptir, yani değişkenlerin veri türleri çalışma zamanında belirlenir. Bu durum programlama esnekliği sağlasa da, hata yapma riskini artırabilir ve performansı düşürebilir. En önemli zorluklardan biri de Küresel Yorumlayıcı Kilitleri (GIL)’dir. GIL, Python’un çoklu iş parçacığıyla çalışma yeteneğini sınırlar, bu da özellikle çok çekirdekli işlemcilerde paralel işlemlerin etkinliğini azaltır. Bu zorluklar, Python’un belli başlı uygulama senaryolarında alternatif çözümler veya dillere yönelinmesine neden olabilir.

ML.NET, ilişkisel veritabanı yönetim sistemlerinden alınan fikirlerle tasarlanmış bir iç yapıya sahip ve bu yapı “DataView” adında bir ana soyutlama ile somutlaşmıştır. DataView, şemalandırılmış verilerin bileşimsel işlenmesini sağlar ve ana bellekten daha büyük veri kümelerinde yüksek boyutlu verileri zarif ve etkili bir şekilde işleyebilir.

Karşılaştırma Sonuçları

Veri setinin metin sütununa özellik çıkarımı yapılıp ardından bir doğrusal sınıflandırıcı uygulandığı bir pipeline üzerinden çalışma gerçekleştirilmiştir. Özellik çıkarımı için ML.NET’te “FeaturizeText” dönüşümü ve Scikit-learn’de “TfidfVectorizer” kullanılmış. Bu araçlar, metin içindeki sözcüklerden n-gram sayımlarının bir matrisini üreterek sayısal özellikler çıkartır.

Ayrıca, H2O ise metin özellik çıkarımı için yalnızca “Skip-Gram word2vec” modelini kullanmaktadır. Metin özellik çıkarımı hem n-gram tabanlı klasik yöntemlerde hem de sinir ağları yaklaşımında zaman ve kaynak yoğun bir işlemdir. Öyle ki, Sklearn ve H2O, veri setinin tamamı ile eğitim yapıldığında büyük kelime hacmi nedeniyle taşma/hafıza hataları vermektedir. Bu yüzden Sklearn ve H2O’nun tam veri setiyle eğitim sonuçları raporlanmamıştır.

ML.NET, tüm deneyleri tamamlama kapasitesine sahipken, “NimbusML-DF” tam veri seti üzerinde işlemleri tamamlayabilmiş, ancak Scikit-learn tamamlayamamıştır. Bunun nedeni, NimbusML-DF’nin altında yatan “DataView” yapısının pipeline kısmını çalıştırması, Scikit-learn’ün ise sonuçları veri çerçevelerinde somutlaştırmasıdır. Ölçülen doğruluk açısından, Sklearn veri setinin yalnızca %0.1'lik bir kısmıyla en yüksek AUC’yi göstermiş, fakat diğer veri noktalarında ML.NET daha iyi performans sergilemiştir.

ML.NET, Amazon müşteri değerlendirmelerinden oluşan 9GB’lık devasa bir veri seti üzerinde duygu analizi yapmak üzere bir model eğitmiştir. Bu model, incelemelerin olumlu ya da olumsuz olduğunu %95 oranında doğrulukla belirleyebilmektedir. Bu başarı, ML.NET’in veri işleme ve model eğitme kapasitesinin güçlü bir göstergesidir.

ML.NET’in dışında diğer popüler makine öğrenimi çerçeveleri, özellikle TensorFlow ve PyTorch gibi, bu büyüklükteki veri setlerini işlerken bellek hatalarıyla karşılaşmış ve eğitim süreçlerini tamamlayamamıştır. Bu hatalar, büyük veri setlerinin işlenmesi sırasında karşılaşılan yaygın sorunlardan biridir ve ML.NET bu konuda öne çıkmaktadır.

ML.NET, veri setinin yalnızca %10'u ile yapılan eğitimde bile en hızlı ve en doğru sonuçları sunmuştur. Bu test, tüm çerçevelerin eğitim sürecini tamamlayabilmesi için tasarlanmıştır ve ML.NET’in hızlı ve etkin bir şekilde büyük veri setleri üzerinde çalışabilme yeteneğini kanıtlamaktadır. Daha yüksek doğruluk v33,e daha düşük çalışma süresi ile dikkat çekmiştir.

ML.NET’in üstünlüğü, yalnızca duygu analiziyle sınırlı kalmamıştır. Tıklama oranı tahmini ve uçuş gecikme tahmini gibi diğer makine öğrenimi senaryolarında yapılan performans değerlendirmeleri de benzer sonuçlar göstermiştir. Bu senaryolar, farklı veri tipleri ve endüstri gereksinimleriyle uğraşırken ML.NET’in esnekliğini ve genel uygulanabilirliğini ortaya koymaktadır.

Demo (API kullanarak Duygu Analizi)

Akış

Demo Ekranı

Adım 1 : Gereksinimlerin Yüklenmesi

        private readonly string _yelpDataPath = Path.Combine(Directory.GetCurrentDirectory(), "Data", "yelp_labelled.txt");
private readonly MLContext _mlContext = new MLContext();
private ITransformer _model;
private readonly IHttpClientFactory _clientFactory;


public HomeController(ILogger<HomeController> logger, IHttpClientFactory clientFactory)
{
_logger = logger;
_clientFactory = clientFactory;
}

private readonly string _yelpDataPath = Path.Combine(Directory.GetCurrentDirectory(), "Data", "yelp_labelled.txt");

  • Bu alan, veri dosyasının yolunu tutar. Path.Combine metodu, geçerli çalışma dizinini alır ve buna Data klasörü altındaki yelp_labelled.txt dosyasının yolunu ekler.
  • _yelpDataPath alanı, dosya yolunu belirtmek ve dosya işlemleri yapmak için kullanılır.

private readonly MLContext _mlContext = new MLContext();

  • Bu alan, ML.NET işlemlerini yönetmek için bir MLContext örneğini başlatır. MLContext, makine öğrenmesi işlemlerinin yönetimi ve konfigürasyonu için kullanılan bir sınıftır.
  • _mlContext alanı, makine öğrenmesi modellerini oluşturmak, eğitmek ve değerlendirmek için kullanılır.

private ITransformer _model;

  • Bu alan, eğitilmiş makine öğrenmesi modelini tutar. ITransformer arabirimi, veriyi dönüştürmek için kullanılan bir modelin temsilcisidir.
  • _model alanı, model eğitildikten sonra veriyi tahmin etmek veya dönüştürmek için kullanılır.

private readonly IHttpClientFactory _clientFactory;

  • Bu alan, HTTP istemcileri (clients) oluşturmak için kullanılan bir fabrika nesnesidir. IHttpClientFactory arabirimi, HttpClient nesnelerinin yönetimini kolaylaştırır.
  • _clientFactory alanı, HTTP istekleri yapmak için HttpClient nesneleri oluşturmak ve yönetmek için kullanılır.
public HomeController(ILogger<HomeController> logger, IHttpClientFactory clientFactory)
{
_logger = logger;
_clientFactory = clientFactory;
}
  • Bu, HomeController sınıfının yapıcı metodudur. Bu metod, sınıfın yeni bir örneği oluşturulduğunda çağrılır ve gerekli bağımlılıkların enjeksiyonunu sağlar.
  • IHttpClientFactory clientFactory: Bu parametre, HTTP istemcileri oluşturmak için kullanılır.
  • İşlem: Bu metod, sağlanan clientFactory bağımlılığını sınıfın özel alanına (_clientFactory) atar.

Bu kod parçası, HomeController sınıfının bir parçasıdır ve loglama, HTTP istemcisi oluşturma, makine öğrenmesi işlemleri ve veri yolu tanımlama gibi görevleri yönetir. Yapıcı metot, bu sınıfa ait örnek oluşturulduğunda gerekli bağımlılıkları sağlar. Bu şekilde sınıf, loglama yapabilir, HTTP istekleri yapabilir ve makine öğrenmesi işlemlerini gerçekleştirebilir.

Adım 2 ( Eğit Butonuna Basılması ve Arka Planda Gerçekleşenler )

        public IActionResult TrainModel()
{
try
{
// Veri kümesini yükle
TrainTestData splitDataView = LoadData(_mlContext);

// Modeli eğit
_model = BuildAndTrainModel(_mlContext, splitDataView.TrainSet);

// Modeli değerlendir
Evaluate(_mlContext, _model, splitDataView.TestSet);

// Eğitim sonuçlarını ekrana yazdır
ViewBag.TrainResult = "Model başarıyla Eğitildi!";
ViewBag.Accuracy = ViewBag.Accuracy ?? 0.0; // Eğer accuracy değeri null ise, 0.0 olarak ata
ViewBag.Auc = ViewBag.Auc ?? 0.0; // Eğer auc değeri null ise, 0.0 olarak ata
ViewBag.F1Score = ViewBag.F1Score ?? 0.0; // Eğer f1Score değeri null ise, 0.0 olarak ata
ViewBag.Train = true;
}
catch (Exception ex)
{
ViewBag.TrainResult = "Eğitim sırasında bir hata oluştu: " + ex.Message;
}

// Index view'ını çağır
return View("TrainModelView");
}
  • TrainModel metodu bir IActionResult döner ve bir try-catch bloğu içinde çalıştırılır. Bu, metodun çalışması sırasında meydana gelebilecek hataları yakalamak ve uygun hata mesajlarını göstermek için kullanılır.
  • LoadData metodu çağrılarak veri kümesi yüklenir ve eğitim (train) ve test veri setleri olarak ikiye ayrılır. TrainTestData türündeki splitDataView değişkeni, bu iki veri setini içerir.
  • BuildAndTrainModel metodu çağrılarak model oluşturulur ve eğitim veri seti (splitDataView.TrainSet) kullanılarak model eğitilir. Eğitilmiş model _model değişkenine atanır.
  • Evaluate metodu çağrılarak model, test veri seti (splitDataView.TestSet) kullanılarak değerlendirilir. Bu aşamada modelin doğruluğu ve diğer metrikler hesaplanır.
  • Eğitim sonuçları ViewBag aracılığıyla ekrana yansıtılır. ViewBag.TrainResult: Eğitim sonucunun başarılı olup olmadığını belirtir. ViewBag.Accuracy, ViewBag.Auc, ViewBag.F1Score: Modelin performans metriklerini ekrana yansıtır. Eğer bu metrikler null ise, 0.0 olarak atanır. ViewBag.Train: Eğitim işleminin tamamlandığını belirtir.
  • Eğitim işlemi sırasında bir hata oluşursa, catch bloğuna düşülür ve ViewBag.TrainResult değişkenine hata mesajı atanır. Bu mesaj daha sonra ekrana yansıtılır.
  • Son olarak, “TrainModelView” adında bir view (görünüm) çağrılır ve bu görünüm ekrana render edilir. Bu view, eğitim sonuçlarını ve performans metriklerini görüntüler.

Peki LoadData Metotu Ne Yapıyor?

        private TrainTestData LoadData(MLContext mLContext)
{
IDataView dataView = _mlContext.Data.LoadFromTextFile<SentimentData>(_yelpDataPath, hasHeader: false);
TrainTestData splitDataView = _mlContext.Data.TrainTestSplit(dataView, testFraction: 0.2);
return splitDataView;
}

LoadData metodu, veri kümesini belirtilen dosya yolundan yükler, veriyi eğitim ve test veri setleri olarak ikiye böler ve bu veri setlerini geri döner. Bu adımlar, makine öğrenmesi modelini eğitmek ve değerlendirmek için gereklidir.

IDataView dataView = _mlContext.Data.LoadFromTextFile<SentimentData>(_yelpDataPath, hasHeader: false);

Bu satır, veri kümesini belirtilen dosya yolundan (_yelpDataPath) yükler. LoadFromTextFile metodu, belirtilen dosya yolundaki veriyi SentimentData türündeki bir sınıfa haritalar.

  • SentimentData: Veriyi temsil eden bir sınıftır ve verinin her bir satırını nasıl modelleyeceğini belirtir.
  • _yelpDataPath: Veri dosyasının yolunu belirtir. Bu yol, daha önce Path.Combine ile oluşturulmuştu.
  • hasHeader: false: Veri dosyasının başlık satırına sahip olmadığını belirtir.

dataView değişkeni, veri kümesinin tamamını içerir ve IDataView türünde bir veri yapısıdır.

TrainTestData splitDataView = _mlContext.Data.TrainTestSplit(dataView, testFraction: 0.2);
  • Bu satır, veri kümesini eğitim (train) ve test veri setleri olarak ikiye böler.
  • TrainTestSplit metodu, veri kümesini belirli bir oranda bölmek için kullanılır.
  • dataView: Bölünecek olan veri kümesini belirtir.
  • testFraction: 0.2: Verinin %20'sinin test veri seti olarak ayrılacağını belirtir. Kalan %80'lik kısım eğitim veri seti olarak kullanılır.

splitDataView değişkeni, eğitim ve test veri setlerini içerir ve TrainTestData türündedir.

return splitDataView;
  • Bu satır, splitDataView değişkenini geri döndürür. splitDataView değişkeni, eğitim ve test veri setlerini içerir. TrainTestData türündeki veri, metodun çağrıldığı yere geri döner ve eğitim ve test işlemlerinde kullanılmak üzere hazır olur.

Peki BuildAndTrainModel ne yapıyor?

BuildAndTrainModel metodu, metin verilerini sayısal özelliklere dönüştüren ve bu özellikleri kullanarak bir ikili sınıflandırma modeli eğiten bir veri işlem hattı oluşturur ve bu modeli eğitir. Eğitilmiş model daha sonra değerlendirme ve tahmin işlemlerinde kullanılmak üzere geri döner.

var estimator = _mlContext.Transforms.Text.FeaturizeText(outputColumnName: "Features", inputColumnName: nameof(SentimentData.SentimentText))
.Append(_mlContext.BinaryClassification.Trainers.SdcaLogisticRegression(labelColumnName: "Label", featureColumnName: "Features"));

Bu satırlar, veri işleme ve model eğitimi için bir estimator oluşturur.

  • FeaturizeText: Metin verilerini sayısal özelliklere (features) dönüştürür. outputColumnName olarak "Features" ve inputColumnName olarak SentimentData sınıfındaki SentimentText özelliği belirtilir.
  • Append: Sonraki işlem veya eğitim adımını ekler.
  • SdcaLogisticRegression: İkili sınıflandırma (binary classification) için Stochastic Dual Coordinate Ascent (SDCA) algoritmasını kullanan bir lojistik regresyon modeli ekler. labelColumnName olarak "Label" ve featureColumnName olarak "Features" belirtilir.
var model = estimator.Fit(splitTrainSet);
  • Bu satır, estimator'ı kullanarak modeli eğitir. Fit metodu, sağlanan eğitim veri seti (splitTrainSet) üzerinde veri işlem hattını eğitir.
  • model değişkeni, eğitilmiş modeli temsil eder ve ITransformer türündedir.
return model;
  • Bu satır, eğitilmiş modeli (model) geri döner. Bu model, daha sonra değerlendirme veya tahmin işlemlerinde kullanılabilir.
  • Metot, ITransformer türünde eğitilmiş bir modeli döner.

Peki Evaluate metotu ne yapıyor ?

private void Evaluate(MLContext mlContext, ITransformer model, IDataView splitTestSet)
{
// 1. Adım: Tahminler Yapma
IDataView predictions = model.Transform(splitTestSet);

// 2. Adım: Modeli Değerlendirme
CalibratedBinaryClassificationMetrics metrics = mlContext.BinaryClassification.Evaluate(predictions, "Label");

// 3. Adım: Performans Metriklerini ViewBag'e Atama
ViewBag.Accuracy = metrics.Accuracy;
ViewBag.Auc = metrics.AreaUnderRocCurve;
ViewBag.F1Score = metrics.F1Score;
}

Evaluate metodu, eğitilmiş bir makine öğrenmesi modelini test veri seti üzerinde değerlendirir ve modelin doğruluk (accuracy), ROC eğrisi altındaki alan (AUC) ve F1 skoru gibi performans metriklerini hesaplar. Hesaplanan bu metrikler, ViewBag aracılığıyla ekrana yansıtılır ve kullanıcıya modelin performansı hakkında bilgi verir.

IDataView predictions = model.Transform(splitTestSet);
  • Bu satır, test veri seti (splitTestSet) üzerinde tahminler yapmak için eğitilmiş modeli (model) kullanır. Transform metodu, modelin test veri seti üzerindeki tahminlerini oluşturur.
  • predictions değişkeni, test veri seti üzerindeki tahmin sonuçlarını içerir ve IDataView türündedir.
CalibratedBinaryClassificationMetrics metrics = mlContext.BinaryClassification.Evaluate(predictions, "Label");
  • Bu satır, modelin performansını değerlendirmek için Evaluate metodunu çağırır. Evaluate metodu, tahmin sonuçlarını (predictions) ve gerçek etiketleri (label) kullanarak çeşitli performans metriklerini hesaplar.
  • predictions: Modelin test veri seti üzerindeki tahmin sonuçları.
  • "Label": Gerçek etiketlerin bulunduğu sütunun adıdır.
  • metrics değişkeni, modelin çeşitli performans metriklerini (örneğin doğruluk, AUC, F1 skoru) içeren CalibratedBinaryClassificationMetrics türünde bir nesnedir.
ViewBag.Accuracy = metrics.Accuracy;
ViewBag.Auc = metrics.AreaUnderRocCurve;
ViewBag.F1Score = metrics.F1Score;
  • Bu satırlar, hesaplanan performans metriklerini ViewBag aracılığıyla ekrana yansıtır.
  • ViewBag.Accuracy: Modelin doğruluğunu (accuracy) gösterir.
  • ViewBag.Auc: ROC eğrisi altındaki alanı (Area Under ROC Curve) gösterir.
  • ViewBag.F1Score: F1 skorunu (precision ve recall'un harmonik ortalaması) gösterir.
  • Bu metrikler, kullanıcıya modelin performansı hakkında bilgi vermek için bir view (görünüm) tarafından kullanılabilir.

Ekran Çıktısı:

Adım 3 : Sonuçların ChatGPT’ye Gönderilmesi

İlgili işlemleri yaptınız, sonuçlar geldi ama sonuçların başarılı mı başarısız olduğunu tam anlayamadınız. O zaman ChatGPT’den yardım alabiliriz :) Peki bunun için nasıl bir kod yazmalıyız ? Haydi inceleyelim !

  public async Task<IActionResult> SendChatGpt(ChatRequestModel model)
{
if (string.IsNullOrWhiteSpace(model.apiKey) || string.IsNullOrWhiteSpace(model.prompt))
{
return BadRequest("API key and evaluation are required.");
}

string outputResult = "";
string apiUrl = "https://api.openai.com/v1/chat/completions";

var requestBody = new
{
model = "gpt-4",
messages = new[]
{
new { role = "system", content = "Sen yardımcı bir asistansın." },
new { role = "user", content = model.prompt }
},
max_tokens = 300
};

var requestContent = new StringContent(JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json");

try
{
var client = _clientFactory.CreateClient();
client.DefaultRequestHeaders.Add("Authorization", $"Bearer {model.apiKey}");

var response = await client.PostAsync(apiUrl, requestContent);
response.EnsureSuccessStatusCode();

var responseBody = await response.Content.ReadAsStringAsync();
var responseObject = JsonConvert.DeserializeObject<dynamic>(responseBody);

foreach (var choice in responseObject.choices)
{
outputResult += choice.message.content;
}

return Ok(outputResult);
}
catch (HttpRequestException ex)
{
return StatusCode(500, $"Internal server error: {ex.Message}");
}
}

SendChatGpt metodu, OpenAI'nin ChatGPT API'sine bir istek göndererek kullanıcı tarafından sağlanan isteme (prompt) göre bir yanıt alır ve bu yanıtı döner.

if (string.IsNullOrWhiteSpace(model.apiKey) || string.IsNullOrWhiteSpace(model.prompt))
{
return BadRequest("API key and evaluation are required.");
}

Bu adımda, model nesnesinde apiKey ve prompt alanlarının boş olup olmadığı kontrol edilir. Eğer bu alanlardan biri boşsa, istemciye 400 Bad Request hatası döner ve işlem sonlanır.

string outputResult = "";
string apiUrl = "https://api.openai.com/v1/chat/completions";

Bu adımda, API yanıtını saklamak için outputResult değişkeni ve OpenAI API'sinin URL'si apiUrl değişkeni tanımlanır.

var requestBody = new
{
model = "gpt-4",
messages = new[]
{
new { role = "system", content = "Sen yardımcı bir asistansın." },
new { role = "user", content = model.prompt }
},
max_tokens = 300
};

var requestContent = new StringContent(JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json");

Bu adımda, API’ye gönderilecek olan istek gövdesi JSON formatında hazırlanır. requestBody değişkeni, kullanılacak modeli (gpt-4), mesajları (sistem mesajı ve kullanıcı isteği), ve maksimum token sayısını içerir. Bu JSON nesnesi StringContent ile uygun formatta (UTF-8, application/json) serileştirilir.

try
{
var client = _clientFactory.CreateClient();
client.DefaultRequestHeaders.Add("Authorization", $"Bearer {model.apiKey}");

var response = await client.PostAsync(apiUrl, requestContent);
response.EnsureSuccessStatusCode();

var responseBody = await response.Content.ReadAsStringAsync();
var responseObject = JsonConvert.DeserializeObject<dynamic>(responseBody);

foreach (var choice in responseObject.choices)
{
outputResult += choice.message.content;
}

return Ok(outputResult);
}
catch (HttpRequestException ex)
{
return StatusCode(500, $"Internal server error: {ex.Message}");
}
  • HttpClient oluşturulur ve Authorization başlığına Bearer {model.apiKey} eklenir.
  • PostAsync metodu ile API'ye istek gönderilir ve yanıt alınır.
  • Yanıtın içerik kısmı (responseBody) okunur ve JsonConvert.DeserializeObject<dynamic> kullanılarak dinamik bir nesneye dönüştürülür.
  • Yanıt nesnesindeki choices alanı üzerinden döngü yapılarak her bir tahminin içeriği (message.content) outputResult değişkenine eklenir.
  • Tahminler başarılı bir şekilde işlendiğinde outputResult istemciye 200 OK yanıtı ile döner.
  • Bir hata oluşursa, HttpRequestException yakalanır ve istemciye 500 Internal Server Error yanıtı döner.

Ekran Çıktısı:

Adım 4: Tahmin İşlemleri

PredictSentiment metodu, kullanıcının sağladığı bir inceleme içeriği için duygu analizi yapmak üzere bir makine öğrenmesi modeli kullanır. Metot şu adımları izler:

  1. Veri kümesini yükler ve modeli eğitir.
  2. Modelin eğitilmiş olup olmadığını kontrol eder. Eğitilmemişse, bir hata mesajı gösterir ve eğitim sayfasını döndürür.
  3. Sağlanan inceleme içeriği için model kullanarak tahmin yapar.
  4. Tahmin sonucunu JSON formatında döndürür.

Bu sayede, kullanıcı sağladığı bir inceleme içeriğinin duygu analizini yapabilir ve sonucu JSON formatında alabilir.

[HttpPost]
public IActionResult PredictSentiment(string reviewContent)
{
// 1. Adım: Modeli Eğitme
TrainTestData splitDataView = LoadData(_mlContext);
_model = BuildAndTrainModel(_mlContext, splitDataView.TrainSet);

// 2. Adım: Modelin Eğitilmiş Olup Olmadığını Kontrol Etme
if (_model == null)
{
ViewBag.ErrorMessage = "Model is not trained yet. Please train the model first.";
return View("TrainModelView");
}

// 3. Adım: İnceleme İçeriği İçin Tahmin Yapma
var resultPrediction = GetPredictionForReviewContent(_mlContext, _model, reviewContent);

// 4. Adım: Tahmin Sonucunu JSON Olarak Döndürme
return Json(resultPrediction);
}

PredictSentiment metodu, kullanıcının sağladığı bir inceleme içeriğinin (reviewContent) duygu analizini yapmak için bir makine öğrenmesi modeli kullanır.

TrainTestData splitDataView = LoadData(_mlContext);
_model = BuildAndTrainModel(_mlContext, splitDataView.TrainSet);
  • Bu adımda, veri kümesi LoadData metodu ile yüklenir ve eğitim ve test veri setlerine bölünür. Ardından BuildAndTrainModel metodu ile eğitim veri seti kullanılarak model oluşturulur ve eğitilir. Eğitilmiş model _model değişkenine atanır.
  • _model değişkeni, eğitilmiş modeli içerir.
var resultPrediction = GetPredictionForReviewContent(_mlContext, _model, reviewContent);
  • Bu adımda, GetPredictionForReviewContent metodu kullanılarak sağlanan inceleme içeriği (reviewContent) için model kullanılarak tahmin yapılır.
  • resultPrediction değişkeni, modelin inceleme içeriği için yaptığı tahmin sonucunu içerir.

Peki GetPredictionForReviewContent metotu ne yapıyor?

GetPredictionForReviewContent metodu, sağlanan bir inceleme içeriği için duygu tahmini yapmak üzere eğitilmiş bir makine öğrenmesi modeli kullanır. Metot şu adımları izler:

  1. PredictionEngine oluşturur ve verilen modeli kullanarak tahmin yapmayı hazırlar.
  2. Tahmin yapılacak inceleme içeriğini içeren bir SentimentData nesnesi oluşturur.
  3. PredictionEngine kullanarak tahmin yapar.
  4. Tahmin sonucunu döner.

Bu sayede, sağlanan inceleme içeriği üzerinde modelin yaptığı duygu tahminine ulaşılır ve bu tahmin sonucu döndürülür.

private SentimentPrediction GetPredictionForReviewContent(MLContext mlContext, ITransformer model, string reviewContent)
{
// 1. Adım: Prediction Engine Oluşturma
PredictionEngine<SentimentData, SentimentPrediction> predictionFunction = mlContext.Model.CreatePredictionEngine<SentimentData, SentimentPrediction>(model);

// 2. Adım: Örnek Veri Oluşturma
SentimentData sampleStatement = new SentimentData
{
SentimentText = reviewContent
};

// 3. Adım: Tahmin Yapma
var resultPrediction = predictionFunction.Predict(sampleStatement);

// 4. Adım: Tahmin Sonucunu Döndürme
return resultPrediction;
}

GetPredictionForReviewContent metodu, sağlanan bir inceleme içeriği (reviewContent) için bir duygu tahmini yapmak üzere eğitilmiş bir makine öğrenmesi modeli kullanır.

PredictionEngine<SentimentData, SentimentPrediction> predictionFunction = mlContext.Model.CreatePredictionEngine<SentimentData, SentimentPrediction>(model);
  • Bu satır, verilen modeli kullanarak bir PredictionEngine oluşturur. PredictionEngine sınıfı, tek bir örnek üzerinde tahmin yapmak için kullanılır.
  • SentimentData: Girdi veri tipini temsil eder (tahmin yapılacak veri).
  • SentimentPrediction: Çıktı veri tipini temsil eder (tahmin sonucu).
  • predictionFunction, tek bir inceleme içeriği üzerinde tahmin yapmak için kullanılacak PredictionEngine nesnesidir.
SentimentData sampleStatement = new SentimentData
{
SentimentText = reviewContent
};
  • Bu satır, tahmin yapılacak inceleme içeriğini (reviewContent) içeren bir SentimentData nesnesi oluşturur.
  • SentimentText: İnceleme metnini içeren alan.
  • sampleStatement, tahmin yapılacak veriyi içeren bir SentimentData nesnesidir.
var resultPrediction = predictionFunction.Predict(sampleStatement);
  • Bu satır, predictionFunction kullanarak sampleStatement üzerinde tahmin yapar. Predict metodu, verilen veri üzerinde modelin tahminini gerçekleştirir.
  • resultPrediction, sampleStatement için yapılan tahmin sonucunu içerir ve SentimentPrediction türündedir.
return resultPrediction;
  • Bu satır, tahmin sonucunu döndürür. SentimentPrediction türünde bir tahmin sonucunu döner.

Ekran Çıktısı:

DEMO 1 (Ev Fiyatı Tahmini)

Adım 1: Giriş ve ML.NET Bağlamının Oluşturulması

var context = new MLContext();

Bu satır, tüm ML.NET işlemleri için merkezi bir bağlam olan MLContext nesnesini oluşturur. Bu bağlam, verileri yüklemek, modelleri eğitmek ve tahminler yapmak gibi ML.NET operasyonları için kullanılır.

Adım 2: Örnek Verilerin Oluşturulması

var houseData = new[]
{
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 }
};

Bu kısımda, evlerin boyutu ve fiyatı hakkında bazı örnek veriler oluşturuyoruz. Bu veriler modelin eğitilmesi için kullanılacak.

Adım 3 : Verilerin IDataView’a Dönüştürülmesi

var data = context.Data.LoadFromEnumerable(houseData);

Bu satır, oluşturduğumuz örnek verileri IDataView formatına dönüştürür. IDataView, ML.NET'te verilerin esnek ve verimli bir şekilde temsil edilmesini sağlayan bir veri yapısıdır.

Adım 4: Öğrenme Pipeline’ının Oluşturulması

var pipeline = context.Transforms.Concatenate("Features", "Size")
.Append(context.Regression.Trainers.Sdca(labelColumnName: "Price", maximumNumberOfIterations: 100));

Bu kısım, öğrenme pipeline’ını oluşturur. İlk olarak, Size sütununu Features adlı bir özellik vektörüne birleştiririz. Daha sonra, Price etiket sütunu ile bir Sdca regresyon eğiticisi ekleriz. Bu eğitici, modelin eğitim sürecini gerçekleştirecek.

Adım 5 : Modelin Eğitilmesi

var model = pipeline.Fit(data);

Bu satır, pipeline’ı kullanarak modelin eğitim verileri (data) üzerinde eğitilmesini sağlar. Fit yöntemi, verilerden öğrenerek bir model oluşturur.

Adım 6: Tahmin Oluşturulması ve yapılması

var size = new HouseData { Size = 2.5F };
var predictionEngine = context.Model.CreatePredictionEngine<HouseData, Prediction>(model);

Burada, belirli bir boyuta sahip bir ev için tahmin yapabilmek amacıyla bir PredictionEngine oluşturuyoruz. PredictionEngine, tekil tahminler yapmak için kullanılır

var price = predictionEngine.Predict(size);
Console.WriteLine($"Predicted price for house with size: {size.Size} is: {price.Price}");

Bu satır, belirttiğimiz boyuttaki bir evin fiyatını tahmin eder ve sonucu konsola yazdırır. Predict yöntemi, modelin öğrenilen bilgilerinden yararlanarak tahmin yapar.

Bu demo, ML.NET kullanarak basit bir ev fiyatı tahmin modeli oluşturma ve kullanma sürecini göstermektedir. Bu adımlar sırasıyla verilerin hazırlanması, pipeline oluşturulması, modelin eğitilmesi ve tahminlerin yapılmasını içerir.

Benim bugünlük anlatacaklarım bu kadar :) Umarım faydalı olmuştur! Bir sonraki yazıda görüşmek üzere!

--

--

Kardel Rüveyda ÇETİN

Expert Software Engineer @DogusTeknoloji ~ All my life I've been over the top. I don't know what I'm doing. All I know is I don't wanna stop. 🤘