メインコンテンツまでスキップ
非公開のページ
このページは非公開です。 検索対象外となり、このページのリンクに直接アクセスできるユーザーのみに公開されます。

レガシービジュアライゼーション

この記事では、従来の Databricks の視覚化について説明します。 現在の視覚化のサポートについては、「 Databricks ノートブックでの視覚化 」を参照してください。

Databricks は、Python と R の視覚化ライブラリもネイティブにサポートしており、サードパーティのライブラリをインストールして使用できます。

従来のビジュアライゼーションの作成

結果セルから従来のビジュアライゼーションを作成するには、「 + 」をクリックし、「 レガシービジュアライゼーション 」を選択します。

従来のビジュアライゼーションは、豊富なプロット タイプのセットをサポートしています。

チャートの種類

従来のグラフの種類を選択して構成する

棒グラフを選択するには、棒グラフ アイコン チャートボタンをクリックします。

棒グラフのアイコン

別のプロットボタンダウン タイプを選択するには、バー チャート の右側にあるチャートボタン [] をクリックし、プロット タイプを選択します。

レガシーチャートツールバー

折れ線グラフと横棒グラフの両方に、クライアント側の豊富なインタラクションをサポートする組み込みツールバーがあります。

グラフツールバー

グラフを設定するには、[ プロット オプション... ] をクリックします。

プロットオプション

折れ線グラフには、Y 軸の範囲の設定、ポイントの表示と非表示、対数スケールでの Y 軸の表示など、いくつかのカスタム グラフ オプションがあります。

従来のグラフの種類に関する情報については、以下を参照してください。

グラフ間での色の一貫性

Databricks では、従来のグラフ間で 2 種類の色の一貫性 (シリーズ セットとグローバル) がサポートされています。

Series Set Color Consistencyは、シリーズが 同じ値で順序が異なる (たとえば、A = ["Apple", "Orange", "Banana"] と B = ["Orange", "Banana", "Apple"])。 値はプロット前にソートされるため、両方の凡例がソートされます 同じ方法(["Apple", "Banana", "Orange"])で、同じ値に同じ色が与えられます。 しかし シリーズC = ["Orange", "Banana"]の場合、セットと色が一致しません Aは、セットが同じではないからです。 並べ替えアルゴリズムは、最初の色を "Banana" に割り当てます。 セットCですが、セットAでは2番目の色が「バナナ」になります。これらのシリーズを色の一貫性を持たせたい場合は、 グラフの色の一貫性をグローバルに指定できます。

グローバル カラーの一貫性では、値に関係なく、各値は常に同じ色にマップされます シリーズは持っています。各グラフでこれを有効にするには、[ グローバル色の一貫性 ] チェックボックスをオンにします。

グローバルに色を統一

注記

この一貫性を実現するために、Databricks は値から色に直接ハッシュします。 避けるために 衝突 (2 つの値がまったく同じ色になる場合)、ハッシュは大量の色のセットになります。 これには、見栄えの良い色や簡単に区別できる色が保証されないという副作用があります。 多くの色で、非常によく似た外観のものがあるはずです。

機械学習の視覚化

標準のグラフ タイプに加えて、従来のビジュアライゼーションでは、次の機械学習トレーニング パラメーターと結果がサポートされています。

残 差

線形回帰とロジスティック回帰では、 適合値と残差 のプロットをレンダリングできます。 このプロットを取得するには、モデルと DataFrame を指定します。

次の例では、都市人口から住宅販売価格データへの線形回帰を実行し、残差と適合データを表示します。

Python
# 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)

残留物を表示します

ROC曲線

ロジスティック回帰では、 ROC 曲線をレンダリングできます。 このプロットを取得するには、モデル、 fit メソッドに入力される準備済みデータ、およびパラメーター "ROC"を指定します。

次の例では、個人のさまざまな属性から、個人が年間 <=50K または >50k を稼ぐかどうかを予測する分類器を開発します。 Adult データセットは国勢調査データから取得され、48842 人の個人とその年収に関する情報で構成されています。

このセクションのコード例では、ワンホット エンコードを使用しています。

Python

# 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")

ディスプレイROC

残差を表示するには、 "ROC" パラメーターを省略します。

Python
display(lrModel, preppedDataDF)

ロジスティック回帰残差の表示

決定木

従来のビジュアライゼーションは、決定木のレンダリングをサポートします。

この視覚化を取得するには、決定木モデルを指定します。

次の例では、手書きの数字の画像の MNIST データセットから数字 (0 から 9) を認識するようにツリーをトレーニングし、ツリーを表示します。

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])

Display 決定木

構造化ストリーミング DataFrames

ストリーミング クエリの結果をリアルタイムで視覚化するには、Scala と Python で構造化ストリーミング DataFrame display ことができます。

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

display 次のオプション・パラメーターをサポートします。

  • streamName: ストリーミング クエリ名。
  • trigger (Scala) と processingTime (Python): ストリーミング クエリの実行頻度を定義します。 指定しない場合、前の処理が完了するとすぐに、新しいデータが利用可能かどうかがチェックされます。 本番運用のコストを削減するために、Databricks は常に トリガー間隔を設定することをおすすめします。デフォルトのトリガー間隔は 500 ミリ秒です。
  • checkpointLocation: システムがすべてのチェックポイント情報を書き込む場所。 指定しない場合、DBFS に一時的なチェックポイント・ロケーションが自動的に生成されます。 ストリームが中断したところからデータの処理を続行するには、チェックポイントの場所を指定する必要があります。 Databricks 、本番運用では 、常に checkpointLocationオプションを指定することを推奨しています。
Python
streaming_df = spark.readStream.format("rate").load()
display(streaming_df.groupBy().count(), processingTime = "5 seconds", checkpointLocation = "dbfs:/<checkpoint-path>")

これらのパラメーターの詳細については、「 ストリーミング クエリの開始」を参照してください。

displayHTML 機能

Databricks プログラミング言語ノートブック (Python、R、Scala) は、 displayHTML 関数を使用した HTML グラフィックスをサポートしています。 関数には、任意の HTML、CSS、または JavaScript コードを渡すことができます。 この関数は、D3 などの JavaScript ライブラリを使用した対話型グラフィックスをサポートします。

displayHTMLの使用例については、以下を参照してください。

注記

displayHTML iframe はドメイン databricksusercontent.comから提供され、iframe サンドボックスには allow-same-origin 属性が含まれます。databricksusercontent.com はブラウザからアクセスできる必要があります。 現在、企業ネットワークによってブロックされている場合は、許可リストに追加する必要があります。

画像

イメージ データ型を含む列は、リッチ HTML としてレンダリングされます。 Databricks は、Spark ImageSchema に一致するDataFrame列の画像サムネイルのレンダリングを試みます。サムネイルレンダリングは、 spark.read.format('image') 機能を通じて正常に読み取られた画像に対して機能します。 他の方法で生成された画像値の場合、 Databricks は 1、3、または 4 チャンネル画像 (各チャンネルが 1 バイトで構成される) のレンダリングをサポートしますが、次の制約があります。

  • One-チャンネル images : mode フィールドは 0 にする必要があります。 heightwidth、および nChannels フィールドは、 data フィールドのバイナリ画像データを正確に記述する必要があります。
  • 3 チャンネル画像 : mode フィールドは 16 に等しくなければなりません。 heightwidth、および nChannels フィールドは、 data フィールドのバイナリ画像データを正確に記述する必要があります。 data フィールド ピクセル データは 3 バイトのチャンクで含まれ、チャンネルの順序(blue, green, red) 各ピクセル。
  • 4 チャンネル画像 : mode フィールドは 24 に等しくなければなりません。 heightwidth、および nChannels フィールドは、 data フィールドのバイナリ画像データを正確に記述する必要があります。 data フィールド ピクセル データは 4 バイトのチャンクで、チャンネルの順序は [(blue, green, red, alpha) ピクセルごとに。

いくつかの画像を含むフォルダがあるとします。

画像データのフォルダ

画像を DataFrame に読み込んでから DataFrame を表示すると、Databricks は画像のサムネイルをレンダリングします。

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

画像DataFrameの表示

Python での視覚化

このセクションの内容:

シーボーン

他の Python ライブラリを使用してプロットを生成することもできます。 Databricks Runtime には、 seaborn 視覚化ライブラリが含まれています。 seaborn プロットを作成するには、ライブラリをインポートし、プロットを作成して、プロットを display 関数に渡します。

Python
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)

シーボーンプロット

その他の Python ライブラリ

R での視覚化

R でデータをプロットするには、次のように display 関数を使用します。

R
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"))

デフォルトの R プロット 関数を使用できます。

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

R のデフォルトプロット

任意の R 視覚化パッケージを使用することもできます。 R ノートブックは、結果のプロットを .png としてキャプチャし、インラインで表示します。

このセクションの内容:

格子

Lattice パッケージは、トレリスグラフ (1 つ以上の他の変数を条件として、変数または変数間の関係を表示するグラフ) をサポートしています。

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

Rラティスプロット

ダンデファ

DandEFA パッケージはタンポポプロットをサポートしています。

R
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)

R DandEFA プロット

Plotly

Plotly Rパッケージは、Rのhtmlwidgetsに依存しています。インストール手順とノートブックについては、 htmlwidgetsを参照してください。

その他の R ライブラリ

Scala でのビジュアライゼーション

Scala でデータをプロットするには、次のように display 関数を使用します。

Scala
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"))

Python と Scala のディープダイブノートブック

Python の視覚化の詳細については、ノートブックを参照してください。

Scala の視覚化の詳細については、ノートブックを参照してください。