Opetusohjelma: Tekstin luokittelumallin luominen, arvioiminen ja pisteytys
Tässä opetusohjelmassa esitellään päästä päähän -esimerkki Synapse Data Science -työnkulusta Tekstin luokittelumallille Microsoft Fabricissa. Skenaario käyttää word2vec- ja logistista regressiota Sparkissä määrittääkseen Kirjan tyylilajin British Library -kirjan tietojoukosta, yksinomaan kirjan nimen perusteella.
Tässä opetusohjelmassa käsitellään seuraavat vaiheet:
- Mukautettujen kirjastojen asentaminen
- Lataa tiedot
- Tietojen ymmärtäminen ja käsitteleminen valmistelevan tietoanalyysin avulla
- Harjoita koneoppimismalli word2vec-funktiolla ja logistisella regressiolla ja seuraa MLflow'n ja Fabric-automaattisen lokerointitoiminnon avulla tehtyjä kokeita
- Lataa koneoppimismalli pisteytystä ja ennusteita varten
Edellytykset
Hanki Microsoft Fabric -tilaus. Voit myös rekisteröityä ilmaiseen Microsoft Fabric -kokeiluversioon.
Siirry Synapse Data Science -käyttökokemukseen aloitussivun vasemmassa reunassa olevan käyttökokemuksen vaihtajan avulla.
- Jos sinulla ei ole Microsoft Fabric lakehousea, luo sellainen noudattamalla kohdassa Luo lakehouse Microsoft Fabricissa olevia ohjeita.
Seuraa mukana muistikirjassa
Voit valita jonkin seuraavista vaihtoehdoista, joita voit seurata muistikirjassa:
- Avaa ja suorita sisäinen muistikirja Synapse Data Science -kokemuksessa
- Lataa muistikirjasi GitHubista Synapse Data Science -kokemukseen
Avaa sisäinen muistikirja
Tämän opetusohjelman mukana on esimerkki Otsikkolajin luokitus -muistikirjasta.
Opetusohjelman sisäinen näytemuistikirja avataan Synapse Data Science -kokemuksesta seuraavasti:
Siirry Synapse Data Science -aloitussivulle.
Valitse Käytä mallia.
Valitse vastaava malli:
- Oletusarvoisen Päästä päähän -työnkulkujen (Python) välilehdestä, jos malli on tarkoitettu Python-opetusohjelmaa varten.
- Jos malli on R-opetusohjelmassa, päästä päähän -työnkulut (R) -välilehdeltä.
- Pikaopetusohjelmat-välilehdessä, jos malli on pikaopetusohjelmaa varten.
Liitä muistikirjaan lakehouse, ennen kuin aloitat koodin suorittamisen.
Tuo muistikirja GitHubista
AIsample – Otsikko genren luokitus.ipynb on muistikirja, joka seuraa tätä opetusohjelmaa.
Jos haluat avata tämän opetusohjelman liitteenä olevan muistikirjan, tuo muistikirja työtilaasi noudattamalla ohjeita kohdassa Järjestelmän valmisteleminen datatieteen opetusohjelmia varten.
Jos haluat kopioida ja liittää koodin tältä sivulta, voit luoda uuden muistikirjan.
Muista liittää lakehouse muistikirjaan ennen kuin aloitat koodin suorittamisen.
Vaihe 1: Mukautettujen kirjastojen asentaminen
Koneoppimismallin kehittämistä tai ad-hoc-tietojen analysointia varten sinun on ehkä asennettava nopeasti mukautettu kirjasto Apache Spark -istuntoa varten. Sinulla on kaksi vaihtoehtoa kirjastojen asentamiseen.
- Asenna muistikirjasi sisäiset asennusominaisuudet (
%pip
tai%conda
) kirjastoon, vain senhetkiseen muistikirjaasi. - Vaihtoehtoisesti voit luoda Fabric-ympäristön, asentaa kirjastoja julkisista lähteistä tai ladata mukautettuja kirjastoja siihen, jonka jälkeen työtilan järjestelmänvalvoja voi liittää ympäristön työtilan oletusarvoksi. Kaikki ympäristön kirjastot ovat sitten käytettävissä missä tahansa muistikirjoissa ja Spark-työmääritelmissä työtilassa. Katso lisätietoja ympäristöistä kohdasta Ympäristön luominen, määrittäminen ja käyttäminen Microsoft Fabricissa.
Käytä luokitusmallissa wordcloud
-kirjastoa ilmaisemaan sanan tiheys tekstissä, jossa sanan koko edustaa sen tiheystta. Tätä opetusohjelmaa varten %pip install
voit asentaa wordcloud
sen muistikirjaasi.
Muistiinpano
PySpark-ydin käynnistyy uudelleen suoritusten jälkeen %pip install
. Asenna tarvittavat kirjastot, ennen kuin suoritat muita soluja.
# Install wordcloud for text visualization by using pip
%pip install wordcloud
Vaihe 2: Lataa tiedot
Tietojoukossa on metatietoja British Libraryn kirjoista, jotka kirjaston ja Microsoftin välinen yhteistyö on digitoitu. Metatiedot ovat luokitustietoja, jotka osoittavat, onko kirja fiktio vai fiktiivinen. Tämän tietojoukon avulla on tarkoitus harjoittaa luokitusmalli, joka määrittää kirjan tyylilajin vain sen otsikon perusteella.
BL-tietuetunnus | Resurssin tyyppi | Nimi | Nimeen liittyvät päivämäärät | Nimen tyyppi | Rooli | Kaikki nimet | Title | Variantin otsikot | Sarjan otsikko | Sarjan sisäinen luku | Julkaisun maa | Julkaisupaikka | Publisher | Julkaisupäivämäärä | Versio | Fyysinen kuvaus | Dewey-luokitus | BL-hyllymerkki | Aiheet | Laji | Kielivaihtoehdot | Muistiinpanot | Fyysisen resurssin BL-tietuetunnus | 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 | Linkki digitoituun kirjaan | Selityksineen |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
014602826 | Monografia | Yearsley, Ann | 1753-1806 | / henkilö käytettäessä | More, Hannah, 1745-1833 [henkilö]; Yearsley, Ann, 1753-1806 [henkilö] | Runoja useaan otteeseen [Hannah Moren esivalmistelukirjeellä.] | Englanti | Lontoo | 1786 | Neljännen painoksen MANUSCRIPT-huomautus | Digital Store 11644.d.32 | Englanti | 003996603 | Epätosi | |||||||||||||||||||||||||||||||
014602830 | Monografia | A, T. | / henkilö käytettäessä | Oldham, John, 1653-1683 [henkilö]; A, T. [henkilö] | Satyr Vertueta vastaan. (Runo: pitäisi puhua Town-Hector [Kirjoittanut John Oldham. Etuliite allekirjoitettu: T. A.]) | Englanti | Lontoo | 1679 | 15 sivua (4°) | Digital Store 11602.ee.10. (2.) | Englanti | 000001143 | Epätosi |
Määritä seuraavat parametrit, jotta voit käyttää tätä muistikirjaa eri tietojoukoissa:
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
Lataa tietojoukko ja lataa se Lakehouse-palveluun
Tämä koodi lataa tietojoukosta julkisesti saatavilla olevan version ja tallentaa sen Fabric Lakehouse -järjestelmään.
Tärkeä
Lisää muistikirjaan lakehouse ennen kuin suoritat sen. Jos näin ei tehdä, tuloksena on virhe.
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.")
Tarvittavien kirjastojen tuominen
Ennen mitään käsittelyä sinun on tuotava tarvittavat kirjastot, mukaan lukien Spark- ja SynapseML-kirjastot:
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
Hyperparametrien määrittäminen
Määritä joitakin hyperparametreita mallin harjoittamista varten.
Tärkeä
Muokkaa näitä hyperparametreja vain, jos ymmärrät jokaisen parametrin.
# 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
Aloita muistikirjan suorittamiseen tarvittava aika:
# Record the notebook running time
import time
ts = time.time()
MLflow-kokeilujen seurannan määrittäminen
Automaattinen lokerointi laajentaa MLflow-lokitoiminnot. Automaattinen kirjaaminen tallentaa automaattisesti koneoppimismallin syöteparametriarvot ja tulostemittarit harjoittaessasi sitä. Sitten kirjaat nämä tiedot työtilaan. Työtilassa voit käyttää ja visualisoida tietoja MLflow-ohjelmointirajapinnoilla tai vastaavalla kokeilulla työtilassa. Saat lisätietoja automaattianalyysipalveluista ohjeartikkelista Automaattinen lokiloggaus Microsoft Fabricissa.
# Set up Mlflow for experiment tracking
mlflow.set_experiment(EXPERIMENT_NAME)
mlflow.autolog(disable=True) # Disable Mlflow autologging
Jos haluat poistaa Microsoft Fabric -automaattianalyysin käytöstä muistikirjaistunnossa, kutsu mlflow.autolog()
ja määritä disable=True
:
Lue raakapäivämäärätiedot Lakehousesta
raw_df = spark.read.csv(f"{DATA_FOLDER}/raw/{DATA_FILE}", header=True, inferSchema=True)
Vaihe 3: Suorita valmisteleva tietoanalyysi
Tutustu tietojoukkoon komennolla display
, jos haluat tarkastella tietojoukon korkean tason tilastotietoja ja näyttää kaavionäkymät:
display(raw_df.limit(20))
Tietojen valmistelu
Poista kaksoiskappaleet tietojen puhdistamiseksi:
df = (
raw_df.select([TEXT_COL, LABEL_COL])
.where(F.col(LABEL_COL).isin(LABELS))
.dropDuplicates([TEXT_COL])
.cache()
)
display(df.limit(20))
Käytä luokkien tasaamista puolueellisuuden käsittelemiseksi:
# 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))
Jaa kappaleet ja lauseet pienempiin yksiköihin tietojoukon tunnuksiksi. Näin merkityksen määrittäminen on helpompaa. Poista sitten stop-sanat suorituskyvyn parantamiseksi. Stopword-poistaminen tarkoittaa sellaisten sanojen poistamista, joita esiintyy yleisesti kaikissa corpus-asiakirjoissa. Stopword-poistaminen on yksi yleisimmin käytetyistä esikäsittelyvaiheista luonnollisen kielen käsittelyn (NLP) sovelluksissa.
# 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))
Näytä kunkin luokan sanapilvikirjasto. Sanapilvikirjasto on visuaalisesti näkyvä avainsanojen esitys, joka esiintyy usein tekstitiedoissa. Sanapilvikirjasto on tehokas, koska avainsanojen hahmontaminen muodostaa pilvimaisen värikuvan, joka sieppaa päätekstitiedot paremmin yhdellä silmäyksellä. Lue lisää sanapilvipalvelusta.
# 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")
Käytä lopuksi word2vec-funktiota tekstin vektorisointiin. Word2vec-tekniikka luo vektoriesityksen tekstin jokaisesta sanasta. Samanlaisissa konteksteissa käytetyt tai semanttisissa suhteissa käytetyt sanat kuvataan tehokkaasti niiden läheisyyden kautta vektoritilassa. Tämä läheisyys ilmaisee, että vastaavilla sanoilla on samanlaiset sanavektorit.
# 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))
Vaihe 4: Mallin harjoittaminen ja arvioiminen
Määritä malli, kun tiedot ovat paikoillaan. Tässä osiossa harjoitat logistista regressiomallia vektorimuotoisen tekstin luokittelemiseksi.
Koulutuksen ja testitietojoukkojen valmistelu
# Split the dataset into training and testing
(train_df, test_df) = vec_df.randomSplit((0.8, 0.2), seed=42)
Koneoppimiskokeilujen seuraaminen
Koneoppimisen kokeilu on organisaation ja hallinnan ensisijainen yksikkö kaikissa siihen liittyvissä koneoppimisajoissa. Suoritus vastaa mallikoodin yksittäistä suoritusta.
Koneoppimisen kokeilujen seuranta hallitsee kaikkia kokeita ja niiden komponentteja, esimerkiksi parametreja, mittareita, malleja ja muita artefakteja. Seurannan avulla voidaan organisaation kaikki vaadittavat komponentit tietyssä koneoppimiskokeilussa. Se mahdollistaa myös aiempien tulosten helpon toistamisen tallennettujen kokeilujen avulla. Lue lisää Microsoft Fabricin koneoppimisen kokeiluista.
# Build the logistic regression classifier
lr = (
LogisticRegression()
.setMaxIter(max_iter)
.setFeaturesCol("features")
.setLabelCol("labelIdx")
.setWeightCol("weight")
)
Hyperparametrien hienosäätäminen
Luo parametriruudukko, josta voit tehdä haun hyperparametreista. Luo sitten arvioijan välinen arvio mallin tuottamiseksi CrossValidator
:
# 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,
)
Mallin arvioiminen
Voimme vertailla testitietojoukon malleja niiden vertailemiseksi. Hyvin harjoitetun mallin tulisi osoittaa korkea suorituskyky asianmukaisten mittareiden perusteella, kun sitä verrataan vahvistus- ja testitietojoukkoihin.
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
Seuraa kokeita MLflow'n avulla
Aloita koulutus- ja arviointiprosessi. MLflow-parametrien avulla voit seurata kaikkia kokeita sekä kirjata parametreja, mittareita ja malleja. Kaikki nämä tiedot kirjataan työtilan kokeilun nimellä.
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,
}
)
Voit tarkastella kokeitasi:
- Valitse työtila vasemmassa siirtymisruudussa
- Etsi ja valitse kokeilun nimi – tässä tapauksessa sample_aisample-textclassification
Vaihe 5: Ennustustulosten pisteytys ja tallentaminen
Microsoft Fabricin avulla käyttäjät voivat operationalisoida koneoppimismalleja PREDICT
skaalattavan toiminnon avulla. Tämä funktio tukee erän pisteytystä (tai erän päätelyä) missä tahansa laskentamoduulissa. Voit luoda eräennusteita suoraan muistikirjasta tai tietyn mallin kohdesivulta. Lisätietoja PREDICT-rakenteesta ja sen käytöstä Fabricissa on artikkelissa Koneoppimismallien pisteytys PREDICT-arvolla Microsoft Fabricissa.
Edellisistä arviointituloksista mallissa 1 on suurimmat mittarit sekä alueella Precision-Recall Curve (AUPRC) että Alueella Käyrän vastaanottimen toimintaominaisuus (AUC-ROC). Siksi ennusteena tulisi käyttää mallia 1.
AUC-ROC-mittaria käytetään laajalti binaariluokkien suorituskyvyn mittaamiseen. Joskus on kuitenkin sopivampaa arvioida luokittelu AUPRC-mittausten perusteella. AUC-ROC-kaavio visualisoi todellisen positiivisen kurssin (TPR) ja väärän positiivisen prosenttiprosentin (FPR) välisen kompromissin. AUPRC-käyrä yhdistää tarkkuuden (positiivinen ennustearvo tai PPV) ja paikannuksen (tosi positiivinen korko tai TPR) yhteen visualisointiin.
# 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.")