C# ML.Net ile Makine Öğrenme | Maaş Tahmini
Merhabalar, bu yazımda 2018 yılında ilk defa hayatımıza giren ML.Net‘i nasıl kullanabileceğimizi öğreneceğiz, bir sektörde personelin çalışma süresi kıdemine göre maaş skalası verileri ile yapay zekamızı eğitecek, sonra bu zamana kadar aldığımız maaşların olduğu bir liste ile ve oluşturacağımız modellerle bundan 8 yıl sonraki maaşımızı tahmin etmesini sağlayacak küçük bir proje ile giriş yapacağız.
ML.Net nedir buradan bakabilirsiniz.
Bu projenin dosyalarına Github adresimden ulaşabilirsiniz.
Öncelikle bir Console Application projesi oluşturuyoruz, ve Nuget yöneticimizden Microsoft.ML kütüphanemizi projemize dahil ediyoruz.
Proje Ayarları;
x32 ML.Net için desteklenmediğinden dolayı Platformu x64 olarak ayarlıyoruz;
Eğitim Dataları;
Bu uygulamamızda kullanacağımız verileri bir csv dosyasından alacağız, projemize göre farklı veritabanı türleri kullanabiliriz.
Veri yapımızı inceleyecek olursak YILLAR ve MAAS olarak iki kolonumuz var bu veriler , ile ayrılıyor
MAASVeri.csv dosyamızda uygulamamızı eğitmekte kullanacağız deneyim yılına göre maaş bilgilerinin tutulduğu skalamız mevcut, MAASVeri-test.csv dosyamızda ize tahminde bulunacağımız personelin çalıştığı zamana kadar gerçekte aldığı maaşların verileri bulunuyor.
ML.NET Programlama
Şimdi SalaryData.cs isminde bir class oluşturarak içerisine aşağıdaki kodları ekliyoruz, bu class veri dosyalarımızda ki yapıyı tanımlamamızı sağlayacak, hangi kolonda ne var gibi.
Ayrıca kolonları veri tiplerini de aynı class içrisinde tanımlıyoruz.
public class SalaryData
{
[Column("0")]
public float YILLAR;
[Column("1", name: "Label")]
public float MAAS;
}
Daha sonra SalaryPrediction.cs isminde bir class daha oluşturuyoruz, bu class tahmin edeceğimiz değeri tanımlıyor.
public class SalaryPrediction
{
[ColumnName("Score")]
public float PredictedSalary;
}
Verilerimizi tanımladığımıza göre Program.cs dosyamızı açarak aşağıdaki kodları ekleyebiliriz kodların açıklamalarını aşağıda paylaşıyor olacağım
class Program
{
private const int TAHMIN_EDILECEK_YIL = 10;
static void Main(string[] args)
{
var dataset = @"C:\MLNET\MAASVeri.csv";
var testDataset = @"C:\MLNET\MAASVeri-test.csv";
var pipeline = new LearningPipeline
{
new TextLoader(dataset).CreateFrom<SalaryData>(useHeader: true, separator: ','),
new ColumnConcatenator("Features", "YILLAR"),
new GeneralizedAdditiveModelRegressor()
};
Console.WriteLine("..........Eğitiliyor..........");
var model = pipeline.Train<SalaryData, SalaryPrediction>();
model.WriteAsync(@"C:\MLNET\model.zip");
Console.WriteLine(Environment.NewLine);
Console.WriteLine("..........Değerlendiriliyor..........");
var testData = new TextLoader(testDataset).CreateFrom<SalaryData>(useHeader: true, separator: ',');
var evaluator = new RegressionEvaluator();
var metrics = evaluator.Evaluate(model, testData);
Console.WriteLine($"Karekök Ortalama: {metrics.Rms}");
Console.WriteLine($"R^2: {metrics.RSquared}");
Console.WriteLine(Environment.NewLine);
Console.WriteLine("..........Tahmin..........");
var prediction = model.Predict(new SalaryData { YILLAR = TAHMIN_EDILECEK_YIL });
Console.WriteLine($"{TAHMIN_EDILECEK_YIL} yıl sonraki maaşınız {String.Format("{0:C}", prediction.PredictedSalary)}");
Console.ReadLine();
}
}
Evet, programımız çalışmaya hazır, ben neler yaptık kısaca onlardan bahsedeceğim,
private const int TAHMIN_EDILECEK_YIL = 10;
Yukarıda, maaşını tahmin edeceğimiz yılın değişkenini tanımladık.
var dataset = @"C:\MLNET\MAASVeri.csv";
var testDataset = @"C:\MLNET\MAASVeri-test.csv";
Veri dosyalarımızın yollarını tanımladık
var pipeline = new LearningPipeline
Bir pipeline oluşturuyoruz, bu verileri aldıktan sonra öğrenme için bir iş akışı oluşturuyor.
new TextLoader(dataset).CreateFrom<SalaryData>(useHeader: true, separator: ','),
Verilerimizi ML.NET‘e aktarmak için CreateForm yönetimini çağırıyoruz.
new GeneralizedAdditiveModelRegressor()
Yukarıdaki kodda ML.NET‘e hangi makine öğrenme algoritmasını kullanmak istediğimizi söylüyoruz, Biz maaş yani bir değer tahmin etmek istediğimiz için regression algoritması kullanmasını söyledik.
var model = pipeline.Train<SalaryData, SalaryPrediction>();
ML.NET‘e veriler ile öğrenmesini söyledik yani eğittik, bu ML.NET kullandığımız da yukarıda ki kod kadar basit bir işlem.
Bu kod çalıştığın da aşağıdaki görüntüye sahip olacaksınız, eğitim başlıyor ve veri dosyamızda ki 30 data öğreniliyor.
var testData = new TextLoader("MAASVeri-test.csv").CreateFrom<SalaryData>(useHeader: true, separator: ',');
Yukarıda ki kod tahmin için öğrenilen verileri okumamızı sağlıyor.
var evaluator = new RegressionEvaluator();
var metrics = evaluator.Evaluate(model, testData);
Console.WriteLine($"Root Mean Squared: {metrics.Rms}");
Console.WriteLine($"R^2: {metrics.RSquared}");
Öğrenilen veriler ile bizim gerçek maaş verilerimiz arasındaki tutarlılığı hesaplıyor ve bize R^2: değerini veriyor bu değer 0 – 1 arasında bir değer ve ne kadar 1 değerine yakın olursa tahminin o kadar gerçeğe yakın olacağını bilmeliyiz.
Console.WriteLine($"{TAHMIN_EDILECEK_YIL} yıl sonraki maaşınız {String.Format("{0:C}", prediction.PredictedSalary)}");
Yukarı da tahmin işlemi tamamlanıp ekrana yazdırıyoruz.
Uygulamayı çalıştırdığımız da aşağıdaki gibi bir görüntüye sahip olacağız.
Bu projedeki kaynak kodlarına Github adresimden ulaşabilirsiniz.