Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez az oktatóanyag egy Synapse Data Science-munkafolyamat végpontok közötti példáját mutatja be a Microsoft Fabricben. Ebben a forgatókönyvben egy csalásészlelési modellt hozunk létre az R-ben, amely gépi tanulási algoritmusokat tanít be az előzményadatokra. Ezt követően a modell használatával észleljük a jövőbeli csalárd tranzakciókat.
Ez az oktatóanyag az alábbi lépéseket ismerteti:
- Egyéni könyvtárak telepítése
- Adatok betöltése
- Az adatok megismerése és feldolgozása feltáró adatelemzéssel, valamint a Fabric Data Wrangler funkció használatának bemutatása
- Gépi tanulási modellek betanítása a LightGBM használatával
- A gépi tanulási modellek használata pontozáshoz és előrejelzésekhez
Előfeltételek
Szerezzen be egy Microsoft Fabric-előfizetést . Vagy iratkozzon fel egy ingyenes Microsoft Fabric próbaidőszakra.
Lépjen be a Microsoft Fabric.
A kezdőlap bal alsó részén található élménykapcsolóval válthat Fabricre.
- Szükség esetén hozzon létre egy Microsoft Fabric lakehouse-t az Lakóház létrehozás Microsoft Fabric-banszerint.
Követés jegyzetfüzetben
A jegyzetfüzet használatához az alábbi lehetőségek közül választhat:
- Nyissa meg és futtassa a beépített jegyzetfüzetet a Synapse Data Science felületén
- Jegyzetfüzet feltöltése a GitHubról a Synapse Data Science felületére
A beépített jegyzetfüzet megnyitása
Az oktatóanyagot a csalásészlelési-jegyzetfüzet minta kíséri.
Az oktatóanyaghoz tartozó mintajegyzetfüzet megnyitásához kövesse a A rendszer előkészítése adatelemzési oktatóanyagokhozcímű témakörben található utasításokat.
A kód futtatása előtt mindenképpen csatoljon egy tóházat a jegyzetfüzethez.
A jegyzetfüzet importálása a GitHubról
A AIsample - R Fraud Detection.ipynb jegyzetfüzet kíséri ezt az oktatóanyagot.
Az oktatóanyaghoz mellékelt jegyzetfüzet megnyitásához kövesse az utasításokat a Rendszerének előkészítése adatelemzési oktatóanyagokhoz részben, hogy importálja a jegyzetfüzetet a munkaterületére.
Ha inkább erről a lapról másolja és illessze be a kódot, létrehozhat egy új jegyzetfüzetet.
A kód futtatása előtt mindenképpen csatoljon egy lakehouse-t a jegyzetfüzethez.
1. lépés: Egyéni kódtárak telepítése
A gépi tanulási modell fejlesztéséhez vagy az alkalmi adatelemzéshez előfordulhat, hogy gyorsan telepítenie kell egy egyéni kódtárat az Apache Spark-munkamenethez. A kódtárak telepítéséhez két lehetőség közül választhat.
- Használja a beágyazott telepítési erőforrásokat, például a
install.packagesésdevtools::install_version, hogy csak az aktuális jegyzetfüzetbe telepítsen. - Másik lehetőségként létrehozhat egy Fabric-környezetet, telepíthet nyilvános forrásokból származó kódtárakat, vagy feltölthet hozzá egyéni kódtárakat, majd a munkaterület rendszergazdája alapértelmezettként csatolhatja a környezetet a munkaterülethez. Ezután a környezet összes kódtára elérhetővé válik a munkaterület bármely jegyzetfüzetében és Spark-feladatdefiníciójában. További információ a környezetekről: környezet létrehozása, konfigurálása és használata a Microsoft Fabric.
Ebben az oktatóanyagban a install.version() használatával telepítse a kiegyensúlyozatlan tanulás kódtárat:
# Install dependencies
devtools::install_version("bnlearn", version = "4.8")
# Install imbalance for SMOTE
devtools::install_version("imbalance", version = "1.0.2.1")
2. lépés: Az adatok betöltése
A csalásészlelési adatkészlet 2013 szeptemberétől tartalmaz hitelkártya-tranzakciókat, amelyeket az európai kártyatulajdonosok két nap alatt hajtottak végre. Az adathalmaz csak numerikus szolgáltatásokat tartalmaz az eredeti funkciókra alkalmazott fő összetevő-elemzési (PCA) átalakítás miatt. A PCA az Time és a Amountkivételével minden funkciót átalakított. A bizalmasság védelme érdekében nem tudjuk megadni az eredeti szolgáltatásokat vagy az adathalmazsal kapcsolatos további háttérinformációkat.
Ezek a részletek az adathalmazt írják le:
- A
V1,V2,V3, ...,V28funkciók a PCA-val beszerzett fő összetevők - A
Timefunkció a tranzakció és az adathalmaz első tranzakciója közötti eltelt másodperceket tartalmazza - A
Amountfunkció a tranzakció összege. Példafüggő, költségérzékeny tanuláshoz használhatja ezt a funkciót. - A
Classoszlop a válasz (cél) változó. Csalás esetén1érték, más esetekben0.
A 284 807 tranzakcióból csak 492 tranzakció hamis. Az adathalmaz rendkívül kiegyensúlyozatlan, mert a kisebb (csalással kapcsolatos) osztály az adatok körülbelül 0,172% részét teszi ki.
Ez a táblázat a creditcard.csv adatainak előnézetét mutatja be:
| Idő | V1 | V2 | V3 | V4 | V5 | V6 | V7 | V8 | V9 | V10 | V11 | V12 | V13 | V14 | V15 | V16 | V17 | V18 | V19 | V20 | V21 | V22 | V23 | V24 | V25 | V26 | V27 | V28 | Mennyiség | Osztály |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | -1.3598071336738 | -0.0727811733098497 | 2.53634673796914 | 1.37815522427443 | -0.338320769942518 | 0.462387777762292 | 0.239598554061257 | 0.0986979012610507 | 0.363786969611213 | 0.0907941719789316 | -0.551599533260813 | -0.617800855762348 | -0.991389847235408 | -0.311169353699879 | 1.46817697209427 | -0.470400525259478 | 0.207971241929242 | 0.0257905801985591 | 0.403992960255733 | 0.251412098239705 | -0.018306777944153 | 0.277837575558899 | -0.110473910188767 | 0.0669280749146731 | 0.128539358273528 | -0.189114843888824 | 0.133558376740387 | -0.0210530534538215 | 149.62 | "0" |
| 0 | 1.19185711131486 | 0.26615071205963 | 0.16648011335321 | 0.448154078460911 | 0.0600176492822243 | -0.0823608088155687 | -0.0788029833323113 | 0.0851016549148104 | -0.255425128109186 | -0.166974414004614 | 1,61272666105479 | 1.06523531137287 | 0.48909501589608 | -0.143772296441519 | 0.635558093258208 | 0.463917041022171 | -0.114804663102346 | -0.183361270123994 | -0.145783041325259 | -0.0690831352230203 | -0.225775248033138 | -0.638671952771851 | 0.101288021253234 | -0.339846475529127 | 0.167170404418143 | 0.125894532368176 | -0.00898309914322813 | 0.0147241691924927 | 2,69 | 0 |
Töltse le az adathalmazt, és töltse fel a lakehouse-ba
Adja meg ezeket a paramétereket, hogy ezt a jegyzetfüzetet különböző adatkészletekkel használhassa:
IS_CUSTOM_DATA <- FALSE # If TRUE, the dataset has to be uploaded manually
IS_SAMPLE <- FALSE # If TRUE, use only rows of data for training; otherwise, use all data
SAMPLE_ROWS <- 5000 # If IS_SAMPLE is True, use only this number of rows for training
DATA_ROOT <- "/lakehouse/default"
DATA_FOLDER <- "Files/fraud-detection" # Folder with data files
DATA_FILE <- "creditcard.csv" # Data file name
Ez a kód letölti az adathalmaz nyilvánosan elérhető verzióját, majd egy Fabric lakehouse-ban tárolja.
Fontos
A futtatás előtt mindenképpen adjon hozzá egy lakehouse- a jegyzetfüzethez. Ellenkező esetben hibaüzenet jelenik meg.
if (!IS_CUSTOM_DATA) {
# Download data files into a lakehouse if they don't exist
library(httr)
remote_url <- "https://synapseaisolutionsa.blob.core.windows.net/public/Credit_Card_Fraud_Detection"
fname <- "creditcard.csv"
download_path <- file.path(DATA_ROOT, DATA_FOLDER, "raw")
dir.create(download_path, showWarnings = FALSE, recursive = TRUE)
if (!file.exists(file.path(download_path, fname))) {
r <- GET(file.path(remote_url, fname), timeout(30))
writeBin(content(r, "raw"), file.path(download_path, fname))
}
message("Downloaded demo data files into lakehouse.")
}
Nyers dátumadatok olvasása a lakehouse-ból
Ez a kód nyers adatokat olvas be a lakehouse Files szakaszából:
data_df <- read.csv(file.path(DATA_ROOT, DATA_FOLDER, "raw", DATA_FILE))
3. lépés: Feltáró adatelemzés végrehajtása
Az adathalmaz magas szintű statisztikáinak megtekintéséhez használja a display parancsot:
display(as.DataFrame(data_df, numPartitions = 3L))
# Print dataset basic information
message(sprintf("records read: %d", nrow(data_df)))
message("Schema:")
str(data_df)
# If IS_SAMPLE is True, use only SAMPLE_ROWS of rows for training
if (IS_SAMPLE) {
data_df = sample_n(data_df, SAMPLE_ROWS)
}
Az osztályok eloszlásának nyomtatása az adathalmazban:
# The distribution of classes in the dataset
message(sprintf("No Frauds %.2f%% of the dataset\n", round(sum(data_df$Class == 0)/nrow(data_df) * 100, 2)))
message(sprintf("Frauds %.2f%% of the dataset\n", round(sum(data_df$Class == 1)/nrow(data_df) * 100, 2)))
Ez az osztályeloszlás azt mutatja, hogy a tranzakciók többsége nem jogsértő. Ezért a túlillesztés elkerülése érdekében a modell betanítása előtt adatelőfeldolgozásra van szükség.
A csalárd és a nem jogsértő tranzakciók eloszlásának megtekintése
Tekintse meg a csalárd és a nem jogsértő tranzakciók eloszlását egy diagrammal, hogy megjelenítse az adathalmaz osztályegyensúlytalanságát:
library(ggplot2)
ggplot(data_df, aes(x = factor(Class), fill = factor(Class))) +
geom_bar(stat = "count") +
scale_x_discrete(labels = c("no fraud", "fraud")) +
ggtitle("Class Distributions \n (0: No Fraud || 1: Fraud)") +
theme(plot.title = element_text(size = 10))
A diagram egyértelműen az adathalmaz egyensúlyhiányát mutatja:
Az öt szám összegzésének megjelenítése
A tranzakció összegéhez tartozó ötszámos összegzés (minimális pontszám, első kvartilis, medián, harmadik kvartilis és maximális pontszám) megjelenítése dobozdiagramokkal:
library(ggplot2)
library(dplyr)
ggplot(data_df, aes(x = as.factor(Class), y = Amount, fill = as.factor(Class))) +
geom_boxplot(outlier.shape = NA) +
scale_x_discrete(labels = c("no fraud", "fraud")) +
ggtitle("Boxplot without Outliers") +
coord_cartesian(ylim = quantile(data_df$Amount, c(0.05, 0.95)))
A nagymértékben kiegyensúlyozatlan adatok esetében előfordulhat, hogy a dobozdiagramok nem mutatnak pontos megállapításokat. A Class egyensúlyhiány problémáját azonban először megoldhatja, majd ugyanazokat a diagramokat hozhatja létre a pontosabb elemzésekhez.
4. lépés: A modellek betanítása és kiértékelése
Itt betanít egy LightGBM-modellt a csalási tranzakciók besorolásához. Tanítasz egy LightGBM-modellt mind a kiegyensúlyozatlan adathalmazra, mind a kiegyensúlyozott adathalmazra. Ezután összehasonlítja mindkét modell teljesítményét.
Adathalmazok betanítása és tesztelése
A betanítás előtt ossza fel az adatokat a betanítási és tesztelési adatkészletekre:
# Split the dataset into training and test datasets
set.seed(42)
train_sample_ids <- base::sample(seq_len(nrow(data_df)), size = floor(0.85 * nrow(data_df)))
train_df <- data_df[train_sample_ids, ]
test_df <- data_df[-train_sample_ids, ]
SMOTE alkalmazása a betanítási adatkészletre
A kiegyensúlyozatlan besorolással probléma van. Túl kevés a kisebbségi osztály példája ahhoz, hogy egy modell hatékonyan megtanulja a döntési határt. A szintetikus kisebbségi túlmintavételezési technika (SMOTE) képes kezelni ezt a problémát. Az SMOTE a legelszántabb módszer a kisebbségi osztály új mintáinak szintetizálására. Az SMOTE-t az 1. lépésben telepített imbalance kódtár használatával érheti el.
Az SMOTE-t csak a betanítási adatkészletre alkalmazza a tesztadatkészlet helyett. Amikor a tesztadatokkal értékeli a modellt, szüksége van egy közelítésre a modell teljesítményének megítéléséhez a termelési környezetben nem látott adatokon. Az érvényes közelítés érdekében a tesztadatok az eredeti kiegyensúlyozatlan eloszlásra támaszkodnak, hogy a lehető legszorosabban képviseljék a gyártási adatokat.
# Apply SMOTE to the training dataset
library(imbalance)
# Print the shape of the original (imbalanced) training dataset
train_y_categ <- train_df %>% select(Class) %>% table
message(
paste0(
"Original dataset shape ",
paste(names(train_y_categ), train_y_categ, sep = ": ", collapse = ", ")
)
)
# Resample the training dataset by using SMOTE
smote_train_df <- train_df %>%
mutate(Class = factor(Class)) %>%
oversample(ratio = 0.99, method = "SMOTE", classAttr = "Class") %>%
mutate(Class = as.integer(as.character(Class)))
# Print the shape of the resampled (balanced) training dataset
smote_train_y_categ <- smote_train_df %>% select(Class) %>% table
message(
paste0(
"Resampled dataset shape ",
paste(names(smote_train_y_categ), smote_train_y_categ, sep = ": ", collapse = ", ")
)
)
További információ az SMOTE-ről: csomag "egyensúlyhiány" és Az egyensúlyhiányos adatkészletek erőforrások használata a CRAN webhelyén.
A modell betanítása a LightGBM használatával
A LightGBM-modell betanítása a kiegyensúlyozatlan adatkészlettel és a kiegyensúlyozott (SMOTE-on keresztüli) adatkészlettel. Ezután hasonlítsa össze a teljesítményüket:
# Train LightGBM for both imbalanced and balanced datasets and define the evaluation metrics
library(lightgbm)
# Get the ID of the label column
label_col <- which(names(train_df) == "Class")
# Convert the test dataset for the model
test_mtx <- as.matrix(test_df)
test_x <- test_mtx[, -label_col]
test_y <- test_mtx[, label_col]
# Set up the parameters for training
params <- list(
objective = "binary",
learning_rate = 0.05,
first_metric_only = TRUE
)
# Train for the imbalanced dataset
message("Start training with imbalanced data:")
train_mtx <- as.matrix(train_df)
train_x <- train_mtx[, -label_col]
train_y <- train_mtx[, label_col]
train_data <- lgb.Dataset(train_x, label = train_y)
valid_data <- lgb.Dataset.create.valid(train_data, test_x, label = test_y)
model <- lgb.train(
data = train_data,
params = params,
eval = list("binary_logloss", "auc"),
valids = list(valid = valid_data),
nrounds = 300L
)
# Train for the balanced (via SMOTE) dataset
message("\n\nStart training with balanced data:")
smote_train_mtx <- as.matrix(smote_train_df)
smote_train_x <- smote_train_mtx[, -label_col]
smote_train_y <- smote_train_mtx[, label_col]
smote_train_data <- lgb.Dataset(smote_train_x, label = smote_train_y)
smote_valid_data <- lgb.Dataset.create.valid(smote_train_data, test_x, label = test_y)
smote_model <- lgb.train(
data = smote_train_data,
params = params,
eval = list("binary_logloss", "auc"),
valids = list(valid = smote_valid_data),
nrounds = 300L
)
A funkció fontosságának meghatározása
Határozza meg a kiegyensúlyozatlan adathalmazon betanított modell funkciójának fontosságát:
imp <- lgb.importance(model, percentage = TRUE)
ggplot(imp, aes(x = Frequency, y = reorder(Feature, Frequency), fill = Frequency)) +
scale_fill_gradient(low="steelblue", high="tomato") +
geom_bar(stat = "identity") +
geom_text(aes(label = sprintf("%.4f", Frequency)), hjust = -0.1) +
theme(axis.text.x = element_text(angle = 90)) +
xlim(0, max(imp$Frequency) * 1.1)
A kiegyensúlyozott (SMOTE-n keresztüli) adatkészleten betanított modell esetében számítsa ki a funkció fontosságát:
smote_imp <- lgb.importance(smote_model, percentage = TRUE)
ggplot(smote_imp, aes(x = Frequency, y = reorder(Feature, Frequency), fill = Frequency)) +
geom_bar(stat = "identity") +
scale_fill_gradient(low="steelblue", high="tomato") +
geom_text(aes(label = sprintf("%.4f", Frequency)), hjust = -0.1) +
theme(axis.text.x = element_text(angle = 90)) +
xlim(0, max(smote_imp$Frequency) * 1.1)
Az ilyen ábrázolások összehasonlítása egyértelműen azt mutatja, hogy a kiegyensúlyozott és kiegyensúlyozatlan betanítási adathalmazok jelentős jellemzőkben jelentős különbségeket mutatnak.
A modellek kiértékelése
Itt értékelheti ki a két betanított modellt:
-
modelbetanítása nyers, kiegyensúlyozatlan adatokra -
smote_modelbetanították kiegyensúlyozott adatokon
preds <- predict(model, test_mtx[, -label_col])
smote_preds <- predict(smote_model, test_mtx[, -label_col])
Modellteljesítmény kiértékelése keveredési mátrix használatával
A keveredési mátrix a
- valódi pozitív értékek (TP)
- valódi negatívok (TN)
- hamis pozitív értékek (FP)
- hamis negatív esetek (FN)
a modell által előállított érték, amikor tesztadatokkal értékelik. Bináris besorolás esetén a modell egy 2x2 keveredési mátrixot ad vissza. Többosztályos besorolás esetén a modell egy nxn keveredési mátrixot ad vissza, amelyben n az osztályok száma.
Használjon keveredési mátrixot a betanított gépi tanulási modellek teljesítményének összegzéséhez a tesztadatokon:
plot_cm <- function(preds, refs, title) { library(caret) cm <- confusionMatrix(factor(refs), factor(preds)) cm_table <- as.data.frame(cm$table) cm_table$Prediction <- factor(cm_table$Prediction, levels=rev(levels(cm_table$Prediction))) ggplot(cm_table, aes(Reference, Prediction, fill = Freq)) + geom_tile() + geom_text(aes(label = Freq)) + scale_fill_gradient(low = "white", high = "steelblue", trans = "log") + labs(x = "Prediction", y = "Reference", title = title) + scale_x_discrete(labels=c("0", "1")) + scale_y_discrete(labels=c("1", "0")) + coord_equal() + theme(legend.position = "none") }A kiegyensúlyozatlan adathalmazon betanított modell keveredési mátrixának ábrázolása:
# The value of the prediction indicates the probability that a transaction is fraud # Use 0.5 as the threshold for fraud/no-fraud transactions plot_cm(ifelse(preds > 0.5, 1, 0), test_df$Class, "Confusion Matrix (Imbalanced dataset)")
Ábrázolja a kiegyensúlyozott adathalmazon betanított modell keveredési mátrixát:
plot_cm(ifelse(smote_preds > 0.5, 1, 0), test_df$Class, "Confusion Matrix (Balanced dataset)")
Modellteljesítmény kiértékelése AUC-ROC és AUPRC-mértékekkel
A görbevevő működési jellemzője (AUC-ROC) alatti terület értékeli a bináris osztályozók teljesítményét. A AUC-ROC diagram a valódi pozitív ráta (TPR) és a hamis pozitív ráta (FPR) közötti kompromisszumot jeleníti meg.
Bizonyos esetekben célszerűbb kiértékelni az osztályozót a Precision-Recall Görbe (AUPRC) mérés alapján. Az AUPRC-görbe a következő arányokat egyesíti:
- A pontosság vagy a pozitív prediktív érték (PPV)
- Visszahívás vagy TPR
# Use the PRROC package to help calculate and plot AUC-ROC and AUPRC
install.packages("PRROC", quiet = TRUE)
library(PRROC)
A AUC-ROC és az AUPRC-metrikák kiszámítása
A két modell AUC-ROC és AUPRC-metrikáinak kiszámítása és ábrázolása.
Kiegyensúlyozatlan adatkészlet
Az előrejelzések kiszámítása:
fg <- preds[test_df$Class == 1]
bg <- preds[test_df$Class == 0]
A AUC-ROC görbe alatti terület nyomtatása:
# Compute AUC-ROC
roc <- roc.curve(scores.class0 = fg, scores.class1 = bg, curve = TRUE)
print(roc)
Ábrázolja a AUC-ROC görbét:
# Plot AUC-ROC
plot(roc)
Az AUPRC-görbe nyomtatása:
# Compute AUPRC
pr <- pr.curve(scores.class0 = fg, scores.class1 = bg, curve = TRUE)
print(pr)
Az AUPRC-görbe ábrázolása:
# Plot AUPRC
plot(pr)
Kiegyensúlyozott (SMOTE-on keresztüli) adatkészlet
Az előrejelzések kiszámítása:
smote_fg <- smote_preds[test_df$Class == 1]
smote_bg <- smote_preds[test_df$Class == 0]
A AUC-ROC görbe nyomtatása:
# Compute AUC-ROC
smote_roc <- roc.curve(scores.class0 = smote_fg, scores.class1 = smote_bg, curve = TRUE)
print(smote_roc)
Ábrázolja a AUC-ROC görbét:
# Plot AUC-ROC
plot(smote_roc)
Az AUPRC-görbe nyomtatása:
# Compute AUPRC
smote_pr <- pr.curve(scores.class0 = smote_fg, scores.class1 = smote_bg, curve = TRUE)
print(smote_pr)
Az AUPRC-görbe ábrázolása:
# Plot AUPRC
plot(smote_pr)
A korábbi ábrák egyértelműen azt mutatják, hogy a kiegyensúlyozott adathalmazon betanított modell felülmúlja a kiegyensúlyozatlan adatkészleten betanított modellt, mind AUC-ROC, mind az AUPRC-pontszámok esetében. Ez az eredmény arra utal, hogy az SMOTE hatékonyan javítja a modell teljesítményét a nagymértékben kiegyensúlyozatlan adatok használatakor.