Aracılığıyla paylaş


Öğretici: Metin sınıflandırma modeli oluşturma, değerlendirme ve puanlama

Bu öğretici, Microsoft Fabric'te bir metin sınıflandırma modeli için Synapse Veri Bilimi iş akışının uçtan uca bir örneğini sunar. Senaryo, Yalnızca kitabın başlığına dayalı olarak, İngiliz Kitaplığı kitap veri kümesinden bir kitabın türünü belirlemek için Spark'ta word2vec ve lojistik regresyon kullanır.

Bu öğretici şu adımları kapsar:

  • Özel kitaplıkları yükleme
  • Verileri yükleme
  • Keşif veri analizi ile verileri anlama ve işleme
  • Word2vec ve lojistik regresyon ile makine öğrenmesi modeli eğitme ve MLflow ve Doku otomatik kaydetme özelliği ile denemeleri izleme
  • Puanlama ve tahminler için makine öğrenmesi modelini yükleme

Önkoşullar

Not defterinde birlikte izleme

Not defterinde izleyebileceğiniz şu seçeneklerden birini belirleyebilirsiniz:

  • Synapse Veri Bilimi deneyiminde yerleşik not defterini açma ve çalıştırma
  • Not defterinizi GitHub'dan Synapse Veri Bilimi deneyimine yükleme

Yerleşik not defterini açma

Bu öğreticiye örnek Başlık türü sınıflandırma not defteri eşlik eder.

Synapse Veri Bilimi deneyiminde öğreticinin yerleşik örnek not defterini açmak için:

  1. Synapse Veri Bilimi giriş sayfasına gidin.

  2. Örnek kullan'ı seçin.

  3. İlgili örneği seçin:

    • Örnek bir Python öğreticisi içinse varsayılan uçtan uca iş akışları (Python) sekmesinden.
    • Örnek bir R öğreticisi içinse Uçtan uca iş akışları (R) sekmesinden.
    • Örnek hızlı bir öğretici içinse Hızlı öğreticiler sekmesinden.
  4. Kod çalıştırmaya başlamadan önce not defterine bir lakehouse ekleyin.

Not defterini GitHub'dan içeri aktarma

AIsample - Title Genre Classification.ipynb , bu öğreticiye eşlik eden not defteridir.

Bu öğreticide eşlik eden not defterini açmak için, not defterini çalışma alanınıza aktarmak üzere Sisteminizi veri bilimi öğreticilerine hazırlama başlığındaki yönergeleri izleyin.

Bu sayfadaki kodu kopyalayıp yapıştırmayı tercih ederseniz, yeni bir not defteri oluşturabilirsiniz.

Kod çalıştırmaya başlamadan önce not defterine bir göl evi eklediğinizden emin olun.

1. Adım: Özel kitaplıkları yükleme

Makine öğrenmesi modeli geliştirme veya geçici veri analizi için Apache Spark oturumunuz için hızlı bir şekilde özel bir kitaplık yüklemeniz gerekebilir. Kitaplıkları yüklemek için iki seçeneğiniz vardır.

  • Yalnızca geçerli not defterinizde bir kitaplık yüklemek için not defterinizin satır içi yükleme özelliklerini (%pip veya %conda) kullanın.
  • Alternatif olarak, bir Doku ortamı oluşturabilir, ortak kaynaklardan kitaplıklar yükleyebilir veya özel kitaplıklar yükleyebilirsiniz ve çalışma alanı yöneticiniz ortamı çalışma alanı için varsayılan olarak ekleyebilir. Daha sonra ortamdaki tüm kitaplıklar çalışma alanındaki tüm not defterlerinde ve Spark iş tanımlarında kullanılabilir hale gelir. Ortamlar hakkında daha fazla bilgi için bkz . Microsoft Fabric'te ortam oluşturma, yapılandırma ve kullanma.

Sınıflandırma modeli için, bir sözcüğün boyutunun wordcloud sıklığını temsil ettiği metindeki sözcük sıklığını göstermek için kitaplığını kullanın. Bu öğreticide, not defterinize yüklemek wordcloud için kullanın%pip install.

Not

PySpark çekirdeği çalıştırıldıktan sonra %pip install yeniden başlatılır. Diğer hücreleri çalıştırmadan önce gerekli kitaplıkları yükleyin.

# Install wordcloud for text visualization by using pip
%pip install wordcloud

2. Adım: Verileri yükleme

Veri kümesinde, kitaplık ile Microsoft arasındaki işbirliğinin dijital ortama aktardığı İngiliz Kitaplığı kitaplarıyla ilgili meta veriler bulunur. Meta veriler, bir kitabın kurgu mu yoksa kurgusal mı olduğunu gösteren sınıflandırma bilgileridir. Bu veri kümesiyle amaç, bir kitabın türünü yalnızca başlığına göre belirleyen bir sınıflandırma modeli eğitmektir.

BL kayıt kimliği Kaynak türü Veri Akışı Adı Adla ilişkili tarihler Ad türü Role Tüm adlar Başlık Varyant başlıkları Seri başlığı Seri içindeki sayı Yayın ülkesi Yayın yeri Publisher Yayın tarihi Edition Fiziksel açıklama Dewey sınıflandırması BL raf işareti Konular Tür Diller Notlar Fiziksel kaynak için BL kayıt kimliği classification_id user_id created_at subject_ids annotator_date_pub annotator_normalised_date_pub annotator_edition_statement annotator_genre annotator_FAST_genre_terms annotator_FAST_subject_terms annotator_comments annotator_main_language annotator_other_languages_summaries annotator_summaries_language annotator_translation annotator_original_language annotator_publisher annotator_place_pub annotator_country annotator_title Dijitalleştirilmiş kitap bağlantısı Açıklamalı
014602826 Monografi Yearsley, Ann 1753-1806 kişi Daha fazlası, Hannah, 1745-1833 [kişi]; Yearsley, Ann, 1753-1806 [kişi] Çeşitli durumlarda şiirler [Hannah More'un ön mektubuyla.] Ingiltere Londra 1786 Dördüncü sürüm EL YAZMASI notu Dijital Mağaza 11644.d.32 İngilizce 003996603 False
014602830 Monografi A, T. kişi Oldham, John, 1653-1683 [kişi]; A, T. [kişi] Vertue'ya karşı bir Satyr. (Bir şiir: Bir Town-Hector tarafından konuşulması gerekiyordu [John Oldham tarafından. Önsöz imzalı: T. A.]) Ingiltere Londra 1679 15 sayfa (4°) Digital Store 11602.ee.10. (2.) İngilizce 000001143 False

Bu not defterini farklı veri kümelerine uygulayabilmek için aşağıdaki parametreleri tanımlayın:

IS_CUSTOM_DATA = False  # If True, the user must manually upload the dataset
DATA_FOLDER = "Files/title-genre-classification"
DATA_FILE = "blbooksgenre.csv"

# Data schema
TEXT_COL = "Title"
LABEL_COL = "annotator_genre"
LABELS = ["Fiction", "Non-fiction"]

EXPERIMENT_NAME = "sample-aisample-textclassification"  # MLflow experiment name

Veri kümesini indirin ve lakehouse'a yükleyin

Bu kod, veri kümesinin genel kullanıma açık bir sürümünü indirir ve bir Fabric lakehouse'da depolar.

Önemli

Çalıştırmadan önce not defterine bir göl evi ekleyin. Bunun yapılmaması hataya neden olur.

if not IS_CUSTOM_DATA:
    # Download demo data files into the lakehouse, if they don't exist
    import os, requests

    remote_url = "https://synapseaisolutionsa.blob.core.windows.net/public/Title_Genre_Classification"
    fname = "blbooksgenre.csv"
    download_path = f"/lakehouse/default/{DATA_FOLDER}/raw"

    if not os.path.exists("/lakehouse/default"):
        # Add a lakehouse, if no default lakehouse was added to the notebook
        # A new notebook won't link to any lakehouse by default
        raise FileNotFoundError(
            "Default lakehouse not found, please add a lakehouse and restart the session."
        )
    os.makedirs(download_path, exist_ok=True)
    if not os.path.exists(f"{download_path}/{fname}"):
        r = requests.get(f"{remote_url}/{fname}", timeout=30)
        with open(f"{download_path}/{fname}", "wb") as f:
            f.write(r.content)
    print("Downloaded demo data files into lakehouse.")

Gerekli kitaplıkları içeri aktarma

Herhangi bir işlemden önce Spark ve SynapseML kitaplıkları da dahil olmak üzere gerekli kitaplıkları içeri aktarmanız gerekir:

import numpy as np
from itertools import chain

from wordcloud import WordCloud
import matplotlib.pyplot as plt
import seaborn as sns

import pyspark.sql.functions as F

from pyspark.ml import Pipeline
from pyspark.ml.feature import *
from pyspark.ml.tuning import CrossValidator, ParamGridBuilder
from pyspark.ml.classification import LogisticRegression
from pyspark.ml.evaluation import (
    BinaryClassificationEvaluator,
    MulticlassClassificationEvaluator,
)

from synapse.ml.stages import ClassBalancer
from synapse.ml.train import ComputeModelStatistics

import mlflow

Hiper parametreleri tanımlama

Model eğitimi için bazı hiper parametreler tanımlayın.

Önemli

Bu hiper parametreleri yalnızca her parametreyi anladığınızda değiştirin.

# Hyperparameters 
word2vec_size = 128  # The length of the vector for each word
min_word_count = 3  # The minimum number of times that a word must appear to be considered
max_iter = 10  # The maximum number of training iterations
k_folds = 3  # The number of folds for cross-validation

Bu not defterini çalıştırmak için gereken süreyi kaydetmeye başlayın:

# Record the notebook running time
import time

ts = time.time()

MLflow deneme izlemesini ayarlama

Otomatik kaydetme, MLflow günlük özelliklerini genişletir. Otomatik kaydetme, bir makine öğrenmesi modelini eğittikçe giriş parametresi değerlerini ve çıkış ölçümlerini otomatik olarak yakalar. Ardından bu bilgileri çalışma alanına günlüğe kaydedersiniz. Çalışma alanında, çalışma alanında MLflow API'leriyle veya ilgili denemeyle bilgilere erişebilir ve bunları görselleştirebilirsiniz. Otomatik kaydetme hakkında daha fazla bilgi edinmek için bkz . Microsoft Fabric'te otomatik kaydetme.

# Set up Mlflow for experiment tracking

mlflow.set_experiment(EXPERIMENT_NAME)
mlflow.autolog(disable=True)  # Disable Mlflow autologging

Not defteri oturumunda Microsoft Fabric otomatik kaydetmeyi devre dışı bırakmak için öğesini çağırın mlflow.autolog() ve ayarlayın disable=True:

Göl evinden ham tarih verilerini okuma

raw_df = spark.read.csv(f"{DATA_FOLDER}/raw/{DATA_FILE}", header=True, inferSchema=True)

3. Adım: Keşif veri analizi gerçekleştirme

Veri kümesinin display üst düzey istatistiklerini görüntülemek ve grafik görünümlerini göstermek için komutunu kullanarak veri kümesini keşfedin:

display(raw_df.limit(20))

Verileri hazırlama

Yinelenenleri kaldırarak verileri temizleyin:

df = (
    raw_df.select([TEXT_COL, LABEL_COL])
    .where(F.col(LABEL_COL).isin(LABELS))
    .dropDuplicates([TEXT_COL])
    .cache()
)

display(df.limit(20))

Herhangi bir sapmayı ele almak için sınıf dengelemesi uygulayın:

# Create a ClassBalancer instance, and set the input column to LABEL_COL
cb = ClassBalancer().setInputCol(LABEL_COL)

# Fit the ClassBalancer instance to the input DataFrame, and transform the DataFrame
df = cb.fit(df).transform(df)

# Display the first 20 rows of the transformed DataFrame
display(df.limit(20))

Veri kümesini belirteç haline getirmek için paragrafları ve tümceleri daha küçük birimlere bölün. Bu şekilde anlam atamak daha kolay hale gelir. Ardından, performansı geliştirmek için stopword'leri kaldırın. Stopword kaldırma, korpustaki tüm belgelerde yaygın olarak ortaya çıkan sözcüklerin kaldırılmasını içerir. Stopword kaldırma, doğal dil işleme (NLP) uygulamalarında en yaygın olarak kullanılan ön işleme adımlarından biridir.

# Text transformer
tokenizer = Tokenizer(inputCol=TEXT_COL, outputCol="tokens")
stopwords_remover = StopWordsRemover(inputCol="tokens", outputCol="filtered_tokens")

# Build the pipeline
pipeline = Pipeline(stages=[tokenizer, stopwords_remover])

token_df = pipeline.fit(df).transform(df)

display(token_df.limit(20))

Her sınıf için wordcloud kitaplığını görüntüleyin. Wordcloud kitaplığı, metin verilerinde sıklıkla görünen anahtar sözcüklerin görsel olarak göze çarpan bir sunumudur. Wordcloud kitaplığı etkilidir çünkü anahtar sözcüklerin işlenmesi, ana metin verilerini bir bakışta daha iyi yakalamak için bulut gibi bir renk resmi oluşturur. wordcloud hakkında daha fazla bilgi edinin.

# WordCloud
for label in LABELS:
    tokens = (
        token_df.where(F.col(LABEL_COL) == label)
        .select(F.explode("filtered_tokens").alias("token"))
        .where(F.col("token").rlike(r"^\w+$"))
    )

    top50_tokens = (
        tokens.groupBy("token").count().orderBy(F.desc("count")).limit(50).collect()
    )

    # Generate a wordcloud image
    wordcloud = WordCloud(
        scale=10,
        background_color="white",
        random_state=42,  # Make sure the output is always the same for the same input
    ).generate_from_frequencies(dict(top50_tokens))

    # Display the generated image by using matplotlib
    plt.figure(figsize=(10, 10))
    plt.title(label, fontsize=20)
    plt.axis("off")
    plt.imshow(wordcloud, interpolation="bilinear")

Son olarak, metni vektörleştirmek için word2vec kullanın. word2vec tekniği, metindeki her sözcüğün vektör gösterimini oluşturur. Benzer bağlamlarda kullanılan veya anlamsal ilişkileri olan sözcükler, vektör uzayına yakınlıkları aracılığıyla etkili bir şekilde yakalanır. Bu yakınlık, benzer sözcüklerin benzer sözcük vektörlerine sahip olduğunu gösterir.

# Label transformer
label_indexer = StringIndexer(inputCol=LABEL_COL, outputCol="labelIdx")
vectorizer = Word2Vec(
    vectorSize=word2vec_size,
    minCount=min_word_count,
    inputCol="filtered_tokens",
    outputCol="features",
)

# Build the pipeline
pipeline = Pipeline(stages=[label_indexer, vectorizer])
vec_df = (
    pipeline.fit(token_df)
    .transform(token_df)
    .select([TEXT_COL, LABEL_COL, "features", "labelIdx", "weight"])
)

display(vec_df.limit(20))

4. Adım: Modeli eğitme ve değerlendirme

Veriler yerine yerleştirildiyse modeli tanımlayın. Bu bölümde, vektörleştirilmiş metni sınıflandırmak için lojistik regresyon modelini eğitmiş olacaksınız.

Eğitim ve test veri kümelerini hazırlama

# Split the dataset into training and testing
(train_df, test_df) = vec_df.randomSplit((0.8, 0.2), seed=42)

Makine öğrenmesi denemelerini izleme

Makine öğrenmesi denemesi, tüm ilgili makine öğrenmesi çalıştırmaları için birincil kuruluş ve denetim birimidir. Çalıştırma, model kodunun tek bir yürütülmesine karşılık gelir.

Makine öğrenmesi denemesi izleme, parametreler, ölçümler, modeller ve diğer yapıtlar gibi tüm denemeleri ve bileşenlerini yönetir. İzleme, belirli bir makine öğrenmesi denemesinin tüm gerekli bileşenlerinin düzenlenmesini sağlar. Ayrıca kaydedilen denemelerle geçmiş sonuçların kolayca çoğaltılmasına da olanak tanır. Microsoft Fabric'te makine öğrenmesi denemeleri hakkında daha fazla bilgi edinin.

# Build the logistic regression classifier
lr = (
    LogisticRegression()
    .setMaxIter(max_iter)
    .setFeaturesCol("features")
    .setLabelCol("labelIdx")
    .setWeightCol("weight")
)

Hiperparametreleri ayarlama

Hiper parametreler üzerinde arama yapmak için bir parametre kılavuzu oluşturun. Ardından bir model oluşturmak CrossValidator için bir çapraz değerlendirici tahmin aracı oluşturun:

# Build a grid search to select the best values for the training parameters
param_grid = (
    ParamGridBuilder()
    .addGrid(lr.regParam, [0.03, 0.1])
    .addGrid(lr.elasticNetParam, [0.0, 0.1])
    .build()
)

if len(LABELS) > 2:
    evaluator_cls = MulticlassClassificationEvaluator
    evaluator_metrics = ["f1", "accuracy"]
else:
    evaluator_cls = BinaryClassificationEvaluator
    evaluator_metrics = ["areaUnderROC", "areaUnderPR"]
evaluator = evaluator_cls(labelCol="labelIdx", weightCol="weight")

# Build a cross-evaluator estimator
crossval = CrossValidator(
    estimator=lr,
    estimatorParamMaps=param_grid,
    evaluator=evaluator,
    numFolds=k_folds,
    collectSubModels=True,
)

Modeli değerlendirme

Test veri kümesindeki modelleri karşılaştırarak değerlendirebiliriz. İyi eğitilmiş bir model, doğrulama ve test veri kümelerinde çalıştırıldığında ilgili ölçümlerde yüksek performans göstermelidir.

def evaluate(model, df):
    log_metric = {}
    prediction = model.transform(df)
    for metric in evaluator_metrics:
        value = evaluator.evaluate(prediction, {evaluator.metricName: metric})
        log_metric[metric] = value
        print(f"{metric}: {value:.4f}")
    return prediction, log_metric

MLflow kullanarak denemeleri izleme

Eğitim ve değerlendirme sürecini başlatın. Tüm denemeleri ve günlük parametrelerini, ölçümleri ve modelleri izlemek için MLflow kullanın. Tüm bu bilgiler çalışma alanında deneme adı altında günlüğe kaydedilir.

with mlflow.start_run(run_name="lr"):
    models = crossval.fit(train_df)
    best_metrics = {k: 0 for k in evaluator_metrics}
    best_index = 0
    for idx, model in enumerate(models.subModels[0]):
        with mlflow.start_run(nested=True, run_name=f"lr_{idx}") as run:
            print("\nEvaluating on test data:")
            print(f"subModel No. {idx + 1}")
            prediction, log_metric = evaluate(model, test_df)

            if log_metric[evaluator_metrics[0]] > best_metrics[evaluator_metrics[0]]:
                best_metrics = log_metric
                best_index = idx

            print("log model")
            mlflow.spark.log_model(
                model,
                f"{EXPERIMENT_NAME}-lrmodel",
                registered_model_name=f"{EXPERIMENT_NAME}-lrmodel",
                dfs_tmpdir="Files/spark",
            )

            print("log metrics")
            mlflow.log_metrics(log_metric)

            print("log parameters")
            mlflow.log_params(
                {
                    "word2vec_size": word2vec_size,
                    "min_word_count": min_word_count,
                    "max_iter": max_iter,
                    "k_folds": k_folds,
                    "DATA_FILE": DATA_FILE,
                }
            )

    # Log the best model and its relevant metrics and parameters to the parent run
    mlflow.spark.log_model(
        models.subModels[0][best_index],
        f"{EXPERIMENT_NAME}-lrmodel",
        registered_model_name=f"{EXPERIMENT_NAME}-lrmodel",
        dfs_tmpdir="Files/spark",
    )
    mlflow.log_metrics(best_metrics)
    mlflow.log_params(
        {
            "word2vec_size": word2vec_size,
            "min_word_count": min_word_count,
            "max_iter": max_iter,
            "k_folds": k_folds,
            "DATA_FILE": DATA_FILE,
        }
    )

Denemelerinizi görüntülemek için:

  1. Sol gezinti bölmesinden çalışma alanınızı seçin
  2. Deneme adını bulma ve seçme - bu örnekte, sample_aisample-textclassification

Screenshot of an experiment.

5. Adım: Tahmin sonuçlarını puanlayıp kaydetme

Microsoft Fabric, kullanıcıların makine öğrenmesi modellerini ölçeklenebilir işlevle PREDICT kullanıma hazır hale getirmesine olanak tanır. Bu işlev, herhangi bir işlem altyapısında toplu puanlama (veya toplu çıkarım) destekler. Toplu tahminleri doğrudan bir not defterinden veya belirli bir model için öğe sayfasından oluşturabilirsiniz. PREDICT hakkında daha fazla bilgi edinmek ve Bunu Doku'da kullanma hakkında daha fazla bilgi edinmek için bkz . Microsoft Fabric'te PREDICT ile makine öğrenmesi modeli puanlaması.

Önceki değerlendirme sonuçlarından, model 1 hem Duyarlık-Geri Çağırma Eğrisi Altındaki Alan (AUPRC) hem de Eğri Alıcısı Çalışma Özelliği (AUC-ROC) Altındaki Alan için en büyük ölçümlere sahiptir. Bu nedenle, tahmin için model 1'i kullanmanız gerekir.

AUC-ROC ölçüsü, ikili sınıflandırıcıların performansını ölçmek için yaygın olarak kullanılır. Ancak bazen sınıflandırıcıyı AUPRC ölçümlerine göre değerlendirmek daha uygun hale gelir. AUC-ROC grafiği, gerçek pozitif oran (TPR) ile hatalı pozitif oran (FPR) arasındaki dengeyi görselleştirir. AUPRC eğrisi tek bir görselleştirmede duyarlığı (pozitif tahmine dayalı değer veya PPV) ve geri çağırmayı (gerçek pozitif hız veya TPR) birleştirir.

# Load the best model
model_uri = f"models:/{EXPERIMENT_NAME}-lrmodel/1"
loaded_model = mlflow.spark.load_model(model_uri, dfs_tmpdir="Files/spark")

# Verify the loaded model
batch_predictions = loaded_model.transform(test_df)
batch_predictions.show(5)
# Code to save userRecs in the lakehouse
batch_predictions.write.format("delta").mode("overwrite").save(
    f"{DATA_FOLDER}/predictions/batch_predictions"
)
# Determine the entire runtime
print(f"Full run cost {int(time.time() - ts)} seconds.")