Bu modülde içerik öneri modelini eğitmek için yerleşik Amazon SageMaker k-En Yakın Komşular (k-NN) Algoritmasını kullanacaksınız.

Amazon SageMaker K-En Yakın Komşular (k-NN), sınıflandırma ve regresyon görevleri için kullanılabilen, parametrik olmayan, dizin tabanlı, denetlenen bir öğrenme algoritmasıdır. Sınıflandırma için algoritma, k en yakın puanlarını hedefe sorgular ve tahmini etiket olarak sınıflarının en sık kullanılan etiketini verir. Regresyon sorunları için algoritma k en yakın komşuların verdiği tahmini değerlerin ortalamasını verir.

k-NN algoritması ile eğitim üç adımda uygulanır: örnekleme, boyut azaltma ve dizin oluşturma. Örnekleme, başlangıç veri kümesinin boyutunu azaltarak onun belleğe sığmasını sağlar. Boyut azaltma için algoritma bellek ve çıkarsama gecikmesinin ayak izinin azalması için k-NN modelinin verilerin özellik boyutunu düşürür. İki tür boyut azaltma yöntemi sağlıyoruz: rastgele yansıtma ve hızlı Johnson-Lindenstrauss dönüşümü. Genellikle boyut düzeyi arttıkça seyrekleşen istatistiksel veri analizinde sorun çıkaran “boyut düzeyi laneti”nden kaçınmak için yüksek boyutlu (d >1000) veri kümeleri için boyut azaltmayı kullanırsınız. K-NN eğitiminin ana amacı dizin oluşturmaktır. Dizin, değerleri veya sınıf etiketleri henüz belirlenmemiş puanlar arasındaki uzaklıkların etkili aranmasını ve k en yakın puanların çıkarsama için kullanılmasını sağlar.

Aşağıdaki adımlarda eğitim işi için k-NN algoritmanızı belirtecek, modeli ayarlamak için hiper parametre değerlerini ayarlayacak ve modeli çalıştıracaksınız. Daha sonra tahmin yürütmesi için modeli Amazon SageMaker tarafından yönetilen uç noktaya dağıtacaksınız.

Modülü Tamamlama Süresi: 20 Dakika


  • 1. Adım. Eğitim işini oluşturun ve çalıştırın

    Önceki modülde konu vektörlerini oluşturdunuz. Bu modülde konu vektörlerinin dizinini koruyan bir içerik öneri modülünü oluşturacak ve dağıtacaksınız.

    Öncelikle, karıştırılmış etiketleri eğitim verilerindeki asıl etiketlere bağlayan bir sözlük oluşturun. Not defterinizde aşağıdaki kodu kopyalayıp yapıştırın ve Çalıştır ögesini seçin.

    labels = newidx 
    labeldict = dict(zip(newidx,idx))

    Sonra aşağıdaki kodu kullanarak eğitim verilerini S3 klasörünüzde depolayın:

    import io
    import sagemaker.amazon.common as smac
    
    
    print('train_features shape = ', predictions.shape)
    print('train_labels shape = ', labels.shape)
    buf = io.BytesIO()
    smac.write_numpy_to_dense_tensor(buf, predictions, labels)
    buf.seek(0)
    
    bucket = BUCKET
    prefix = PREFIX
    key = 'knn/train'
    fname = os.path.join(prefix, key)
    print(fname)
    boto3.resource('s3').Bucket(bucket).Object(fname).upload_fileobj(buf)
    s3_train_data = 's3://{}/{}/{}'.format(bucket, prefix, key)
    print('uploaded training data location: {}'.format(s3_train_data))
    

    Daha sonra 3. Modül’de oluşturduğunuz NTM tahmin aracı gibi bir k-NN tahmin aracı oluşturmak üzere aşağıdaki yardımcı işlevi kullanın.

    def trained_estimator_from_hyperparams(s3_train_data, hyperparams, output_path, s3_test_data=None):
        """
        Create an Estimator from the given hyperparams, fit to training data, 
        and return a deployed predictor
        
        """
        # set up the estimator
        knn = sagemaker.estimator.Estimator(get_image_uri(boto3.Session().region_name, "knn"),
            get_execution_role(),
            train_instance_count=1,
            train_instance_type='ml.c4.xlarge',
            output_path=output_path,
            sagemaker_session=sagemaker.Session())
        knn.set_hyperparameters(**hyperparams)
        
        # train a model. fit_input contains the locations of the train and test data
        fit_input = {'train': s3_train_data}
        knn.fit(fit_input)
        return knn
    
    hyperparams = {
        'feature_dim': predictions.shape[1],
        'k': NUM_NEIGHBORS,
        'sample_size': predictions.shape[0],
        'predictor_type': 'classifier' ,
        'index_metric':'COSINE'
    }
    output_path = 's3://' + bucket + '/' + prefix + '/knn/output'
    knn_estimator = trained_estimator_from_hyperparams(s3_train_data, hyperparams, output_path)
    

    Eğitim işleri çalışırken yardımcı işlevindeki parametrelere yakından bakın.

    Amazon SageMaker k-NN algoritması en yakın komşuları hesaplayacak birçok farklı mesafe ölçümü sunar. Popüler ölçümlerden bir tanesi doğal dil işlemede kullanılan kosinüs uzaklığıdır. Matematiksel olarak iki A ve B vektörünün arasındaki “benzerlik” aşağıdaki denklemle verilir:

    index_metric ögesini COSINE olarak ayarlamak Amazon SageMaker’ın otomatik olarak kosinüs benzerliğini en yakın komşular işlemi için kullanmasını sağlar. Varsayılan mesafe standart Öklit mesafesi olan L2 norm’udur. Yayımlamada COSINE ögesinin yalnızca faiss.IVFFlat dizin türünü desteklediğini ve faiss.IVFPQ dizine ekleme yöntemini desteklemediğini unutmayın.

    Terminalinizde aşağıdaki çıktıları görmeniz gerekir.

    Completed - Training job completed

    Başardınız! Bu modelin belirli bir test konusunda en yakın komşuları vermesini istediğiniz için bunu canlı barındırılan bir uç nokta olarak dağıtmanız gerekir.

  • 2. Adım. İçerik öneri modelini dağıtın

    NTM modelinde yaptığınız gibi uç noktayı başlatmak için aşağıdaki k-NN modeline uygun yardımcı işlevi tanımlayın. Yardımcı işlevde kabul etme belirteci applications/jsonlines; verbose=true k-NN modeline yalnızca en yakın komşu yerine tüm kosinüs mesafelerini vermesini söyler. Bir öneri altyapısı oluşturmak için model tarafından yapılan en iyi k önerilerini almanız gerekir; bunun için de verbose parametresini varsayılan olan yanlış yerine doğruolarak ayarlamanız gerekir.

    Aşağıdaki kodu kopyalayıp not defterinize yapıştırın ve Çalıştır ögesini seçin.

    def predictor_from_estimator(knn_estimator, estimator_name, instance_type, endpoint_name=None): 
        knn_predictor = knn_estimator.deploy(initial_instance_count=1, instance_type=instance_type,
                                            endpoint_name=endpoint_name,
                                            accept="application/jsonlines; verbose=true")
        knn_predictor.content_type = 'text/csv'
        knn_predictor.serializer = csv_serializer
        knn_predictor.deserializer = json_deserializer
        return knn_predictor
    import time
    
    instance_type = 'ml.m4.xlarge'
    model_name = 'knn_%s'% instance_type
    endpoint_name = 'knn-ml-m4-xlarge-%s'% (str(time.time()).replace('.','-'))
    print('setting up the endpoint..')
    knn_predictor = predictor_from_estimator(knn_estimator, model_name, instance_type, endpoint_name=endpoint_name)

    Sonra, çıkarsamaları çalıştırabilmeniz için test verilerini önceden işleyin.

    Aşağıdaki kodu kopyalayıp not defterinize yapıştırın ve Çalıştır ögesini seçin.

    def preprocess_input(text):
        text = strip_newsgroup_header(text)
        text = strip_newsgroup_quoting(text)
        text = strip_newsgroup_footer(text)
        return text    
        
    test_data_prep = []
    for i in range(len(newsgroups_test)):
        test_data_prep.append(preprocess_input(newsgroups_test[i]))
    test_vectors = vectorizer.fit_transform(test_data_prep)
    
    test_vectors = np.array(test_vectors.todense())
    test_topics = []
    for vec in test_vectors:
        test_result = ntm_predictor.predict(vec)
        test_topics.append(test_result['predictions'][0]['topic_weights'])
    
    topic_predictions = []
    for topic in test_topics:
        result = knn_predictor.predict(topic)
        cur_predictions = np.array([int(result['labels'][i]) for i in range(len(result['labels']))])
        topic_predictions.append(cur_predictions[::-1][:10])       
    

    Bu modülün son adımında içerik öneri modelini keşfedin.

  • 3. Adım. İçerik öneri modelini keşfedin

    Artık tahminleri aldığınız için k-NN modelinin önerdiği en yakınk konularına kıyasla test konularının konu dağıtımlarını belirleyebilirsiniz.

    Aşağıdaki kodu kopyalayıp not defterinize yapıştırın ve Çalıştır ögesini seçin.

    # set your own k.
    def plot_topic_distribution(topic_num, k = 5):
        
        closest_topics = [predictions[labeldict[x]] for x in topic_predictions[topic_num][:k]]
        closest_topics.append(np.array(test_topics[topic_num]))
        closest_topics = np.array(closest_topics)
        df = pd.DataFrame(closest_topics.T)
        df.rename(columns ={k:"Test Document Distribution"}, inplace=True)
        fs = 12
        df.plot(kind='bar', figsize=(16,4), fontsize=fs)
        plt.ylabel('Topic assignment', fontsize=fs+2)
        plt.xlabel('Topic ID', fontsize=fs+2)
        plt.show()
    

    Konu dağıtımını belirlemek için aşağıdaki kodu çalıştırın:

    plot_topic_distribution(18)
    

    Şimdi bazı diğer konuları deneyin. Aşağıdaki kod hücrelerini çalıştırın:

    plot_topic_distribution(25)
    plot_topic_distribution(5000)

    Belirlemeleriniz seçtiğiniz konu sayısına (NUM_TOPICS) göre biraz farklı görünebilir. Ama genel olarak bu belirlemeleriniz k-NN modeli tarafından Kosinüs benzerliğini kullanarak bulunan en yakın komşu belgelerinin konu dağıtımı bu modele aktardığımız test belgesi konu dağıtımına benzerdir.

    Sonuçlar k-NN’nin öncelikle belgelerin konu vektörlerine gömerek semantik bir bilgi tabanlı alım sistemini oluşturmak ve daha sonra bir k-NN modelini önerilere sunmak için iyi bir yol olabilir.


Tebrikler! Bu modülde içerik öneri modelinizi eğittiniz, dağıttınız ve keşfettiniz.

Bir sonraki modülde bu laboratuvarda kullandığınız kaynakları temizleyeceksiniz.