Das Ziel dieser Stelle ist es, verschiedene Funktionen anhand von Beispielen zu demonstrieren, die einem Datenwissenschaftler begegnen können. In mehreren Notebooks werden Aspekte des grundlegenden Plotting mit HoloViews, der Interaktivität mit dem Panel und des Umgangs mit Echtzeit- oder Streaming-Daten behandelt.
Alles was Sie brauchen, um mit den HoloViz-Bibliotheken zu beginnen, ist:
conda install -c pyviz holoviz
Wir finden die Lernkurve von Dash ziemlich schwierig. Ehrlich gesagt, es fühlte sich nicht wie eine vollständige Lösung an, sondern eher wie ein Mischmasch aus Flask, HTML und Plotly. Schlimmer noch, die Callbacks oder die Verbindung zwischen Widgets, die Interaktivität ermöglichen, waren eine Art Alptraum der Syntax:
@app.callback( dash.dependencies.Output('precision-graph','figure'), [dash.dependencies.Input('pred-slider','value')] ) def update_precision(value): res = hard_pred.query('Break == @value') return { 'data':[go.Scatter( x = hard_pred.TP/(hard_pred.TP+hard_pred.FN), y = hard_pred.TP/(hard_pred.TP+hard_pred.FP), mode = 'markers', marker = {'opacity':.5, 'color':'rgb(0,100,200)'}, name = 'totals'), go.Scatter( # recall TP / (TP + FN) x=res.TP/(res.TP+res.FN), # precision TP / (TP + FP) y=(res.TP/(res.TP+res.FP))*1.05, mode='markers', marker = {'symbol':'triangle-down', 'size':15, "opacity":1, "color":'rgb(22, 199, 229)'}, name = value ) ], 'layout': go.Layout( height=400, title = 'Precision-Recall Graph', xaxis = {'title' :'Recall', 'range':[0,1], 'fixedrange':True }, yaxis = {'title':'Precision', 'range':[0,1], 'fixedrange':True }, paper_bgcolor = bgcolor, plot_bgcolor=bgcolor, font=dict(family='helvetica', size=14, color=fontcolor) ) }
Die Syntax erfordert einen Dekorator, Callback, mit mehreren Funktionsdeklarationen und gibt einen neuen Plotly-Plot zurück. Wir hätten den Plotting-Code in eine Funktion einpacken können (sollen), aber dennoch kann Plotly ziemlich speziell sein. Trotzdem ist es eine vielseitige Bibliothek, aber ich wünschte, es gäbe etwas Einfacheres, so dass ich mehr Zeit für die Programmierung und weniger Zeit mit dem Lesen der Dokumentation aufwenden.
Was ist HoloViz?
HoloViz bietet eine vollständige Suite von Datenvisualisierungstools für:
- Inline-Plotting für Notebooks
- Dashboards
- Eigenständige (Web-)Anwendungen
HoloViz spielt gut mit den Bibliotheken, aus denen es besteht:
- Bokeh
- HoloViews
- GeoViews
- Datashader
- Panel
Die meisten HoloViews-basierten Beispiele von HoloViz verwenden Bokeh zum Rendern der eigentlichen Plots, aber Sie können auch Plotly- oder Matplotlib-Backends verwenden, wenn Sie es vorziehen…
Und mir persönlich gefällt, dass HoloViz von den Leuten in Anaconda entwickelt und unterstützt wird.
Regressionsmetriken mit HoloViz
https://github.com/dajor/HoloViz-Example
Ich wollte eine Visualisierung erstellen, die mehrere Ziele erreicht:
- Visualisierung der vorhergesagten Werte gegenüber den tatsächlichen Werten
- So viele Daten wie möglich zeigen
- Schnell ein Gefühl dafür bekommen, wo die Daten liegen
Ich verwende die Daten aus dem Blue Book for Bulldozers-Datensatz. Ich habe einen zufälligen Forest Regressor gebildet, um den Preis vorherzusagen. Es wurde keine Mühe auf die Optimierung dieses Modells verwendet, ich brauchte nur einige Vorhersagen gegen einen wahren Wert zur Veranschaulichung. Diese Daten sind im Repo (die wahren und vorhergesagten Werte) enthalten.
Die Metrik-Tabelle
Ich bin dieses Problem auf zwei Arten angegangen:
- Der einfache Weg (Pandas 🐼)
- Noch einfacher Weg (Holoview)
Das Ausgeben einer Pandas-Tabelle ist einfach und genial:
cols = ['type', 'mae', 'mape','mse', 'msle', 'rmse', 'rmsle', 'r2']# used cols to reorder columns
pd.DataFrame(metrics, columns=cols)
Die HoloViews-Tabelle:
hv.Table(metrics, cols)
Die meisten HoloView-Objekte funktionieren auf diese Weise. Eine einzige Zeile zur Erstellung einer Visualisierung. Eine optionale Klassenfunktion .opts() ermöglicht verschiedene Formatierungsoptionen. Einige HoloViews-Objekte verfügen über weitere, nützliche Funktionen, die zu Plots hinzugefügt werden können. Viele der Formatierungsoptionen wurden in diesem Beitrag weggelassen, aber sind im begleitenden Notebook enthalten.
Nebeneinanderliegende wahre vs. vorhergesagte Parzellen
HoloViews bietet durch die Unterstützung von Datashader eine einfache Möglichkeit, viele Daten anzuzeigen. Datashader bietet eine Möglichkeit, Milliarden von Punkten zu visualisieren und zu plotten… Ich konnte keine ähnliche Funktionalität in Plotly finden. KORREKTUR: James Bednar wies darauf hin, dass Plotly jetzt zwar Datashader unterstützt, aber die Integration in HoloViz bleibt natürlich größer.
Mit HoloViews ist es auch einfacher, nebeneinander liegende Diagramme zu erzeugen oder mehrere Diagramme auf demselben Diagramm zu überlagern. Verwenden Sie einfach + für die Seite-an-Seite-Darstellung und * für die Überlagerung von Diagrammen:
# a lot of the options for labeling and coloring left off for readabilitytrain_pts = hv.Scatter(res_train) valid_pts = hv.Scatter(res_valid)pt_train = datashade(train_pts) pt_valid = datashade(valid_pts, cmap='red')# magic overloaded operators pt_train + pt_valid + (pt_train * pt_valid)
Wahre gegen vorhergesagte Heatmaps
Um mein drittes Ziel hin zu bekommen (ein Gefühl dafür zu bekommen, wo die Daten “liegen”), bietet HoloViews eine einfache Möglichkeit, Daten zu bündeln und Histogramme zu den Achsen hinzuzufügen. Dies ist eine wirklich bequeme Möglichkeit, die Konzentration von Daten zu visualisieren, die in der vorherigen Darstellung möglicherweise schwieriger zu beobachten ist.
Eine Handlung wie diese kann schnell zeigen, wo ein bestimmtes Modell wahrscheinlich die größte Vorhersagekraft hat.
# Die .hist-Methode fügt die Histogrammdichten auf den Achsen hinzu. hex_train = hv \ .HexTiles(res_train) \ .hist(dimension=['train_true','train_pred'])hex_valid = hv \ .HexTiles(res_valid) \ .hist(dimension=['valid_true', 'valid_pred'])hex_train + hex_valid
Andere Tipps:
- Die Dinge unter HoloViz spielen gut mit anderen Bibliotheken zusammen. Zum Beispiel können Sie überall dort, wo cmap als Parameter akzeptiert wird, eine Farbkarte aus der matplotlib ersetzen: aus der matplotlib import cm
- Die Operatoren + und * sind nützlich, um mehrere verknüpfte Plots zu erstellen, aber die Panel-Bibliothek enthält mehrere hilfreiche Layout-Container (die im nächsten Abschnitt behandelt werden).
- Sie können andere Bibliotheken als das HoloViews-Backend verwenden, obwohl das Standard-Bokeh ziemlich vielseitig ist.
Als Nächstes werde ich eine interaktive Einführung in benutzerdefinierte interaktive Widgets in Jupyter mit einem Visualisierungs-Dashboard durchgehen, das für Klassifizierungsergebnisse verwendet werden kann. Dies wird auf dem hier vorgestellten Plotting mit zusätzlichen interaktiven Funktionen aufbauen.