Öğ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:
Ö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
"MovieRecommender" adlı bir C# Konsol Uygulaması oluşturun. İleri düğmesine tıklayın.
Kullanılacak çerçeve olarak .NET 6'yı seçin. Oluştur düğmesine tıklayın.
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.
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.
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
İ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.
Çö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.
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:
*.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
, movieId
ve timestamp
tüm Features
sütunları tahmin etmek için Label
kullanılır.
Özellikler | Etiketle |
---|---|
userId |
rating |
movieId |
|
timestamp |
tahmin etmek için Label
hangilerinin Features
kullanılacağına karar vermek size bağlı. En iyi Features
seç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:
Çözüm Gezgini'da projeye sağ tıklayın ve ardından Yeni Öğe Ekle'yi >seçin.
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 Label
etmek 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 MovieRatingPrediction
oluş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 IDataView
dö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"));
userId
movieId
Gerçek değerleri değil kullanıcıları ve film başlıklarını temsil ettiğinden, mapValueToKey() yöntemini kullanarak her userId
movieId
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 Transformer
eğ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 PredictionEnginePool
PredictionEngine
tamamında kullanmak üzere bir ObjectPool
nesne oluşturan hizmetini kullanın. ASP.NET Core Web API'sinde kullanma PredictionEnginePool
hakkı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 id
ve 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 Factorization
NumberOfIterations 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
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin