Azure HDInsight'ta Apache Mahout kullanarak öneriler oluşturma

Film önerileri oluşturmak için Azure HDInsight ile Apache Mahout makine öğrenmesi kitaplığını kullanmayı öğrenin.

Mahout, Apache Hadoop için bir makine öğrenmesi kitaplığıdır. Mahout filtreleme, sınıflandırma ve kümeleme gibi verileri işlemek için algoritmalar içerir. Bu makalede, arkadaşlarınızın gördüğü filmleri temel alan film önerileri oluşturmak için bir öneri altyapısı kullanırsınız.

Önkoşullar

HDInsight üzerinde bir Apache Hadoop kümesi. Bkz . Linux'ta HDInsight'ı kullanmaya başlama.

Önerileri anlama

Mahout tarafından sağlanan işlevlerden biri bir öneri altyapısıdır. Bu altyapı, , itemIdve prefValue (öğenin tercihi) biçimindeki userIDverileri kabul eder. Mahout daha sonra bir öğe için tercihi olan kullanıcıların da bu diğer öğeler için tercihi olduğunu belirlemek için birlikte oluşum analizi gerçekleştirebilir. Daha sonra Mahout, öneride bulunmak için kullanılabilecek like-item tercihlerine sahip kullanıcıları belirler.

Aşağıdaki iş akışı, film verilerini kullanan basitleştirilmiş bir örnektir:

  • Birlikte oluşum: Joe, Alice ve Bob'un hepsi Star Wars, The Empire Strikes Back ve Return of the Jedi'i beğendiler. Mahout, bu filmlerden herhangi birini beğenen kullanıcıların da diğer ikisi gibi olduğunu belirler.

  • Birlikte oluşum: Bob ve Alice ayrıca The Phantom Menace, Attack of the Clones ve Revenge of the Sith'i de beğendiler. Mahout, önceki üç filmi beğenen kullanıcıların da bu üç filmi beğendiğini belirler.

  • Benzerlik önerisi: Joe ilk üç filmi beğendiğinden, Mahout benzer tercihlere sahip olan diğer kişilerin beğendiği ama Joe'nun izlemediği (beğenilen/derecelendirilen) filmlere bakar. Bu durumda Mahout, Hayalet Tehdit, Klonların Saldırısı ve Sith'in İntikamı'nı önerir.

Verileri anlama

GroupLens Research, filmler için Mahout ile uyumlu bir biçimde derecelendirme verileri sağlar. Bu veriler, kümenizin konumundaki varsayılan depolamada /HdiSamples/HdiSamples/MahoutMovieDatakullanılabilir.

İki dosya moviedb.txt vardır ve user-ratings.txt. Dosya user-ratings.txt analiz sırasında kullanılır. moviedb.txt, sonuçları görüntülerken kullanıcı dostu metin bilgileri sağlamak için kullanılır.

içinde user-ratings.txt yer alan veriler, her kullanıcının bir filmi ne kadar yüksek derecelendirdiğini gösteren , movieIDuserRating, ve timestampşeklinde bir yapıya userIDsahiptir. Veri örneği aşağıda verilmiştir:

    196    242    3    881250949
    186    302    3    891717742
    22     377    1    878887116
    244    51     2    880606923
    166    346    1    886397596

Analizi çalıştırma

  1. Kümenize bağlanmak için ssh komutunu kullanın. CLUSTERNAME değerini kümenizin adıyla değiştirip komutunu girerek aşağıdaki komutu düzenleyin:

    ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
    
  2. Öneri işini çalıştırmak için aşağıdaki komutu kullanın:

    mahout recommenditembased -s SIMILARITY_COOCCURRENCE -i /HdiSamples/HdiSamples/MahoutMovieData/user-ratings.txt -o /example/data/mahoutout --tempDir /temp/mahouttemp
    

Dekont

İşin tamamlanması birkaç dakika sürebilir ve birden çok MapReduce işi çalıştırabilir.

Çıkışı görüntüleme

  1. İş tamamlandıktan sonra, oluşturulan çıkışı görüntülemek için aşağıdaki komutu kullanın:

    hdfs dfs -text /example/data/mahoutout/part-r-00000
    

    Çıkış aşağıdaki gibi görünür:

    1    [234:5.0,347:5.0,237:5.0,47:5.0,282:5.0,275:5.0,88:5.0,515:5.0,514:5.0,121:5.0]
    2    [282:5.0,210:5.0,237:5.0,234:5.0,347:5.0,121:5.0,258:5.0,515:5.0,462:5.0,79:5.0]
    3    [284:5.0,285:4.828125,508:4.7543354,845:4.75,319:4.705128,124:4.7045455,150:4.6938777,311:4.6769233,248:4.65625,272:4.649266]
    4    [690:5.0,12:5.0,234:5.0,275:5.0,121:5.0,255:5.0,237:5.0,895:5.0,282:5.0,117:5.0]
    

    İlk sütun şeklindedir userID. '[' ve ']' içinde yer alan değerler:movieIdrecommendationScore

  2. Öneriler hakkında daha fazla bilgi sağlamak için çıktıyı moviedb.txt dosyasıyla birlikte kullanabilirsiniz. İlk olarak, aşağıdaki komutları kullanarak dosyaları yerel olarak kopyalayın:

    hdfs dfs -get /example/data/mahoutout/part-r-00000 recommendations.txt
    hdfs dfs -get /HdiSamples/HdiSamples/MahoutMovieData/* .
    

    Bu komut, çıkış verilerini film veri dosyalarıyla birlikte geçerli dizindeki recommendations.txt adlı bir dosyaya kopyalar.

  3. Öneriler çıktısındaki veriler için film adlarının aranacağı bir Python betiği oluşturmak için aşağıdaki komutu kullanın:

    nano show_recommendations.py
    

    Düzenleyici açıldığında, dosyanın içeriği olarak aşağıdaki metni kullanın:

    #!/usr/bin/env python
    
    import sys
    
    if len(sys.argv) != 5:
         print "Arguments: userId userDataFilename movieFilename recommendationFilename"
         sys.exit(1)
    
    userId, userDataFilename, movieFilename, recommendationFilename = sys.argv[1:]
    
    print "Reading Movies Descriptions"
    movieFile = open(movieFilename)
    movieById = {}
    for line in movieFile:
        tokens = line.split("|")
        movieById[tokens[0]] = tokens[1:]
    movieFile.close()
    
    print "Reading Rated Movies"
    userDataFile = open(userDataFilename)
    ratedMovieIds = []
    for line in userDataFile:
        tokens = line.split("\t")
        if tokens[0] == userId:
            ratedMovieIds.append((tokens[1],tokens[2]))
    userDataFile.close()
    
    print "Reading Recommendations"
    recommendationFile = open(recommendationFilename)
    recommendations = []
    for line in recommendationFile:
        tokens = line.split("\t")
        if tokens[0] == userId:
            movieIdAndScores = tokens[1].strip("[]\n").split(",")
            recommendations = [ movieIdAndScore.split(":") for movieIdAndScore in movieIdAndScores ]
            break
    recommendationFile.close()
    
    print "Rated Movies"
    print "------------------------"
    for movieId, rating in ratedMovieIds:
        print "%s, rating=%s" % (movieById[movieId][0], rating)
    print "------------------------"
    
    print "Recommended Movies"
    print "------------------------"
    for movieId, score in recommendations:
        print "%s, score=%s" % (movieById[movieId][0], score)
    print "------------------------"
    

    Verileri kaydetmek için Ctrl-X, Y ve son olarak Enter tuşlarına basın.

  4. Python betiğini çalıştırın. Aşağıdaki komut, tüm dosyaların indirildiği dizinde olduğunuzu varsayar:

    python show_recommendations.py 4 user-ratings.txt moviedb.txt recommendations.txt
    

    Bu komut, 4. kullanıcı kimliği için oluşturulan önerilere bakar.

    • user-ratings.txt dosyası derecelendirilmiş filmleri almak için kullanılır.

    • Moviedb.txt dosyası, filmlerin adlarını almak için kullanılır.

    • recommendations.txt, bu kullanıcının film önerilerini almak için kullanılır.

      Bu komutun çıktısı aşağıdaki metne benzer:

      Seven Years in Tibet (1997), score=5.0
      Indiana Jones and the Last Crusade (1989), score=5.0
      Jaws (1975), score=5.0
      Sense and Sensibility (1995), score=5.0
      Independence Day (ID4) (1996), score=5.0
      My Best Friend's Wedding (1997), score=5.0
      Jerry Maguire (1996), score=5.0
      Scream 2 (1997), score=5.0
      Time to Kill, A (1996), score=5.0
      

Geçici verileri silme

Mahout işleri, iş işlenirken oluşturulan geçici verileri kaldırmaz. parametresi --tempDir , kolay silme için geçici dosyaları belirli bir yola yalıtmak için örnek işte belirtilir. Geçici dosyaları kaldırmak için aşağıdaki komutu kullanın:

hdfs dfs -rm -f -r /temp/mahouttemp

Uyarı

Komutu yeniden çalıştırmak istiyorsanız çıkış dizinini de silmeniz gerekir. Bu dizini silmek için aşağıdakileri kullanın:

hdfs dfs -rm -f -r /example/data/mahoutout

Sonraki adımlar

Mahout'u kullanmayı öğrendiğinize göre HDInsight'ta verilerle çalışmanın diğer yollarını keşfedin: