Udostępnij za pośrednictwem


Starsze wizualizacje

W tym artykule opisano starsze wizualizacje usługi Azure Databricks. Aby uzyskać bieżącą obsługę wizualizacji, zobacz Wizualizacje w notesach usługi Databricks.

Usługa Azure Databricks również natywnie obsługuje biblioteki wizualizacji w języku Python i języku R oraz umożliwia instalowanie bibliotek innych firm i korzystanie z nich.

Tworzenie starszej wizualizacji

Aby utworzyć Starszą Wizualizację na podstawie komórki wyników, kliknij + i selectStarsza Wizualizacja.

Starsze wizualizacje obsługują rozbudowane set typów wykresów:

Typy wykresów

Wybieranie i konfigurowanie starszego typu wykresu

Aby wybrać wykres słupkowy, kliknij ikonę Przycisk wykresuwykresu słupkowego:

Ikona wykresu słupkowego

Aby wybrać inny typ wykresu, kliknij Przycisk strzałki w dół po prawej stronie wykresu Przycisk wykresu słupkowego i wybierz typ wykresu.

Pasek narzędzi starszego wykresu

Wykresy liniowe i słupkowy mają wbudowany pasek narzędzi obsługujący bogaty set interakcji po stronie klienta.

Pasek narzędzi wykresu

Aby skonfigurować wykres, kliknij przycisk Opcje wykresu....

Opcje wykresu

Wykres liniowy ma kilka niestandardowych opcji wykresu: ustawienie zakresu osi Y, pokazywanie i ukrywanie punktów oraz wyświetlanie osi Y przy użyciu skali logarytmicznej.

Aby uzyskać informacje o starszych typach wykresów, zobacz:

Spójność kolorów między wykresami

Usługa Azure Databricks obsługuje dwa rodzaje spójności kolorów na starszych wykresach: serie set i globalne.

Series set spójność kolorów przypisuje ten sam kolor do tej samej wartości, jeśli masz serię o tej samej values, ale w różnych kolejnościach (na przykład A = ["Apple", "Orange", "Banana"] i B = ["Orange", "Banana", "Apple"]). values są sortowane przed wykreśleniem, więc obie legendy są sortowane w taki sam sposób (["Apple", "Banana", "Orange"]), a te same values mają te same kolory. Jeśli jednak masz serię C = ["Orange", "Banana"], nie będzie to zgodne z kolorem set A, ponieważ set nie jest taka sama. Algorytm sortowania przypisze pierwszy kolor do "Banana" w set C, ale drugi kolor na "Banana" w set A. Jeśli chcesz, aby te serie były spójne na poziomie kolorów, możesz określić, że wykresy powinny mieć globalną spójność kolorów.

W globalnej spójności kolorów każda wartość jest zawsze przypisywana do tego samego koloru, niezależnie od tego, co values mają serie. Aby włączyć tę opcję dla każdego wykresu, selectglobalnej spójności kolorów pole wyboru.

Globalna spójność koloru

Uwaga

Aby osiągnąć tę spójność, Azure Databricks hashuje bezpośrednio z values do kolorów. Aby uniknąć kolizji (where dwa values przejść do dokładnie tego samego koloru), skrót jest duży set kolorów, który ma efekt uboczny, że ładnie wyglądające lub łatwo rozróżnialne kolory nie mogą być gwarantowane; z wieloma kolorami są powiązane z niektórymi, które są bardzo podobne.

Wizualizacje uczenia maszynowego

Oprócz standardowych typów wykresów starsze wizualizacje obsługują następujące szkolenia uczenia maszynowego parameters i wyniki:

Wartości resztkowe

W przypadku regresji liniowej i logistycznej można renderować wykres dopasowany względem reszt . Aby uzyskać ten wykres, podaj model i ramkę danych.

W poniższym przykładzie przeprowadzono regresję liniową dotyczącą populacji miasta do danych dotyczących cen sprzedaży, a następnie wyświetlono wartości resztkowe w porównaniu z danymi dopasowanymi.

# Load data
pop_df = spark.read.csv("/databricks-datasets/samples/population-vs-price/data_geo.csv", header="true", inferSchema="true")

# Drop rows with missing values and rename the feature and label columns, replacing spaces with _
from pyspark.sql.functions import col
pop_df = pop_df.dropna() # drop rows with missing values
exprs = [col(column).alias(column.replace(' ', '_')) for column in pop_df.columns]

# Register a UDF to convert the feature (2014_Population_estimate) column vector to a VectorUDT type and apply it to the column.
from pyspark.ml.linalg import Vectors, VectorUDT

spark.udf.register("oneElementVec", lambda d: Vectors.dense([d]), returnType=VectorUDT())
tdata = pop_df.select(*exprs).selectExpr("oneElementVec(2014_Population_estimate) as features", "2015_median_sales_price as label")

# Run a linear regression
from pyspark.ml.regression import LinearRegression

lr = LinearRegression()
modelA = lr.fit(tdata, {lr.regParam:0.0})

# Plot residuals versus fitted data
display(modelA, tdata)

Wyświetlanie wartości resztkowych

Krzywe ROC

W przypadku regresji logistycznej można renderować krzywą ROC . Aby uzyskać ten wykres, podaj model, wstępnie wstępnie wprowadzone dane do fit metody i parametr "ROC".

Poniższy przykład opracowuje klasyfikator, który przewiduje, czy dana osoba zarabia <=50K lub >50 tys. rocznie z różnych atrybutów danej osoby. Zestaw danych o osobach dorosłych pochodzi ze spisu i składa się z informacji na temat 48 842 osób i ich rocznych dochodów.

W przykładowym kodzie w tej sekcji używane jest kodowanie typu „1 z n”.


# This code uses one-hot encoding to convert all categorical variables into binary vectors.

schema = """`age` DOUBLE,
`workclass` STRING,
`fnlwgt` DOUBLE,
`education` STRING,
`education_num` DOUBLE,
`marital_status` STRING,
`occupation` STRING,
`relationship` STRING,
`race` STRING,
`sex` STRING,
`capital_gain` DOUBLE,
`capital_loss` DOUBLE,
`hours_per_week` DOUBLE,
`native_country` STRING,
`income` STRING"""

dataset = spark.read.csv("/databricks-datasets/adult/adult.data", schema=schema)

from pyspark.ml import Pipeline
from pyspark.ml.feature import OneHotEncoder, StringIndexer, VectorAssembler

categoricalColumns = ["workclass", "education", "marital_status", "occupation", "relationship", "race", "sex", "native_country"]

stages = [] # stages in the Pipeline
for categoricalCol in categoricalColumns:
    # Category indexing with StringIndexer
    stringIndexer = StringIndexer(inputCol=categoricalCol, outputCol=categoricalCol + "Index")
    # Use OneHotEncoder to convert categorical variables into binary SparseVectors
    encoder = OneHotEncoder(inputCols=[stringIndexer.getOutputCol()], outputCols=[categoricalCol + "classVec"])
    # Add stages.  These are not run here, but will run all at once later on.
    stages += [stringIndexer, encoder]

# Convert label into label indices using the StringIndexer
label_stringIdx = StringIndexer(inputCol="income", outputCol="label")
stages += [label_stringIdx]

# Transform all features into a vector using VectorAssembler
numericCols = ["age", "fnlwgt", "education_num", "capital_gain", "capital_loss", "hours_per_week"]
assemblerInputs = [c + "classVec" for c in categoricalColumns] + numericCols
assembler = VectorAssembler(inputCols=assemblerInputs, outputCol="features")
stages += [assembler]

# Run the stages as a Pipeline. This puts the data through all of the feature transformations in a single call.

partialPipeline = Pipeline().setStages(stages)
pipelineModel = partialPipeline.fit(dataset)
preppedDataDF = pipelineModel.transform(dataset)

# Fit logistic regression model

from pyspark.ml.classification import LogisticRegression
lrModel = LogisticRegression().fit(preppedDataDF)

# ROC for data
display(lrModel, preppedDataDF, "ROC")

Wyświetlanie krzywej ROC

Aby wyświetlić wartości resztkowe, pomiń parametr "ROC":

display(lrModel, preppedDataDF)

Wyświetlanie wartości resztkowych regresji logistycznej

drzewa decyzyjne

Starsze wizualizacje obsługują renderowanie drzewa decyzyjnego.

Aby uzyskać tę wizualizację, podaj model drzewa decyzyjnego.

Poniższe przykłady trenują drzewo do rozpoznawania cyfr (0–9) z zestawu danych MNIST obrazów cyfr zapisanych ręcznie, a następnie wyświetlania drzewa.

Python

trainingDF = spark.read.format("libsvm").load("/databricks-datasets/mnist-digits/data-001/mnist-digits-train.txt").cache()
testDF = spark.read.format("libsvm").load("/databricks-datasets/mnist-digits/data-001/mnist-digits-test.txt").cache()

from pyspark.ml.classification import DecisionTreeClassifier
from pyspark.ml.feature import StringIndexer
from pyspark.ml import Pipeline

indexer = StringIndexer().setInputCol("label").setOutputCol("indexedLabel")

dtc = DecisionTreeClassifier().setLabelCol("indexedLabel")

# Chain indexer + dtc together into a single ML Pipeline.
pipeline = Pipeline().setStages([indexer, dtc])

model = pipeline.fit(trainingDF)
display(model.stages[-1])

Scala

val trainingDF = spark.read.format("libsvm").load("/databricks-datasets/mnist-digits/data-001/mnist-digits-train.txt").cache
val testDF = spark.read.format("libsvm").load("/databricks-datasets/mnist-digits/data-001/mnist-digits-test.txt").cache

import org.apache.spark.ml.classification.{DecisionTreeClassifier, DecisionTreeClassificationModel}
import org.apache.spark.ml.feature.StringIndexer
import org.apache.spark.ml.Pipeline

val indexer = new StringIndexer().setInputCol("label").setOutputCol("indexedLabel")
val dtc = new DecisionTreeClassifier().setLabelCol("indexedLabel")
val pipeline = new Pipeline().setStages(Array(indexer, dtc))

val model = pipeline.fit(trainingDF)
val tree = model.stages.last.asInstanceOf[DecisionTreeClassificationModel]

display(tree)

Wyświetlanie drzewa decyzyjnego

Ramki danych przesyłania strumieniowego ze strukturą

Aby zwizualizować wynik zapytania przesyłania strumieniowego w czasie rzeczywistym, można użyć funkcji display względem ramki danych przesyłania strumieniowego ze strukturą w językach Scala i Python.

Python

streaming_df = spark.readStream.format("rate").load()
display(streaming_df.groupBy().count())

Scala

val streaming_df = spark.readStream.format("rate").load()
display(streaming_df.groupBy().count())

display obsługuje następujące opcjonalne parameters:

  • streamName: nazwa zapytania przesyłania strumieniowego.
  • trigger (Scala) i processingTime (Python): określa częstotliwość uruchamiania zapytania przesyłania strumieniowego. Jeśli nie zostanie to określone, system sprawdzi dostępność nowych danych zaraz po zakończeniu poprzedniego przetwarzania. Aby zmniejszyć koszt produkcji, usługa Databricks zaleca, aby zawsze set ustawić interwał wyzwalacza. Domyślny interwał wyzwalacza to 500 ms.
  • checkpointLocation: lokalizacja where system zapisuje wszystkie informacje o punkcie kontrolnym. Jeśli nie zostanie to określone, system automatycznie generuje tymczasową lokalizację punktów kontrolnych w systemie DBFS. Aby strumień mógł kontynuować przetwarzanie danych z where w miejscu, w którym został przerwany, musisz podać lokalizację punktu kontrolnego. W usłudze Databricks zalecane jest, aby w środowisku produkcyjnym zawsze określić opcję checkpointLocation.

Python

streaming_df = spark.readStream.format("rate").load()
display(streaming_df.groupBy().count(), processingTime = "5 seconds", checkpointLocation = "dbfs:/<checkpoint-path>")

Scala

import org.apache.spark.sql.streaming.Trigger

val streaming_df = spark.readStream.format("rate").load()
display(streaming_df.groupBy().count(), trigger = Trigger.ProcessingTime("5 seconds"), checkpointLocation = "dbfs:/<checkpoint-path>")

Aby uzyskać więcej informacji na temat tych parameters, zobacz Rozpoczynanie zapytań przesyłania strumieniowego.

Funkcja displayHTML

Notesy języka programowania (Python, R i Scala) w usłudze Azure Databricks obsługują grafiki HTML przy użyciu funkcji displayHTML. Można przekazać funkcję dowolnego kodu HTML, CSS lub JavaScript. Ta funkcja obsługuje interaktywne grafiki przy użyciu bibliotek JavaScript, takich jak D3.

Aby poznać przykłady korzystania z funkcji displayHTML, zobacz:

Uwaga

Element iframe displayHTML jest obsługiwany z poziomu domeny databricksusercontent.com, a piaskownica iframe zawiera atrybut allow-same-origin. Domena databricksusercontent.com musi być dostępna z poziomu przeglądarki. Jeśli jest ona obecnie zablokowana przez sieć korporacyjną, musi zostać dodana do listy dozwolonych list.

Obrazów

Columns zawierające dane typu obrazu są renderowane jako bogaty kod HTML. Usługa Azure Databricks próbuje renderować miniatury obrazów dla DataFramecolumns dopasowania Spark ImageSchema. Renderowanie miniatur działa dla wszystkich obrazów pomyślnie odczytanych spark.read.format('image') za pośrednictwem funkcji. W przypadku obrazów values generowanych za pomocą innych środków usługa Azure Databricks obsługuje renderowanie obrazów 1, 3 lub 4 kanałów (where każdy kanał składa się z jednego bajtu), z następującymi ograniczeniami:

  • Obrazy z jednym kanałem: pole mode musi być równe 0. Pola height, width i nChannels muszą precyzyjnie opisywać dane obrazu binarnego w polu data.
  • Obrazy z trzema kanałami: pole mode musi być równe 16. Pola height, width i nChannels muszą precyzyjnie opisywać dane obrazu binarnego w polu data. Pole data musi zawierać dane pikseli we fragmentach z trzema bajtami, dzięki czemu kanał porządkuje element (blue, green, red) dla każdego piksela.
  • Obrazy z czterema kanałami: pole mode musi być równe 24. Pola height, width i nChannels muszą precyzyjnie opisywać dane obrazu binarnego w polu data. Pole data musi zawierać dane pikseli we fragmentach z czterema bajtami, dzięki czemu kanał porządkuje element (blue, green, red, alpha) dla każdego piksela.

Przykład

Załóżmy, że masz folder zawierający obrazy:

Folder danych obrazu

Jeśli odczytujesz obrazy w ramce danych, a następnie wyświetlisz ramkę danych, usługa Azure Databricks renderuje miniatury obrazów:

image_df = spark.read.format("image").load(sample_img_dir)
display(image_df)

Wyświetlanie ramki danych obrazu

Wizualizacje w języku Python

W tej sekcji:

Biblioteka seaborn

Możesz również użyć innych bibliotek języka Python do generate wykresów. Środowisko Databricks Runtime zawiera bibliotekę wizualizacji seaborn. Aby utworzyć wykres seaborn, zaimportuj bibliotekę, utwórz wykres i przekaż wykres do funkcji display.

import seaborn as sns
sns.set(style="white")

df = sns.load_dataset("iris")
g = sns.PairGrid(df, diag_sharey=False)
g.map_lower(sns.kdeplot)
g.map_diag(sns.kdeplot, lw=3)

g.map_upper(sns.regplot)

display(g.fig)

Wykres seaborn

Inne biblioteki języka Python

Wizualizacje w języku R

Aby utworzyć wykres danych w języku R, użyj funkcji display w następujący sposób:

library(SparkR)
diamonds_df <- read.df("/databricks-datasets/Rdatasets/data-001/csv/ggplot2/diamonds.csv", source = "csv", header="true", inferSchema = "true")

display(arrange(agg(groupBy(diamonds_df, "color"), "price" = "avg"), "color"))

Możesz użyć domyślnej funkcji wykresu języka R.

fit <- lm(Petal.Length ~., data = iris)
layout(matrix(c(1,2,3,4),2,2)) # optional 4 graphs/page
plot(fit)

Domyślny wykres języka R

Możesz również użyć dowolnego pakietu wizualizacji języka R. Notes języka R przechwytuje powstający wykres jako plik .png i wyświetla go w postaci śródwierszowej.

W tej sekcji:

Lattice

Pakiet Lattice obsługuje wykresy Trellis — wykresy, w których jest wyświetlana zmienna lub relacja między zmiennymi, które są kondycjonowane w co najmniej jednej innej zmiennej.

library(lattice)
xyplot(price ~ carat | cut, diamonds, scales = list(log = TRUE), type = c("p", "g", "smooth"), ylab = "Log price")

Wykres Trellis języka R

DandEFA

Pakiet DandEFA obsługuje wykresy Dandelion.

install.packages("DandEFA", repos = "https://cran.us.r-project.org")
library(DandEFA)
data(timss2011)
timss2011 <- na.omit(timss2011)
dandpal <- rev(rainbow(100, start = 0, end = 0.2))
facl <- factload(timss2011,nfac=5,method="prax",cormeth="spearman")
dandelion(facl,bound=0,mcex=c(1,1.2),palet=dandpal)
facl <- factload(timss2011,nfac=8,method="mle",cormeth="pearson")
dandelion(facl,bound=0,mcex=c(1,1.2),palet=dandpal)

Wykres DandEFA języka R

Plotly

Pakiet Plotly R opiera się na htmlwidgets dla języka R. Aby uzyskać instrukcje dotyczące instalacji i notes, zobacz htmlwidgets.

Inne biblioteki języka R

Wizualizacje w języku Scala

Aby utworzyć wykres danych w języku Scala, użyj funkcji display w następujący sposób:

val diamonds_df = spark.read.format("csv").option("header","true").option("inferSchema","true").load("/databricks-datasets/Rdatasets/data-001/csv/ggplot2/diamonds.csv")

display(diamonds_df.groupBy("color").avg("price").orderBy("color"))

Szczegółowe notesy dla języków Python i Scala

Szczegółowe informacje na temat wizualizacji języka Python można znaleźć w notesie:

Szczegółowe informacje na temat wizualizacji języka Scala można znaleźć w notesie: