Aracılığıyla paylaş


Öğretici: ML.NET ile matris faktörizasyonu kullanarak film önericisi oluşturma

Bu öğreticide bir .NET Core konsol uygulamasında ML.NET ile film önerisi oluşturmayı öğreneceksiniz. Adımlarda C# ve Visual Studio 2019 kullanılır.

Bu öğreticide şunların nasıl yapıldığını öğreneceksiniz:

  • Makine öğrenmesi algoritması seçme
  • Verilerinizi hazırlama ve yükleme
  • Model oluşturma ve eğitma
  • Modeli değerlendirme
  • Modeli dağıtma ve kullanma

Bu öğreticinin kaynak kodunu dotnet/samples deposunda bulabilirsiniz.

Makine öğrenmesi iş akışı

Görevinizi ve diğer ML.NET görevleri gerçekleştirmek için aşağıdaki adımları kullanacaksınız:

  1. Verilerinizi yükleme
  2. Modelinizi oluşturma ve eğitma
  3. Modelinizi değerlendirme
  4. Modelinizi kullanma

Önkoşullar

Uygun makine öğrenmesi görevini seçin

Film listesi önerme veya ilgili ürünlerin listesini önerme gibi öneri sorunlarına yaklaşmanın çeşitli yolları vardır, ancak bu durumda bir kullanıcının belirli bir filme hangi derecelendirmeyi (1-5) vereceğini tahmin eder ve tanımlı bir eşikten yüksekse (derecelendirme ne kadar yüksekse, kullanıcının belirli bir filmi beğenme olasılığı o kadar yüksektir) bu filmi önerirsiniz.

Konsol uygulaması oluşturma

Proje oluşturma

  1. "MovieRecommender" adlı bir C# Konsol Uygulaması oluşturun. İleri düğmesine tıklayın.

  2. Kullanılacak çerçeve olarak .NET 6'yı seçin. Oluştur düğmesine tıklayın.

  3. Veri kümesini depolamak için projenizde Data adlı bir dizin oluşturun:

    Çözüm Gezgini'da projeye sağ tıklayın veYeni Klasör Ekle'yi> seçin. "Veri" yazın ve Enter tuşuna basın.

  4. Microsoft.ML ve Microsoft.ML.Recommender NuGet Paketlerini yükleyin:

    Not

    Bu örnek, aksi belirtilmedikçe bahsedilen NuGet paketlerinin en son kararlı sürümünü kullanır.

    Çözüm Gezgini'da projeye sağ tıklayın ve NuGet Paketlerini Yönet'i seçin. Paket kaynağı olarak "nuget.org" öğesini seçin, Gözat sekmesini seçin, Microsoft.ML arayın, listeden paketi seçin ve Yükle düğmesini seçin. Listelenen paketlerin lisans koşullarını kabul ediyorsanız, Değişiklikleri Önizle iletişim kutusunda Tamam düğmesini ve ardından Lisans Kabulü iletişim kutusunda Kabul Ediyorum düğmesini seçin. Microsoft.ML.Recommender için bu adımları yineleyin.

  5. Program.cs dosyanızın en üstüne aşağıdaki using deyimleri ekleyin:

    using Microsoft.ML;
    using Microsoft.ML.Trainers;
    using MovieRecommendation;
    

Verilerinizi indirin

  1. İki veri kümesini indirin ve daha önce oluşturduğunuz Veri klasörüne kaydedin:

    • recommendation-ratings-train.csv sağ tıklayın ve "Bağlantıyı (veya Hedefi) Farklı Kaydet..." seçeneğini belirleyin

    • recommendation-ratings-test.csv sağ tıklayın ve "Bağlantıyı (veya Hedefi) Farklı Kaydet..." seçeneğini belirleyin

      *.csv dosyalarını Veri klasörüne kaydettiğinizden veya başka bir yere kaydettikten sonra *.csv dosyalarını Veri klasörüne taşıdığınızdan emin olun.

  2. Çözüm Gezgini'da *.csv dosyalarının her birine sağ tıklayın ve Özellikler'i seçin. Gelişmiş'in altında, Çıktı Dizinine Kopyala değerini daha yeniyse Kopyala olarak değiştirin.

    VS'de daha yeniyse kopya seçen kullanıcının GIF'i.

Verilerinizi yükleme

ML.NET sürecinin ilk adımı, model eğitim ve test verilerinizi hazırlamak ve yüklemektir.

Öneri derecelendirme verileri ve Test veri kümelerine bölünürTrain. Veriler Train modelinize uyacak şekilde kullanılır. Veriler Test , eğitilen modelinizle tahminlerde bulunmak ve model performansını değerlendirmek için kullanılır. ve Test verileriyle Train 80/20'nin bölünmesi yaygın olarak görülür.

*.csv dosyalarınızdaki verilerin önizlemesi aşağıdadır:

CVS veri kümesinin önizlemesinin ekran görüntüsü.

*.csv dosyalarında dört sütun vardır:

  • userId
  • movieId
  • rating
  • timestamp

Makine öğrenmesinde, tahminde bulunmak için kullanılan sütunlar Özellikler, döndürülen tahmini içeren sütun ise Etiket olarak adlandırılır.

Film derecelendirmelerini tahmin etmek istediğiniz için derecelendirme sütunu olur Label. Diğer üç sütun olan userId, movieIdve timestamp tüm Features sütunları tahmin etmek için Labelkullanılır.

Özellikler Etiketle
userId rating
movieId
timestamp

tahmin etmek için Labelhangilerinin Features kullanılacağına karar vermek size bağlı. En iyi Featuresseçmeye yardımcı olması için permütasyon özelliğinin önemi gibi yöntemleri de kullanabilirsiniz.

Bu durumda, zaman damgası bir kullanıcının belirli bir Feature filmi nasıl derecelediğini gerçekten etkilemediğinden ve bu nedenle daha doğru bir tahminde bulunmaya katkıda bulunmadığından sütunu bir olarak ortadan kaldırmanız timestamp gerekir:

Özellikler Etiketle
userId rating
movieId

Ardından giriş sınıfı için veri yapınızı tanımlamanız gerekir.

Projenize yeni bir sınıf ekleyin:

  1. Çözüm Gezgini'da projeye sağ tıklayın ve ardından Yeni Öğe Ekle'yi >seçin.

  2. Yeni Öğe Ekle iletişim kutusundaSınıf'ı seçin ve Ad alanını MovieRatingData.cs olarak değiştirin. Ardından Ekle düğmesini seçin.

MovieRatingData.cs dosyası kod düzenleyicisinde açılır. MovieRatingData.cs dosyasının en üstüne aşağıdaki using deyimi ekleyin:

using Microsoft.ML.Data;

Mevcut sınıf tanımını kaldırarak ve MovieRatingData.cs dosyasına aşağıdaki kodu ekleyerek adlı MovieRating bir sınıf oluşturun:

public class MovieRating
{
    [LoadColumn(0)]
    public float userId;
    [LoadColumn(1)]
    public float movieId;
    [LoadColumn(2)]
    public float Label;
}

MovieRating bir giriş veri sınıfı belirtir. LoadColumn özniteliği, veri kümesindeki hangi sütunların (sütun dizinine göre) yüklenmesi gerektiğini belirtir. userId ve movieId sütunları sizindir Features (modeli tahmin Labeletmek için modele vereceğiniz girişler) ve derecelendirme sütunu tahmin edeceğiniz sütundur Label (modelin çıktısı).

MovieRatingData.cs dosyasında sınıfından sonra MovieRating aşağıdaki kodu ekleyerek tahmin edilen sonuçları göstermek için başka bir sınıf MovieRatingPredictionoluşturun:

public class MovieRatingPrediction
{
    public float Label;
    public float Score;
}

Program.cs dosyasında öğesini Console.WriteLine("Hello World!") aşağıdaki kodla değiştirin:

MLContext mlContext = new MLContext();

MLContext sınıfı tüm ML.NET işlemleri için bir başlangıç noktasıdır ve başlatma mlContext işlemi, model oluşturma iş akışı nesneleri arasında paylaşılabilen yeni bir ML.NET ortamı oluşturur. Entity Framework'tekine DBContext benzer, kavramsal olarak.

Dosyanın en altında adlı LoadData()bir yöntem oluşturun:

(IDataView training, IDataView test) LoadData(MLContext mlContext)
{

}

Not

Bu yöntem, aşağıdaki adımlarda bir return deyimi ekleyene kadar size bir hata verir.

Veri yolu değişkenlerinizi başlatın, *.csv dosyalarından verileri yükleyin ve aşağıdakini içinde LoadData()bir sonraki kod satırı olarak IDataView ekleyerek ve Test verilerini nesne olarak döndürinTrain:

var trainingDataPath = Path.Combine(Environment.CurrentDirectory, "Data", "recommendation-ratings-train.csv");
var testDataPath = Path.Combine(Environment.CurrentDirectory, "Data", "recommendation-ratings-test.csv");

IDataView trainingDataView = mlContext.Data.LoadFromTextFile<MovieRating>(trainingDataPath, hasHeader: true, separatorChar: ',');
IDataView testDataView = mlContext.Data.LoadFromTextFile<MovieRating>(testDataPath, hasHeader: true, separatorChar: ',');

return (trainingDataView, testDataView);

ML.NET'daki veriler bir IDataView arabirimi olarak temsil edilir. IDataView tablosal verileri (sayısal ve metin) açıklamanın esnek ve verimli bir yoludur. Veriler bir metin dosyasından veya gerçek zamanlı olarak (örneğin, SQL veritabanı veya günlük dosyaları) bir IDataView nesneye yüklenebilir.

LoadFromTextFile() veri şemasını tanımlar ve dosyada okur. Veri yolu değişkenlerini alır ve bir IDataViewdöndürür. Bu durumda, ve Train dosyalarınız Test için yolu sağlar ve hem metin dosyası üst bilgisini (sütun adlarını düzgün kullanabilmesi için) hem de virgül karakter veri ayırıcısını (varsayılan ayırıcı bir sekmedir) belirtirsiniz.

Yönteminizi LoadData() çağırmak ve ve Test verilerini döndürmek Train için aşağıdaki kodu ekleyin:

(IDataView trainingDataView, IDataView testDataView) = LoadData(mlContext);

Modelinizi oluşturma ve eğitma

BuildAndTrainModel() Aşağıdaki kodu kullanarak yöntemin LoadData() hemen ardından yöntemini oluşturun:

ITransformer BuildAndTrainModel(MLContext mlContext, IDataView trainingDataView)
{

}

Not

Bu yöntem, aşağıdaki adımlarda bir return deyimi ekleyene kadar size bir hata verir.

veri dönüşümlerini tanımlamak için BuildAndTrainModel()aşağıdaki kodu ekleyin:

IEstimator<ITransformer> estimator = mlContext.Transforms.Conversion.MapValueToKey(outputColumnName: "userIdEncoded", inputColumnName: "userId")
    .Append(mlContext.Transforms.Conversion.MapValueToKey(outputColumnName: "movieIdEncoded", inputColumnName: "movieId"));

userIdmovieId Gerçek değerleri değil kullanıcıları ve film başlıklarını temsil ettiğinden, mapValueToKey() yöntemini kullanarak her userIdmovieId biri sayısal anahtar türü Feature sütununa (öneri algoritmaları tarafından kabul edilen bir biçim) dönüştürülür ve bunları yeni veri kümesi sütunları olarak eklenir:

userId movieId Etiketle userIdEncoded movieIdEncoded
1 1 4 userKey1 movieKey1
1 3 4 userKey1 movieKey2
1 6 4 userKey1 movieKey3

Makine öğrenmesi algoritmasını seçin ve aşağıdakini içinde bir sonraki kod BuildAndTrainModel()satırı olarak ekleyerek veri dönüştürme tanımlarına ekleyin:

var options = new MatrixFactorizationTrainer.Options
{
    MatrixColumnIndexColumnName = "userIdEncoded",
    MatrixRowIndexColumnName = "movieIdEncoded",
    LabelColumnName = "Label",
    NumberOfIterations = 20,
    ApproximationRank = 100
};

var trainerEstimator = estimator.Append(mlContext.Recommendation().Trainers.MatrixFactorization(options));

MatrixFactorizationTrainer, öneri eğitim algoritmanızdır. Matris Çarpanlarına Ayırma , kullanıcıların geçmişte ürünleri nasıl derecelendirdiğiyle ilgili verileriniz olduğunda yaygın bir öneri yaklaşımıdır ve bu öğreticideki veri kümeleri için de geçerlidir. Farklı verileriniz olduğunda başka öneri algoritmaları da vardır (daha fazla bilgi edinmek için aşağıdaki Diğer öneri algoritmaları bölümüne bakın).

Bu durumda Matrix Factorization , algoritma "işbirliğine dayalı filtreleme" adlı bir yöntem kullanır ve bu yöntem, Kullanıcı 1'in belirli bir sorun üzerinde Kullanıcı 2 ile aynı görüşe sahip olması durumunda, Kullanıcı 1'in farklı bir sorun hakkında Kullanıcı 2 ile aynı şekilde hissetme olasılığının daha yüksek olduğunu varsayar.

Örneğin, Kullanıcı 1 ve Kullanıcı 2 de filmleri benzer şekilde derecelendiriyorsa, Kullanıcı 2'nin 1. Kullanıcının izlediği ve derecelendirildiği bir filmin keyfini çıkarma olasılığı daha yüksektir:

Incredibles 2 (2018) The Avengers (2012) Guardians of the Galaxy (2014)
Kullanıcı 1 İzlenen ve beğenilen film İzlenen ve beğenilen film İzlenen ve beğenilen film
Kullanıcı 2 İzlenen ve beğenilen film İzlenen ve beğenilen film İzlemedi -- ÖNERİLEN film

EğitmenMatrix Factorization, aşağıdaki Algoritma hiper parametreleri bölümünden daha fazla bilgi edinebileceğiniz çeşitli Seçeneklere sahiptir.

Modeli verilere sığdırın Train ve yönteminin sonraki kod satırı olarak aşağıdakileri ekleyerek eğitilen modeli döndürin BuildAndTrainModel() :

Console.WriteLine("=============== Training the model ===============");
ITransformer model = trainerEstimator.Fit(trainingDataView);

return model;

Fit() yöntemi, modelinizi sağlanan eğitim veri kümesiyle eğiter. Teknik olarak, verileri dönüştürüp eğitimi uygulayarak tanımları yürütür Estimator ve bir olan Transformereğitilen modeli geri döndürür.

ML.NET model eğitim iş akışı hakkında daha fazla bilgi için bkz . ML.NET nedir ve nasıl çalışır?.

Yönteminizi BuildAndTrainModel() çağırmak ve eğitilen modeli döndürmek için yönteminin LoadData() altındaki bir sonraki kod satırı olarak aşağıdakileri ekleyin:

ITransformer model = BuildAndTrainModel(mlContext, trainingDataView);

Modelinizi değerlendirme

Modelinizi eğitdikten sonra test verilerinizi kullanarak modelinizin performansını değerlendirin.

EvaluateModel() Aşağıdaki kodu kullanarak yönteminden BuildAndTrainModel() hemen sonra yöntemini oluşturun:

void EvaluateModel(MLContext mlContext, IDataView testDataView, ITransformer model)
{

}

aşağıdaki Test kodu EvaluateModel()ekleyerek verileri dönüştürün:

Console.WriteLine("=============== Evaluating the model ===============");
var prediction = model.Transform(testDataView);

Transform() yöntemi, test veri kümesinin sağlanan birden çok giriş satırı için tahminler yapar.

yönteminin sonraki kod satırı olarak aşağıdakileri ekleyerek modeli değerlendirin EvaluateModel() :

var metrics = mlContext.Regression.Evaluate(prediction, labelColumnName: "Label", scoreColumnName: "Score");

Tahmin kümesini aldıktan sonra Evaluate() yöntemi modeli değerlendirir. Bu yöntem tahmin edilen değerleri test veri kümesindeki gerçek Labels değerle karşılaştırır ve modelin performansına ilişkin ölçümleri döndürür.

Yönteminin bir sonraki kod satırı olarak aşağıdakileri ekleyerek değerlendirme ölçümlerinizi konsola EvaluateModel() yazdırın:

Console.WriteLine("Root Mean Squared Error : " + metrics.RootMeanSquaredError.ToString());
Console.WriteLine("RSquared: " + metrics.RSquared.ToString());

Yönteminizi EvaluateModel() çağırmak için BuildAndTrainModel() yönteminin çağrısının altındaki bir sonraki kod satırı olarak aşağıdakileri ekleyin:

EvaluateModel(mlContext, testDataView, model);

Şu ana kadarki çıktı aşağıdaki metne benzer görünmelidir:

=============== Training the model ===============
iter      tr_rmse          obj
   0       1.5403   3.1262e+05
   1       0.9221   1.6030e+05
   2       0.8687   1.5046e+05
   3       0.8416   1.4584e+05
   4       0.8142   1.4209e+05
   5       0.7849   1.3907e+05
   6       0.7544   1.3594e+05
   7       0.7266   1.3361e+05
   8       0.6987   1.3110e+05
   9       0.6751   1.2948e+05
  10       0.6530   1.2766e+05
  11       0.6350   1.2644e+05
  12       0.6197   1.2541e+05
  13       0.6067   1.2470e+05
  14       0.5953   1.2382e+05
  15       0.5871   1.2342e+05
  16       0.5781   1.2279e+05
  17       0.5713   1.2240e+05
  18       0.5660   1.2230e+05
  19       0.5592   1.2179e+05
=============== Evaluating the model ===============
Rms: 0.994051469730769
RSquared: 0.412556298844873

Bu çıkışta 20 yineleme vardır. Her yinelemede hata ölçüsü azalır ve 0'a yaklaşıp yakınlaşır.

root of mean squared error (RMS veya RMSE) modelin tahmin edilen değerleriyle gözlemlenen test veri kümesi değerleri arasındaki farkları ölçmek için kullanılır. Teknik olarak hataların karelerinin ortalamasının karekökünü oluşturur. Ne kadar düşük olursa, model o kadar iyi olur.

R Squared verilerin modele ne kadar uygun olduğunu gösterir. 0 ile 1 arasında değişir. 0 değeri, verilerin rastgele olduğu veya başka bir şekilde modele sığmayacağı anlamına gelir. 1 değeri, modelin veriyle tam olarak eşleşir anlamına gelir. Puanınızın R Squared mümkün olduğunca 1'e yakın olmasını istiyorsunuz.

Başarılı modeller oluşturmak yinelemeli bir işlemdir. Öğretici hızlı model eğitimi sağlamak için küçük veri kümelerini kullandığından bu model ilk olarak daha düşük kaliteye sahiptir. Model kalitesinden memnun değilseniz, daha büyük eğitim veri kümeleri sağlayarak veya her algoritma için farklı hiper parametrelere sahip farklı eğitim algoritmaları seçerek modeli iyileştirmeyi deneyebilirsiniz. Daha fazla bilgi için aşağıdaki Modelinizi geliştirin bölümüne bakın.

Modelinizi kullanma

Artık eğitilen modelinizi kullanarak yeni veriler üzerinde tahminde bulunabilirsiniz.

UseModelForSinglePrediction() Aşağıdaki kodu kullanarak yönteminden EvaluateModel() hemen sonra yöntemini oluşturun:

void UseModelForSinglePrediction(MLContext mlContext, ITransformer model)
{

}

PredictionEngine aşağıdaki kodu 'a ekleyerek derecelendirmeyi tahmin etmek için UseModelForSinglePrediction()kullanın:

Console.WriteLine("=============== Making a prediction ===============");
var predictionEngine = mlContext.Model.CreatePredictionEngine<MovieRating, MovieRatingPrediction>(model);

PredictionEngine, tek bir veri örneği üzerinde tahmin gerçekleştirmenizi sağlayan kullanışlı bir API'dir. PredictionEngine iş parçacığı güvenli değildir. Tek iş parçacıklı veya prototip ortamlarında kullanılması kabul edilebilir. Üretim ortamlarında iyileştirilmiş performans ve iş parçacığı güvenliği için, uygulamanızın PredictionEnginePoolPredictionEngine tamamında kullanmak üzere bir ObjectPool nesne oluşturan hizmetini kullanın. ASP.NET Core Web API'sinde kullanma PredictionEnginePoolhakkında bu kılavuza bakın.

Not

PredictionEnginePool hizmet uzantısı şu anda önizleme aşamasındadır.

adlı testInput bir örneği MovieRating oluşturun ve yönteminin sonraki kod satırları olarak aşağıdakileri ekleyerek bunu Tahmin Altyapısı'na UseModelForSinglePrediction() geçirin:

var testInput = new MovieRating { userId = 6, movieId = 10 };

var movieRatingPrediction = predictionEngine.Predict(testInput);

Predict() işlevi tek bir veri sütunu üzerinde tahminde bulunur.

Ardından, movieId 10 içeren filmi kullanıcı 6'ya önermek isteyip istemediğinizi belirlemek için , veya tahmin edilen derecelendirmeyi kullanabilirsiniz Score. değeri ne kadar yüksekse Score, kullanıcının belirli bir filmi sevme olasılığı da o kadar yüksektir. Bu durumda tahmini derecelendirmesi > 3,5 olan filmleri önerdiğinizi varsayalım.

Sonuçları yazdırmak için yönteminin sonraki kod UseModelForSinglePrediction() satırları olarak aşağıdakileri ekleyin:

if (Math.Round(movieRatingPrediction.Score, 1) > 3.5)
{
    Console.WriteLine("Movie " + testInput.movieId + " is recommended for user " + testInput.userId);
}
else
{
    Console.WriteLine("Movie " + testInput.movieId + " is not recommended for user " + testInput.userId);
}

Yönteminizi UseModelForSinglePrediction() çağırmak için EvaluateModel() yönteminin çağrısından sonra sonraki kod satırı olarak aşağıdakileri ekleyin:

UseModelForSinglePrediction(mlContext, model);

Bu yöntemin çıkışı aşağıdaki metne benzer görünmelidir:

=============== Making a prediction ===============
Movie 10 is recommended for user 6

Modelinizi kaydetme

Modelinizi son kullanıcı uygulamalarında tahminlerde bulunmak üzere kullanmak için önce modeli kaydetmeniz gerekir.

SaveModel() Aşağıdaki kodu kullanarak yönteminden UseModelForSinglePrediction() hemen sonra yöntemini oluşturun:

void SaveModel(MLContext mlContext, DataViewSchema trainingDataViewSchema, ITransformer model)
{

}

yöntemine aşağıdaki kodu SaveModel() ekleyerek eğitilen modelinizi kaydedin:

var modelPath = Path.Combine(Environment.CurrentDirectory, "Data", "MovieRecommenderModel.zip");

Console.WriteLine("=============== Saving the model to a file ===============");
mlContext.Model.Save(model, trainingDataViewSchema, modelPath);

Bu yöntem, eğitilen modelinizi bir .zip dosyasına ("Veri" klasöründe) kaydeder ve bu dosya tahminlerde bulunmak için diğer .NET uygulamalarında kullanılabilir.

Yönteminizi SaveModel() çağırmak için UseModelForSinglePrediction() yönteminin çağrısından sonra sonraki kod satırı olarak aşağıdakileri ekleyin:

SaveModel(mlContext, trainingDataView.Schema, model);

Kaydedilmiş modelinizi kullanma

Eğitilen modelinizi kaydettikten sonra modeli farklı ortamlarda kullanabilirsiniz. Uygulamalarda eğitilmiş bir makine öğrenmesi modelini kullanıma hazır hale getirme hakkında bilgi edinmek için bkz. Eğitilen modelleri kaydetme ve yükleme .

Sonuçlar

Yukarıdaki adımları izledikten sonra konsol uygulamanızı (Ctrl + F5) çalıştırın. Yukarıdaki tek tahminden elde edilen sonuçlarınız aşağıdakine benzer olmalıdır. Uyarılar görebilir veya iletileri işleyebilirsiniz, ancak bu iletiler netlik için aşağıdaki sonuçlardan kaldırılmıştır.

=============== Training the model ===============
iter      tr_rmse          obj
   0       1.5382   3.1213e+05
   1       0.9223   1.6051e+05
   2       0.8691   1.5050e+05
   3       0.8413   1.4576e+05
   4       0.8145   1.4208e+05
   5       0.7848   1.3895e+05
   6       0.7552   1.3613e+05
   7       0.7259   1.3357e+05
   8       0.6987   1.3121e+05
   9       0.6747   1.2949e+05
  10       0.6533   1.2766e+05
  11       0.6353   1.2636e+05
  12       0.6209   1.2561e+05
  13       0.6072   1.2462e+05
  14       0.5965   1.2394e+05
  15       0.5868   1.2352e+05
  16       0.5782   1.2279e+05
  17       0.5713   1.2227e+05
  18       0.5637   1.2190e+05
  19       0.5604   1.2178e+05
=============== Evaluating the model ===============
Rms: 0.977175077487166
RSquared: 0.43233349213192
=============== Making a prediction ===============
Movie 10 is recommended for user 6
=============== Saving the model to a file ===============

Tebrikler! Artık film önermek için başarıyla bir makine öğrenmesi modeli oluşturdunuz. Bu öğreticinin kaynak kodunu dotnet/samples deposunda bulabilirsiniz.

Modelinizi geliştirme

Daha doğru tahminler elde edebilmeniz için modelinizin performansını artırmanın çeşitli yolları vardır.

Veriler

Her kullanıcı ve film kimliği için yeterli örnek içeren daha fazla eğitim verisi eklemek, öneri modelinin kalitesini artırmaya yardımcı olabilir.

Çapraz doğrulama , verileri rastgele alt kümelere bölen (bu öğreticide yaptığınız gibi test verilerini veri kümesinden ayıklamak yerine) ve bazı grupları eğitim verileri olarak, gruplardan bazılarını da test verileri olarak alan modelleri değerlendirmeye yönelik bir tekniktir. Bu yöntem, model kalitesi açısından eğitim testi bölme işleminin daha iyi performans gösterir.

Özellikler

Bu öğreticide, yalnızca veri kümesi tarafından sağlanan üç Features (user id, movie idve rating) kullanırsınız.

Bu iyi bir başlangıç olsa da, gerçekte veri kümesine dahil edilen diğer öznitelikleri veya Features (örneğin yaş, cinsiyet, coğrafi konum vb.) eklemek isteyebilirsiniz. Daha ilgili Features ekleme, öneri modelinizin performansını artırmaya yardımcı olabilir.

Makine öğrenmesi göreviniz için hangisinin en uygun olabileceğinden Features emin değilseniz, ML.NET en etkili Featuresöğesini keşfetmenizi sağlayan Özellik Katkı Hesaplaması (FCC) ve permütasyon özelliği önemini de kullanabilirsiniz.

Algoritma hiper parametreleri

ML.NET iyi varsayılan eğitim algoritmaları sağlarken, algoritmanın hiper parametrelerini değiştirerek performansta daha fazla ince ayar yapabilirsiniz.

için Matrix FactorizationNumberOfIterations ve ApproximationRank gibi hiper parametrelerle denemeler yapabilir ve bunun size daha iyi sonuçlar sağlayıp sunmadığını görebilirsiniz.

Örneğin, bu öğreticide algoritma seçenekleri şunlardır:

var options = new MatrixFactorizationTrainer.Options
{
    MatrixColumnIndexColumnName = "userIdEncoded",
    MatrixRowIndexColumnName = "movieIdEncoded",
    LabelColumnName = "Label",
    NumberOfIterations = 20,
    ApproximationRank = 100
};

Diğer Öneri Algoritmaları

İşbirliğine dayalı filtrelemeye sahip matris faktörizasyon algoritması, film önerileri gerçekleştirmek için yalnızca bir yaklaşımdır. Çoğu durumda derecelendirme verilerine sahip olmayabilirsiniz ve yalnızca kullanıcılardan film geçmişiniz olabilir. Diğer durumlarda, yalnızca kullanıcının derecelendirme verilerinden fazlasına sahip olabilirsiniz.

Algoritma Senaryo Örnek
One Class Matrix Factorization Yalnızca userId ve movieId'niz varsa bunu kullanın. Bu öneri stili ortak satın alma senaryosuna veya sık sık birlikte satın alınan ürünlere dayanır. Bu, müşterilere kendi satın alma siparişi geçmişlerine göre bir ürün kümesi önereceği anlamına gelir. >Deneyin
Alan Algılayan Faktörizasyon Makineleri UserId, productId ve derecelendirme dışında daha fazla özelliğe (ürün açıklaması veya ürün fiyatı gibi) sahip olduğunuzda önerilerde bulunmak için bunu kullanın. Bu yöntem, işbirliğine dayalı filtreleme yaklaşımını da kullanır. >Deneyin

Yeni kullanıcı senaryosu

İşbirliğine dayalı filtrelemede sık karşılaşılan sorunlardan biri soğuk başlangıç sorunudur. Bu sorun, çıkarımlar yapmak için daha önce veri içermeyen yeni bir kullanıcınız olmasıdır. Bu sorun genellikle yeni kullanıcılardan bir profil oluşturmalarını ve örneğin geçmişte gördükleri filmleri derecelendirmelerini isteyerek çözülür. Bu yöntem kullanıcıya biraz yük olsa da, derecelendirme geçmişi olmayan yeni kullanıcılar için bazı başlangıç verileri sağlar.

Kaynaklar

Bu öğreticide kullanılan veriler MovieLens Veri Kümesi'nden türetilir.

Sonraki adımlar

Bu öğreticide, şunların nasıl yapıldığını öğrendiniz:

  • Makine öğrenmesi algoritması seçme
  • Verilerinizi hazırlama ve yükleme
  • Model oluşturma ve eğitma
  • Modeli değerlendirme
  • Modeli dağıtma ve kullanma

Daha fazla bilgi edinmek için sonraki öğreticiye ilerleyin