Öğ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
Microsoft Fabric aboneliği alın. Alternatif olarak, ücretsiz bir Microsoft Fabric deneme sürümüne kaydolun.
Synapse Veri Bilimi deneyimine geçmek için giriş sayfanızın sol tarafındaki deneyim değiştiriciyi kullanın.
- Microsoft Fabric lakehouse'nuz yoksa, Microsoft Fabric'te göl evi oluşturma makalesindeki adımları izleyerek bir tane oluşturun.
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:
Synapse Veri Bilimi giriş sayfasına gidin.
Örnek kullan'ı seçin.
İ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.
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:
- Sol gezinti bölmesinden çalışma alanınızı seçin
- Deneme adını bulma ve seçme - bu örnekte, sample_aisample-textclassification
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.")
İlgili içerik
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