ML.NET, Microsoft'un .NET için geliştirdiği açık kaynaklı makine öğrenimi çerçevesidir. Python veya harici bir AI API'si kullanmadan, doğrudan C# ile sınıflandırma, regresyon ve kümeleme modelleri eğitip uygulamanıza dahil edebilirsiniz. Verileriniz kurum dışına çıkmaz, gecikme minimumdur.

MLContext: Giriş Noktası

// dotnet add package Microsoft.ML
using Microsoft.ML;
using Microsoft.ML.Data;

var mlContext = new MLContext(seed: 42); // seed: tekrarlanabilir sonuçlar için

Veri Modelleri ve IDataView

public class YorumVerisi
{
    [LoadColumn(0)] public string Metin    { get; set; } = "";
    [LoadColumn(1)] public bool   OlumluMu { get; set; }
}

public class YorumTahmini
{
    [ColumnName("PredictedLabel")] public bool  TahminEtiket { get; set; }
    public float Olasilik { get; set; }
    public float Puan     { get; set; }
}

// CSV'den yükleme
var veri = mlContext.Data.LoadFromTextFile<YorumVerisi>(
    "yorumlar.csv", hasHeader: true, separatorChar: ',');

// Bellekten yükleme
var liste = new List<YorumVerisi>
{
    new() { Metin = "Harika ürün!",   OlumluMu = true  },
    new() { Metin = "Çok kötü kalite.", OlumluMu = false }
};
var bellekVeri = mlContext.Data.LoadFromEnumerable(liste);

Binary Classification: Duygu Analizi

// Pipeline: metin özellik çıkarma → eğitim
var pipeline = mlContext.Transforms.Text
    .FeaturizeText("Ozellikler", nameof(YorumVerisi.Metin))
    .Append(mlContext.BinaryClassification.Trainers.SdcaLogisticRegression(
        labelColumnName: nameof(YorumVerisi.OlumluMu),
        featureColumnName: "Ozellikler"));

// %80 eğitim / %20 test
var bolunmus = mlContext.Data.TrainTestSplit(veri, testFraction: 0.2);
var model    = pipeline.Fit(bolunmus.TrainSet);

// Değerlendirme
var metrikler = mlContext.BinaryClassification.Evaluate(
    model.Transform(bolunmus.TestSet),
    labelColumnName: nameof(YorumVerisi.OlumluMu));

Console.WriteLine($"Doğruluk: {metrikler.Accuracy:P2}");
Console.WriteLine($"AUC:      {metrikler.AreaUnderRocCurve:F3}");
Console.WriteLine($"F1 Skoru: {metrikler.F1Score:F3}");

Regression: Fiyat Tahmini

public class EmlakVerisi
{
    public float Metrekare { get; set; }
    public float OdaSayisi { get; set; }
    public float YasYil    { get; set; }
    public float Fiyat     { get; set; }  // hedef sütun
}

public class EmlakTahmini
{
    [ColumnName("Score")] public float TahminFiyat { get; set; }
}

var emlakPipeline = mlContext.Transforms
    .Concatenate("Ozellikler",
        nameof(EmlakVerisi.Metrekare),
        nameof(EmlakVerisi.OdaSayisi),
        nameof(EmlakVerisi.YasYil))
    .Append(mlContext.Regression.Trainers.FastTree(
        labelColumnName:  nameof(EmlakVerisi.Fiyat),
        featureColumnName: "Ozellikler",
        numberOfLeaves: 20,
        numberOfTrees:  100));

var emlakModel = emlakPipeline.Fit(egitimVeri);

var regMetrik = mlContext.Regression.Evaluate(
    emlakModel.Transform(testVeri),
    labelColumnName: nameof(EmlakVerisi.Fiyat));

Console.WriteLine($"RMSE: {regMetrik.RootMeanSquaredError:F2}");
Console.WriteLine($"R²:   {regMetrik.RSquared:F3}");

Model Kaydetme, Yükleme ve DI

// Kaydet
mlContext.Model.Save(model, veri.Schema, "duygu_modeli.zip");

// Yükle
using var stream = File.OpenRead("duygu_modeli.zip");
var yuklenenModel = new MLContext().Model.Load(stream, out _);

// ASP.NET Core'da thread-safe PredictionEnginePool
builder.Services
    .AddPredictionEnginePool<YorumVerisi, YorumTahmini>()
    .FromFile("duygu_modeli.zip");

public class AnalizServisi(PredictionEnginePool<YorumVerisi, YorumTahmini> pool)
{
    public YorumTahmini Analiz(string metin) =>
        pool.Predict(new YorumVerisi { Metin = metin });
}

ML.NET dış API bağımlılığı olmadan .NET'e doğrudan makine öğrenimi yetenekleri kazandırır. Sınıflandırma, anomali tespiti ve regresyon gibi klasik ML görevleri için OpenAI'ye alternatif — daha hızlı, çevrimdışı çalışır ve maliyet yoktur.