Huomautus
Tämän sivun käyttö edellyttää valtuutusta. Voit yrittää kirjautua sisään tai vaihtaa hakemistoa.
Tämän sivun käyttö edellyttää valtuutusta. Voit yrittää vaihtaa hakemistoa.
Tässä artikkelissa kerrotaan, miten voit kouluttaa luokitusmalleja käyttämällä selitettävästi tehostekoneita (EBM). Selitettävissä oleva tehostamiskone on koneoppimistekniikka, jossa yhdistyvät liukuvärien teho ja mallin tulkittavuuden korostaminen. Se luo päätöspuiden yhdistelmän, joka muistuttaa liukuvärin tehostamista, mutta keskittyy ainutlaatuisesti ihmisen luettavien mallien luontiin. EPV:t tarjoavat tarkkoja ennusteita ja lisäksi selviä ja intuitiivisia selityksiä näille ennusteille. Ne soveltuvat hyvin sovelluksiin, joissa on tärkeää ymmärtää taustalla olevia tekijöitä, jotka vaikuttavat mallipäätöksiin, kuten terveydenhuoltoon, rahoitukseen ja säädösten noudattamiseen.
SynapseML:ssä voit käyttää Apache Sparkin tarjoaman EBM:n skaalattavaa toteutusta uusien mallien kouluttamiseen. Tässä artikkelissa esitellään EPV:n Skaalautuvuus ja tulkittavuus Microsoft Fabricissa Apache Sparkiä hyödyntämällä.
Tärkeä
Tämä ominaisuus on esikatseluvaiheessa.
Tässä artikkelissa käydään läpi tietojen hankinta ja esikäsittely Azuren avoimista tietojoukoista, jotka tallentavat NYC Yellow Taxi -matkoja. Sitten harjoitat ennakoivan mallin, jolla on lopullinen tavoite määrittää, tapahtuuko tietty matka vai ei.
Selityskykyisten koneiden tehostettavan suorituskyvyn edut
EPV:t tarjoavat ainutlaatuisen yhdistelmän tulkittavuutta ja ennustavaa tehoa, mikä tekee niistä ihanteellisen valinnan, kun koneoppimismallien läpinäkyvyys ja ymmärrys ovat olennaisia. EPV:n avulla käyttäjät voivat saada arvokkaita merkityksellisiä tietoja taustalla olevista tekijöistä, jotka ohjaavat ennusteita, jotta he ymmärtävät, miksi malli tekee tiettyjä päätöksiä tai ennusteita, mikä on välttämätöntä luottamuksen luomiseksi tekoälyjärjestelmissä.
Heidän kykynsä löytää tietoihin monimutkaisia suhteita ja saada selkeitä ja tulkittavia tuloksia tekee niistä korvaamattomia esimerkiksi rahoituksen, terveydenhuollon ja petosten havaitsemisen aloilla. Näillä kentillä mallin selitettävyys ei ole vain toivottavaa, vaan usein myös sääntelyvaatimus. Viime kädessä EPV:n valitsivat käyttäjät voivat löytää tasapainon mallin suorituskyvyn ja läpinäkyvyyden välillä ja varmistaa, että tekoälyratkaisut ovat tarkkoja, helposti ymmärrettäviä ja vastuullisia.
Edellytykset
Hanki Microsoft Fabric -tilaus. Voit myös rekisteröityä microsoft fabric -kokeiluversion maksuttomaan .
Vaihda Fabriciin aloitussivun vasemmassa alakulmassa olevan käyttökokemuksen vaihtajan avulla.
- Luo uusi muistikirja työtilaasi valitsemalla + ja Notebook-.
Asenna kirjastot
Aloita asentamalla Azuren automaattianalyysipalveluiden avointen tietojoukkojen kirjasto, joka myöntää pääsyn tietojoukkoon. Tämä asennusvaihe on välttämätön tietojoukon tehokkaan käytön kannalta.
%pip install azureml-opendatasets
MLflow-tuonti
MLflow-parametrien avulla voit seurata mallin parametreja ja tuloksia. Seuraavassa koodikatkelmassa esitellään, miten MLflow:a käytetään kokeiluun ja seurantaan.
ebm_classification_nyc_taxi
arvo on sen kokeen nimi, jossa tiedot kirjataan.
import mlflow
# Set up the experiment name
mlflow.set_experiment("ebm_classification_nyc_taxi")
Tuontikirjastot
Lisää seuraavaksi seuraava koodi, joka tuo analyysiin käytetyt olennaiset paketit:
# Import necessary packages
import interpret
from pyspark.ml.feature import StringIndexer, VectorAssembler
from pyspark.ml import Pipeline
from pyspark.mllib.evaluation import BinaryClassificationMetrics
from pyspark.sql import SparkSession
from pyspark.sql.functions import *
from pyspark.sql.types import DoubleType
from synapse.ml.ebm import EbmClassification
Nämä tuodut paketit tarjoavat perustyökalut ja toiminnot, joita tarvitaan analyysi- ja mallinnustehtävissä.
Lataa tiedot
Lisää seuraavaksi seuraava koodi, joka noutaa NEWC:n keltaiset taksitiedot Azuren automaattianalyysipalveluiden avoimista tietojoukoista, ja valinnaisesti pienennä tietojoukkoa kehityksen nopeuttamiseksi:
# Import NYC Yellow Taxi data from Azure Open Datasets
from azureml.opendatasets import NycTlcYellow
from datetime import datetime
from dateutil import parser
# Define the start and end dates for the dataset
end_date = parser.parse('2018-05-08 00:00:00')
start_date = parser.parse('2018-05-01 00:00:00')
# Load the NYC Yellow Taxi dataset within the specified date range
nyc_tlc = NycTlcYellow(start_date=start_date, end_date=end_date)
nyc_pd = nyc_tlc.to_pandas_dataframe()
nyc_tlc_df = spark.createDataFrame(nyc_pd)
Kehityksen helpottamiseksi ja laskennallisen yleiskuormituksen pienentämiseksi tietojoukosta saatetaan ottaa malli:
# For development convenience, consider down-sampling the dataset
sampled_taxi_df = nyc_tlc_df.sample(True, 0.001, seed=1234)
Näytteenoton pienentäminen mahdollistaa nopeamman ja kustannustehokkaamman kehityskokemuksen etenkin suuria tietojoukkoja käsiteltäessä.
Tietojen valmistelu
Tässä osiossa valmistelet tietojoukon suodattamalla pois rivit, joissa on poikkeavia ja epäolennaisia muuttujia.
Ominaisuuksien luominen
Luo koodi uusille johdetuille ominaisuuksille, joiden odotetaan parantavan mallin suorituskykyä:
taxi_df = sampled_taxi_df.select('totalAmount', 'fareAmount', 'tipAmount', 'paymentType', 'rateCodeId', 'passengerCount',
'tripDistance', 'tpepPickupDateTime', 'tpepDropoffDateTime',
date_format('tpepPickupDateTime', 'hh').alias('pickupHour'),
date_format('tpepPickupDateTime', 'EEEE').alias('weekdayString'),
(unix_timestamp(col('tpepDropoffDateTime')) - unix_timestamp(col('tpepPickupDateTime'))).alias('tripTimeSecs'),
(when(col('tipAmount') > 0, 1).otherwise(0)).alias('tipped')
)\
.filter((sampled_taxi_df.passengerCount > 0) & (sampled_taxi_df.passengerCount < 8)
& (sampled_taxi_df.tipAmount >= 0) & (sampled_taxi_df.tipAmount <= 25)
& (sampled_taxi_df.fareAmount >= 1) & (sampled_taxi_df.fareAmount <= 250)
& (sampled_taxi_df.tipAmount < sampled_taxi_df.fareAmount)
& (sampled_taxi_df.tripDistance > 0) & (sampled_taxi_df.tripDistance <= 100)
& (sampled_taxi_df.rateCodeId <= 5)
& (sampled_taxi_df.paymentType.isin({"1", "2"}))
)
Nyt kun olet luonut uusia muuttujia, voit lisätä koodin ja pudottaa sarakkeet, joista ne on johdettu. Tietokehys on nyt entistä virtaviivaisempi mallin syötettä varten. Lisäksi voit luoda lisäominaisuuksia äskettäin luotujen sarakkeiden perusteella:
taxi_featurised_df = taxi_df.select('totalAmount', 'fareAmount', 'tipAmount', 'paymentType', 'passengerCount',
'tripDistance', 'weekdayString', 'pickupHour', 'tripTimeSecs', 'tipped',
when((taxi_df.pickupHour <= 6) | (taxi_df.pickupHour >= 20), "Night")
.when((taxi_df.pickupHour >= 7) & (taxi_df.pickupHour <= 10), "AMRush")
.when((taxi_df.pickupHour >= 11) & (taxi_df.pickupHour <= 15), "Afternoon")
.when((taxi_df.pickupHour >= 16) & (taxi_df.pickupHour <= 19), "PMRush")
.otherwise(0).alias('trafficTimeBins'))\
.filter((taxi_df.tripTimeSecs >= 30) & (taxi_df.tripTimeSecs <= 7200))
Näillä tietojen valmisteluvaiheilla varmistetaan, että tietojoukkosi on sekä tarkennettu että optimoitu seuraavia mallinnusprosesseja varten.
Tietojen koodaus
SynapseML EBM :n yhteydessä Estimator
odottaa , että syötetiedot ovat org.apache.spark.mllib.linalg.Vector
muodossa Doubles
. On siis tarpeen muuntaa kaikki luokkamuuttujat (merkkijonomuuttujat) numeeriseksi esitykseksi, ja kaikki muuttujat, joilla on numeerisia arvoja mutta jotka eivät ole numeerisia tietotyyppejä, on muunnettava numeeriseksi tietotyypiksi.
Tällä hetkellä SynapseML-EPV käyttää StringIndexer
lähestymistapaa luokittaisten muuttujien hallintaan. SynapseML-EPV:t eivät tällä hetkellä tarjoa erityistä käsittelyä luokittaisille ominaisuuksille.
Tässä on joukko vaiheita, jotka lisätään koodiin, jotta tiedot voidaan valmistella käytettäväksi SynapseML-EBM:ien kanssa:
# Convert categorical features into numerical representations using StringIndexer
sI1 = StringIndexer(inputCol="trafficTimeBins", outputCol="trafficTimeBinsIndex")
sI2 = StringIndexer(inputCol="weekdayString", outputCol="weekdayIndex")
# Apply the encodings to create a new dataframe
encoded_df = Pipeline(stages=[sI1, sI2]).fit(taxi_featurised_df).transform(taxi_featurised_df)
final_df = encoded_df.select('fareAmount', 'paymentType', 'passengerCount', 'tripDistance',
'pickupHour', 'tripTimeSecs', 'trafficTimeBinsIndex', 'weekdayIndex',
'tipped')
# Ensure that any string representations of numbers in the data are cast to numeric data types
final_df = final_df.withColumn('paymentType', final_df['paymentType'].cast(DoubleType()))
final_df = final_df.withColumn('pickupHour', final_df['pickupHour'].cast(DoubleType()))
# Define the label column name
labelColumnName = 'tipped'
# Assemble the features into a vector
assembler = VectorAssembler(outputCol='features')
assembler.setInputCols([c for c in final_df.columns if c != labelColumnName])
vectorized_final_df = assembler.transform(final_df)
Nämä tietojen valmisteluvaiheet ovat olennaisia, jotta voit yhdenmukaistaa tietomuodon SynapseML-EPV:n vaatimusten kanssa ja varmistaa tarkan ja tehokkaan malliharjoittelun.
Testi- ja koulutustietojoukkojen luominen
Lisää nyt koodi, joka jakaa tietojoukon harjoitus- ja testausjoukkoihin käyttämällä yksinkertaista jakoa. 70% tiedoista varataan harjoittamiseen ja 30% mallin testaamiseen:
# Decide on the split between training and test data from the dataframe
trainingFraction = 0.7
testingFraction = (1-trainingFraction)
seed = 1234
# Split the dataframe into test and training dataframes
train_data_df, test_data_df = vectorized_final_df.randomSplit([trainingFraction, testingFraction], seed=seed)
Tämän tietojen jakamisen ansiosta voimme harjoittaa mallin huomattavalla osalla samalla, kun varaamme toisen osan arvioidaksemme sen suorituskykyä tehokkaasti.
Harjoita mallia
Lisää nyt koodi EBM-mallin harjoittamiseksi ja arvioi sen suorituskykyä käyttämällä mittarina Vastaanottimen toimintaominaisuus (ROC) -käyrän alla olevaa Aluetta:
# Create an instance of the EBMClassifier
estimator = EbmClassification()
estimator.setLabelCol(labelColumnName)
# Fit the EBM model to the training data
model = estimator.fit(train_data_df)
# Make predictions for tip (1/0 - yes/no) on the test dataset and evaluate using AUROC
predictions = model.transform(test_data_df)
predictionsAndLabels = predictions.select("prediction", labelColumnName)
predictionsAndLabels = predictionsAndLabels.withColumn(labelColumnName, predictionsAndLabels[labelColumnName].cast(DoubleType()))
# Calculate AUROC using BinaryClassificationMetrics
metrics = BinaryClassificationMetrics(predictionsAndLabels.rdd)
print("Area under ROC = %s" % metrics.areaUnderROC)
Tämän prosessin jälkeen EBM-malli on harjoitettava harjoitustietojoukkoa varten ja sen avulla tehtävä ennusteita testitietojoukosta, minkä jälkeen arvioidaan mallin suorituskyky avainmittarina AUROC:n avulla.
Yleisiin selityksiin tarkasteleminen
Jos haluat visualisoida mallin yleisen selityksen, voit lisätä koodin visualisoinnin kääreen hankkimiseksi ja käyttää kirjaston interpret
show
-menetelmää. Visualisoinnin rivitin toimii siltana mallin visualisointikokemuksen helpottamiseksi. Voit tehdä sen näin:
wrapper = model.getVizWrapper()
explanation = wrapper.explain_global()
Lisää seuraavaksi koodi kirjaston interpret
tuomista ja selitysten näyttämiseen -menetelmän avulla show
:
import interpret
interpret.show(explanation)
Termi "tärkeydet" edustaa kunkin termin (ominaisuuden tai vuorovaikutuksen) keskimääräistä absoluuttista osuutta (pisteiden) suhteessa ennusteisiin. Nämä osuudet lasketaan keskimäärin koko harjoitustietojoukosta ottaen huomioon jokaisen lokeron näytteiden määrä ja otospainot (jos sovellettavissa). Selityksissä näytetään 15 tärkeintä termiä.
Paikallisten selitysten tarkasteleminen
Annetut selitykset ovat maailmanlaajuisella tasolla, mutta on olemassa tilanteita, joissa myös ominaisuuskohtaiset tulokset ovat arvokkaita. Sekä kouluttaja että malli tarjoavat mahdollisuuden määrittää featurescores
, joka täytettynä esittelee toisen vektoriarvoisen sarakkeen. Jokainen tämän sarakkeen vektori vastaa ominaisuussarakkeen pituutta, ja kukin arvo vastaa ominaisuutta samassa indeksissä. Nämä arvot edustavat kunkin ominaisuuden vaikutusta mallin lopulliseen tulokseen.
Toisin kuin yleisissä selityksissä, interpret
visualisointiin ei tällä hetkellä ole suoraa integrointia ominaisuuskohtaisia tulosteita varten. Tämä johtuu siitä, että maailmanlaajuiset visualisoinnit skaalautuvat pääasiassa ominaisuuksien määrällä (mikä on yleensä pientä), kun taas paikalliset selitykset skaalautuvat rivien määrällä (mikä voi olla merkittävä, jos se on Spark-tietokehys).
Tässä on koodi, joka lisätään määritykseen ja :n käyttämiseen featurescores
:
prediction2 = model.setFeatureScoresCol("featurescores").transform(train_data_df)
Käytetään havainnollistamistarkoituksessa koodia, joka tulostaa ensimmäisen esimerkin tiedot:
# Convert to Pandas for easier inspection
predictions_pandas = prediction2.toPandas()
predictions_list = prediction2.collect()
# Extract the first example from the collected predictions.
first = predictions_list[0]
# Print the lengths of the features and feature scores.
print('Length of the features is', len(first['features']), 'while the feature scores have length', len(first['featurescores']))
# Print the values of the features and feature scores.
print('Features are', first['features'])
print('Feature scores are', first['featurescores'])
Aiheeseen liittyvä sisältö
- InterpretML-selittävän tehostamiskoneen: Miten se toimii
- MLflow- sisältävien mallien seuraaminen