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.