Verwenden Sie Apache Spark MLlib zum Erstellen einer Machine Learning-Anwendung und zur Analyse eines Datasets.Use Apache Spark MLlib to build a machine learning application and analyze a dataset

Lernen Sie, wie man mithilfe von Apache Spark MLlib eine Machine-Learning-Anwendung erstellt, um eine einfache Vorhersageanalyse für ein offenes Dataset auszuführen.Learn how to use Apache Spark MLlib to create a machine learning application to do simple predictive analysis on an open dataset. Aus den in Spark-integrierten Machine Learning-Bibliotheken verwendet dieses Beispiel die Klassifizierung durch logistische Regression.From Spark's built-in machine learning libraries, this example uses classification through logistic regression.

MLLib ist eine Spark-Kernbibliothek, die viele Hilfsprogramme enthält, die nützlich für Aufgaben aus dem Bereich des Machine Learning sind, darunter befinden sich auch Hilfsprogramme für folgende Aufgaben:MLlib is a core Spark library that provides many utilities useful for machine learning tasks, including utilities that are suitable for:

  • ClassificationClassification
  • RegressionRegression
  • ClusteringClustering
  • ThemenmodellierungTopic modeling
  • Singulärwertzerlegung (Singular Value Decomposition, SVD) und Hauptkomponentenanalyse (Principal Component Analysis, PCA)Singular value decomposition (SVD) and principal component analysis (PCA)
  • Testen von Hypothesen und Berechnen von BeispielstatistikenHypothesis testing and calculating sample statistics

Grundlegendes zu Klassifizierung und logistischer RegressionUnderstand classification and logistic regression

Klassifizierung, eine Aufgabe im Bereich des Machine Learning, ist der Prozess, bei dem Eingabedaten in Kategorien sortiert werden.Classification, a popular machine learning task, is the process of sorting input data into categories. Der Klassifizierungsalgorithmus hat die Aufgabe, herauszufinden, wie „Labels“ den von Ihnen bereitgestellten Eingabedaten zugeordnet werden.It is the job of a classification algorithm to figure out how to assign "labels" to input data that you provide. So kann ein Machine-Learning-Algorithmus beispielsweise Börsendaten als Eingabe akzeptieren und die Daten in zwei Kategorien einteilen: Aktien, die Sie verkaufen sollten, und solche, die Sie behalten sollten.For example, you could think of a machine learning algorithm that accepts stock information as input and divides the stock into two categories: stocks that you should sell and stocks that you should keep.

Logistische Regression ist der Algorithmus, den Sie für die Klassifizierung verwenden.Logistic regression is the algorithm that you use for classification. Die API für die logistische Regression von Spark ist nützlich für eine binäre Klassifizierungoder für die Klassifizierung der Eingabedaten in einer von zwei Gruppen.Spark's logistic regression API is useful for binary classification, or classifying input data into one of two groups. Weitere Informationen zur logistischen Regression finden Sie in Wikipedia.For more information about logistic regressions, see Wikipedia.

Zusammenfassend gesagt, erzeugt der Prozess der logistischen Regression eine logistische Funktion , die verwendet werden kann, um die Wahrscheinlichkeit vorherzusagen, dass ein Eingabevektor zu einer Gruppe oder der anderen gehört.In summary, the process of logistic regression produces a logistic function that can be used to predict the probability that an input vector belongs in one group or the other.

Beispiel für Vorhersageanalysen für LebensmittelkontrolldatenPredictive analysis example on food inspection data

Sie verwenden in diesem Beispiel Spark, um einige Vorhersageanalysen für Lebensmittelkontrolldaten (Food_Inspections1.csv) auszuführen, die über das Datenportal von Chicago erhoben wurden.In this example, you use Spark to perform some predictive analysis on food inspection data (Food_Inspections1.csv) that was acquired through the City of Chicago data portal. Dieses Dataset enthält Informationen zu Lebensmittelkontrollen, die in Chicago durchgeführt wurden, darunter Informationen zu jedem überprüften Betrieb, (ggf.) gefundene Verstöße und die Ergebnisse der Überprüfung.This dataset contains information about food establishment inspections that were conducted in Chicago, including information about each establishment, the violations found (if any), and the results of the inspection. Die CSV-Datendatei ist bereits im Speicherkonto verfügbar, das dem Cluster in /HdiSamples/HdiSamples/FoodInspectionData/Food_Inspections1.csv zugeordnet ist.The CSV data file is already available in the storage account associated with the cluster at /HdiSamples/HdiSamples/FoodInspectionData/Food_Inspections1.csv.

In den folgenden Schritten entwickeln Sie ein Modell, um zu ermitteln, wie Sie eine Lebensmittelkontrolle erfolgreich bestehen können bzw. wann Sie nicht bestehen.In the steps below, you develop a model to see what it takes to pass or fail a food inspection.

Erstellen einer Apache Spark-MLlib-Machine Learning-AppCreate an Apache Spark MLlib machine learning app

  1. Erstellen Sie ein Jupyter Notebook mit dem PySpark-Kernel.Create a Jupyter notebook using the PySpark kernel. Informationen dazu finden Sie unter Erstellen eines Jupyter Notebooks.For the instructions, see Create a Jupyter notebook.

  2. Importieren Sie die Typen, die für diese Anwendung benötigt werden.Import the types required for this application. Kopieren Sie den folgenden Code, fügen Sie ihn in eine leere Zelle ein, und drücken Sie UMSCHALT+EINGABE.Copy and paste the following code into an empty cell, and then press SHIFT + ENTER.

    from pyspark.ml import Pipeline
    from pyspark.ml.classification import LogisticRegression
    from pyspark.ml.feature import HashingTF, Tokenizer
    from pyspark.sql import Row
    from pyspark.sql.functions import UserDefinedFunction
    from pyspark.sql.types import *
    

    Durch den PySpark-Kernel müssen Sie keine Kontexte explizit erstellen.Because of the PySpark kernel, you do not need to create any contexts explicitly. Die Spark- und Hive-Kontexte werden automatisch für Sie erstellt, wenn Sie die erste Codezelle ausführen.The Spark and Hive contexts are automatically created for you when you run the first code cell.

Erstellen des EingabedatenrahmensConstruct the input dataframe

Da die Rohdaten im CSV-Format vorliegen, können Sie den Spark-Kontext verwenden, um die Datei als unstrukturierten Text in den Arbeitsspeicher zu verschieben. Analysieren Sie dann mit der Python-CSV-Bibliothek jede Datenzeile.Because the raw data is in a CSV format, you can use the Spark context to pull the file into memory as unstructured text, and then use Python's CSV library to parse each line of the data.

  1. Führen Sie die folgenden Zeilen aus, um ein Resilient Distributed Dataset (RDD) zu erstellen, indem Sie die Eingabedaten importieren und analysieren.Run the following lines to create a Resilient Distributed Dataset (RDD) by importing and parsing the input data.

    def csvParse(s):
        import csv
        from StringIO import StringIO
        sio = StringIO(s)
        value = csv.reader(sio).next()
        sio.close()
        return value
    
    inspections = sc.textFile('/HdiSamples/HdiSamples/FoodInspectionData/Food_Inspections1.csv')\
                    .map(csvParse)
    
  2. Führen Sie den folgenden Code aus, um eine Zeile aus dem RDD abzurufen, damit Sie sich das Datenschema ansehen können:Run the following code to retrieve one row from the RDD, so you can take a look of the data schema:

    inspections.take(1)
    

    Die Ausgabe ist:The output is:

    [['413707',
        'LUNA PARK INC',
        'LUNA PARK  DAY CARE',
        '2049789',
        "Children's Services Facility",
        'Risk 1 (High)',
        '3250 W FOSTER AVE ',
        'CHICAGO',
        'IL',
        '60625',
        '09/21/2010',
        'License-Task Force',
        'Fail',
        '24. DISH WASHING FACILITIES: PROPERLY DESIGNED, CONSTRUCTED, MAINTAINED, INSTALLED, LOCATED AND OPERATED - Comments: All dishwashing machines must be of a type that complies with all requirements of the plumbing section of the Municipal Code of Chicago and Rules and Regulation of the Board of Health. OBSEVERD THE 3 COMPARTMENT SINK BACKING UP INTO THE 1ST AND 2ND COMPARTMENT WITH CLEAR WATER AND SLOWLY DRAINING OUT. INST NEED HAVE IT REPAIR. CITATION ISSUED, SERIOUS VIOLATION 7-38-030 H000062369-10 COURT DATE 10-28-10 TIME 1 P.M. ROOM 107 400 W. SURPERIOR. | 36. LIGHTING: REQUIRED MINIMUM FOOT-CANDLES OF LIGHT PROVIDED, FIXTURES SHIELDED - Comments: Shielding to protect against broken glass falling into food shall be provided for all artificial lighting sources in preparation, service, and display facilities. LIGHT SHIELD ARE MISSING UNDER HOOD OF  COOKING EQUIPMENT AND NEED TO REPLACE LIGHT UNDER UNIT. 4 LIGHTS ARE OUT IN THE REAR CHILDREN AREA,IN THE KINDERGARDEN CLASS ROOM. 2 LIGHT ARE OUT EAST REAR, LIGHT FRONT WEST ROOM. NEED TO REPLACE ALL LIGHT THAT ARE NOT WORKING. | 35. WALLS, CEILINGS, ATTACHED EQUIPMENT CONSTRUCTED PER CODE: GOOD REPAIR, SURFACES CLEAN AND DUST-LESS CLEANING METHODS - Comments: The walls and ceilings shall be in good repair and easily cleaned. MISSING CEILING TILES WITH STAINS IN WEST,EAST, IN FRONT AREA WEST, AND BY THE 15MOS AREA. NEED TO BE REPLACED. | 32. FOOD AND NON-FOOD CONTACT SURFACES PROPERLY DESIGNED, CONSTRUCTED AND MAINTAINED - Comments: All food and non-food contact equipment and utensils shall be smooth, easily cleanable, and durable, and shall be in good repair. SPLASH GUARDED ARE NEEDED BY THE EXPOSED HAND SINK IN THE KITCHEN AREA | 34. FLOORS: CONSTRUCTED PER CODE, CLEANED, GOOD REPAIR, COVING INSTALLED, DUST-LESS CLEANING METHODS USED - Comments: The floors shall be constructed per code, be smooth and easily cleaned, and be kept clean and in good repair. INST NEED TO ELEVATE ALL FOOD ITEMS 6INCH OFF THE FLOOR 6 INCH AWAY FORM WALL.  ',
        '41.97583445690982',
        '-87.7107455232781',
        '(41.97583445690982, -87.7107455232781)']]
    

    Die Ausgabe gewährt Ihnen einen Einblick in das Schema der Eingabedatei.The output gives you an idea of the schema of the input file. Sie enthält unter anderem den Namen und die Art jedes Betriebs, die Adresse, die Kontrolldaten und den Speicherort.It includes the name of every establishment, the type of establishment, the address, the data of the inspections, and the location, among other things.

  3. Führen Sie den folgenden Code aus, um einen Datenrahmen (df) und eine temporäre Tabelle (CountResults) mit einigen Spalten zu erstellen, die für Vorhersageanalysen geeignet sind.Run the following code to create a dataframe (df) and a temporary table (CountResults) with a few columns that are useful for the predictive analysis. sqlContext wird verwendet, um Transformationen strukturierter Daten auszuführen.sqlContext is used to perform transformations on structured data.

    schema = StructType([
    StructField("id", IntegerType(), False),
    StructField("name", StringType(), False),
    StructField("results", StringType(), False),
    StructField("violations", StringType(), True)])
    
    df = spark.createDataFrame(inspections.map(lambda l: (int(l[0]), l[1], l[12], l[13])) , schema)
    df.registerTempTable('CountResults')
    

    Die vier für uns interessanten Spalten im Datenrahmen sind id, name, results und violations.The four columns of interest in the dataframe are id, name, results, and violations.

  4. Führen Sie den folgenden Code aus, um eine kleine Stichprobe der Daten abzurufen:Run the following code to get a small sample of the data:

    df.show(5)
    

    Die Ausgabe ist:The output is:

    +------+--------------------+-------+--------------------+
    |    id|                name|results|          violations|
    +------+--------------------+-------+--------------------+
    |413707|       LUNA PARK INC|   Fail|24. DISH WASHING ...|
    |391234|       CAFE SELMARIE|   Fail|2. FACILITIES TO ...|
    |413751|          MANCHU WOK|   Pass|33. FOOD AND NON-...|
    |413708|BENCHMARK HOSPITA...|   Pass|                    |
    |413722|           JJ BURGER|   Pass|                    |
    +------+--------------------+-------+--------------------+
    

Grundlegendes zu den DatenUnderstand the data

Verschaffen Sie sich zunächst einen Überblick darüber, was in dem Dataset enthalten ist.Let's start to get a sense of what the dataset contains.

  1. Führen Sie den folgenden Code aus, um die unterschiedlichen Werte in der Spalte results anzuzeigen:Run the following code to show the distinct values in the results column:

    df.select('results').distinct().show()
    

    Die Ausgabe ist:The output is:

    +--------------------+
    |             results|
    +--------------------+
    |                Fail|
    |Business Not Located|
    |                Pass|
    |  Pass w/ Conditions|
    |     Out of Business|
    +--------------------+
    
  2. Führen Sie den folgenden Code aus, um die Verteilung der Ergebnisse zu visualisieren:Run the following code to visualize the distribution of these results:

    %%sql -o countResultsdf
    SELECT COUNT(results) AS cnt, results FROM CountResults GROUP BY results
    

    Durch den Befehl %%sql gefolgt von -o countResultsdf wird sichergestellt, dass die Ausgabe der Abfrage lokal auf dem Jupyter-Server (in der Regel der Hauptknoten des Clusters) beibehalten wird.The %%sql magic followed by -o countResultsdf ensures that the output of the query is persisted locally on the Jupyter server (typically the headnode of the cluster). Die Ausgabe wird als Pandas -Dataframe mit dem angegebenen Namen countResultsdfbeibehalten.The output is persisted as a Pandas dataframe with the specified name countResultsdf. Weitere Informationen zur %%sql-Magic sowie anderen für den PySpark-Kernel verfügbaren Magics finden Sie unter Verfügbare Kernels für Jupyter Notebooks mit Apache Spark-Clustern unter HDInsight.For more information about the %%sql magic, and other magics available with the PySpark kernel, see Kernels available on Jupyter notebooks with Apache Spark HDInsight clusters.

    Die Ausgabe ist:The output is:

    SQL-AbfrageausgabeSQL query output

  3. Sie können auch Matplotlib verwenden, eine Bibliothek zur Visualisierung von Daten, um einen Plot zu erstellen.You can also use Matplotlib, a library used to construct visualization of data, to create a plot. Da die Grafik aus dem lokal gespeicherten countResultsdf-Dataframe erstellt werden muss, muss der Codeausschnitt mit der %%local-Magic beginnen.Because the plot must be created from the locally persisted countResultsdf dataframe, the code snippet must begin with the %%local magic. Dadurch wird sichergestellt, dass der Code lokal auf dem Jupyter-Server ausgeführt wird.This ensures that the code is run locally on the Jupyter server.

    %%local
    %matplotlib inline
    import matplotlib.pyplot as plt
    
    labels = countResultsdf['results']
    sizes = countResultsdf['cnt']
    colors = ['turquoise', 'seagreen', 'mediumslateblue', 'palegreen', 'coral']
    plt.pie(sizes, labels=labels, autopct='%1.1f%%', colors=colors)
    plt.axis('equal')
    

    Die Ausgabe ist:The output is:

    Ausgabe der Spark-Machine Learning-Anwendung im Kreisdiagramm mit fünf unterschiedlichen MessergebnissenSpark machine learning application output - pie chart with five distinct inspection results

    Um das Ergebnis einer Lebensmittelkontrolle vorherzusagen, müssen Sie ein Modell basierend auf den Verstößen entwickeln.To predict a food inspection outcome, you need to develop a model based on the violations. Da die logistische Regression eine binäre Klassifizierungsmethode ist, können Sie die Ergebnisdaten in zwei Kategorien gruppieren: Fail und Pass:Because logistic regression is a binary classification method, it makes sense to group the result data into two categories: Fail and Pass:

    • PassPass

      • PassPass
      • Pass w/ ConditionsPass w/ conditions
    • FailFail

      • FailFail
    • VerwerfenDiscard

      • Business not locatedBusiness not located
      • Out of BusinessOut of Business

      Daten mit den anderen Ergebnissen („Business Not Located“ oder „Out of Business“) sind nicht sinnvoll, und sie machen auch nur einen sehr kleinen Prozentsatz der Ergebnisse aus.Data with the other results ("Business Not Located" or "Out of Business") are not useful, and they make up a very small percentage of the results anyway.

  4. Führen Sie den folgenden Code aus, um den bestehenden Datenrahmen (df) in einen neuen Datenrahmen zu konvertieren, wobei jede Kontrolle als Label-Violations-Paar dargestellt wird.Run the following code to convert the existing dataframe(df) into a new dataframe where each inspection is represented as a label-violations pair. In diesem Fall stellt das Label 0.0 ein Nichtbestehen dar, das Label 1.0 steht für das Bestehen der Kontrolle und das Label -1.0 steht für andere Ergebnisse.In this case, a label of 0.0 represents a failure, a label of 1.0 represents a success, and a label of -1.0 represents some results besides those two.

    def labelForResults(s):
        if s == 'Fail':
            return 0.0
        elif s == 'Pass w/ Conditions' or s == 'Pass':
            return 1.0
        else:
            return -1.0
    label = UserDefinedFunction(labelForResults, DoubleType())
    labeledData = df.select(label(df.results).alias('label'), df.violations).where('label >= 0')
    
  5. Führen Sie den folgenden Code aus, um eine Zeile von Daten mit Label anzuzeigen:Run the following code to show one row of the labeled data:

    labeledData.take(1)
    

    Die Ausgabe ist:The output is:

    [Row(label=0.0, violations=u"41. PREMISES MAINTAINED FREE OF LITTER, UNNECESSARY ARTICLES, CLEANING  EQUIPMENT PROPERLY STORED - Comments: All parts of the food establishment and all parts of the property used in connection with the operation of the establishment shall be kept neat and clean and should not produce any offensive odors.  REMOVE MATTRESS FROM SMALL DUMPSTER. | 35. WALLS, CEILINGS, ATTACHED EQUIPMENT CONSTRUCTED PER CODE: GOOD REPAIR, SURFACES CLEAN AND DUST-LESS CLEANING METHODS - Comments: The walls and ceilings shall be in good repair and easily cleaned.  REPAIR MISALIGNED DOORS AND DOOR NEAR ELEVATOR.  DETAIL CLEAN BLACK MOLD LIKE SUBSTANCE FROM WALLS BY BOTH DISH MACHINES.  REPAIR OR REMOVE BASEBOARD UNDER DISH MACHINE (LEFT REAR KITCHEN). SEAL ALL GAPS.  REPLACE MILK CRATES USED IN WALK IN COOLERS AND STORAGE AREAS WITH PROPER SHELVING AT LEAST 6' OFF THE FLOOR.  | 38. VENTILATION: ROOMS AND EQUIPMENT VENTED AS REQUIRED: PLUMBING: INSTALLED AND MAINTAINED - Comments: The flow of air discharged from kitchen fans shall always be through a duct to a point above the roofline.  REPAIR BROKEN VENTILATION IN MEN'S AND WOMEN'S WASHROOMS NEXT TO DINING AREA. | 32. FOOD AND NON-FOOD CONTACT SURFACES PROPERLY DESIGNED, CONSTRUCTED AND MAINTAINED - Comments: All food and non-food contact equipment and utensils shall be smooth, easily cleanable, and durable, and shall be in good repair.  REPAIR DAMAGED PLUG ON LEFT SIDE OF 2 COMPARTMENT SINK.  REPAIR SELF CLOSER ON BOTTOM LEFT DOOR OF 4 DOOR PREP UNIT NEXT TO OFFICE.")]
    

Erstellen eines logistischen Regressionsmodells anhand des EingabedataframesCreate a logistic regression model from the input dataframe

Die letzte Aufgabe besteht darin, die Daten mit Label in ein Format zu konvertieren, das mit der logistische Regression analysiert werden kann.The final task is to convert the labeled data into a format that can be analyzed by logistic regression. Die Eingabe für einen logistischen Regressionsalgorithmus muss eine Reihe von Label-Feature-Vektorpaaren sein, wobei der „Funktionsvektor“ aus Zahlen besteht und den Eingabepunkt darstellt.The input to a logistic regression algorithm needs be a set of label-feature vector pairs, where the "feature vector" is a vector of numbers representing the input point. Daher benötigen Sie eine Möglichkeit, die Spalte „violations“, die nur teilweise strukturiert ist und viele Freitextkommentare enthält, in ein Array reeller Zahlen zu konvertieren, die ein Computer problemlos interpretieren kann.So, you need to convert the "violations" column, which is semi-structured and contains many comments in free-text, to an array of real numbers that a machine could easily understand.

Ein Standardansatz beim maschinellen Lernen für die Verarbeitung natürlicher Sprache besteht darin, jedem klaren Wort einen „Index“ zuzuweisen und dann einen Vektor an den Algorithmus für maschinelles Lernen zu übergeben, sodass der Wert jedes Indexes die relative Häufigkeit dieses Worts in der Textzeichenfolge enthält.One standard machine learning approach for processing natural language is to assign each distinct word an "index", and then pass a vector to the machine learning algorithm such that each index's value contains the relative frequency of that word in the text string.

MLlib bietet eine einfache Möglichkeit um diesen Vorgang auszuführen.MLlib provides an easy way to perform this operation. Zunächst wird jeder Verstoßzeichenfolge ein Token zugewiesen, um die einzelnen Wörter in jeder Zeichenfolge abzurufen.First, "tokenize" each violations string to get the individual words in each string. Verwenden Sie dann eine HashingTF, um jeden Satz von Token in einen Funktionsvektor zu konvertieren, der dann an den logistischen Regressionsalgorithmus übergeben werden kann, um ein Modell zu erstellen.Then, use a HashingTF to convert each set of tokens into a feature vector that can then be passed to the logistic regression algorithm to construct a model. Sie müssen alle diese Schritte der Reihe nach über eine „Pipeline“ durchführen.You conduct all of these steps in sequence using a "pipeline".

tokenizer = Tokenizer(inputCol="violations", outputCol="words")
hashingTF = HashingTF(inputCol=tokenizer.getOutputCol(), outputCol="features")
lr = LogisticRegression(maxIter=10, regParam=0.01)
pipeline = Pipeline(stages=[tokenizer, hashingTF, lr])

model = pipeline.fit(labeledData)

Auswerten des Modells mit einem anderen DatasetEvaluate the model using another dataset

Mithilfe des zuvor erstellten Modells können Sie basierend auf den beobachteten Verstößen vorhersagen, wie die Ergebnisse der neuen Kontrollen ausfallen werden.You can use the model you created earlier to predict what the results of new inspections will be, based on the violations that were observed. Sie haben dieses Modell mit dem Dataset Food_Inspections1.csv trainiert.You trained this model on the dataset Food_Inspections1.csv. Sie können nun ein zweites Dataset, Food_Inspections2.csv, verwenden, um die Stärke dieses Modells für die neuen Daten auszuwerten.You can use a second dataset, Food_Inspections2.csv, to evaluate the strength of this model on the new data. Dieses zweite Dataset (Food_Inspections2.csv) befindet sich bereits im Standardspeichercontainer, der dem Cluster zugeordnet ist.This second data set (Food_Inspections2.csv) is in the default storage container associated with the cluster.

  1. Führen Sie den folgenden Code aus, um einen neuen Datenrahmen, predictionsDf, zu erstellen, der die vom Modell generierte Vorhersage enthält.Run the following code to create a new dataframe, predictionsDf that contains the prediction generated by the model. Der Codeausschnitt erstellt basierend auf dem Dataframe ebenfalls eine temporäre Tabelle namens Predictions.The snippet also creates a temporary table called Predictions based on the dataframe.

    testData = sc.textFile('wasbs:///HdiSamples/HdiSamples/FoodInspectionData/Food_Inspections2.csv')\
                .map(csvParse) \
                .map(lambda l: (int(l[0]), l[1], l[12], l[13]))
    testDf = spark.createDataFrame(testData, schema).where("results = 'Fail' OR results = 'Pass' OR results = 'Pass w/ Conditions'")
    predictionsDf = model.transform(testDf)
    predictionsDf.registerTempTable('Predictions')
    predictionsDf.columns
    

    Folgendes sollte angezeigt werden:You should see an output like the following:

    ['id',
        'name',
        'results',
        'violations',
        'words',
        'features',
        'rawPrediction',
        'probability',
        'prediction']
    
  2. Betrachten Sie eine der Vorhersagen.Look at one of the predictions. Führen Sie diesen Codeausschnitt aus:Run this snippet:

    predictionsDf.take(1)
    

    Sie sehen die Vorhersage für den ersten Eintrag im Testdataset.There is a prediction for the first entry in the test data set.

  3. Die model.transform()-Methode wendet dieselbe Transformation auf alle neuen Daten mit dem gleichen Schema an und erhält eine Vorhersage, wie die Daten klassifiziert werden können.The model.transform() method applies the same transformation to any new data with the same schema, and arrive at a prediction of how to classify the data. Mit nur einigen einfachen statistischen Daten gewinnen Sie einen Eindruck davon, wie präzise die Vorhersagen waren:You can do some simple statistics to get a sense of how accurate the predictions were:

    numSuccesses = predictionsDf.where("""(prediction = 0 AND results = 'Fail') OR
                                            (prediction = 1 AND (results = 'Pass' OR
                                                                results = 'Pass w/ Conditions'))""").count()
    numInspections = predictionsDf.count()
    
    print "There were", numInspections, "inspections and there were", numSuccesses, "successful predictions"
    print "This is a", str((float(numSuccesses) / float(numInspections)) * 100) + "%", "success rate"
    

    Die Ausgabe sieht wie folgt aus:The output looks like the following:

    There were 9315 inspections and there were 8087 successful predictions
    This is a 86.8169618894% success rate
    

    Durch Verwenden der logistischen Regression mit Spark erhalten Sie ein präzises Modell der Beziehung zwischen Verstoßbeschreibungen auf Englisch und darüber, ob ein bestimmter Betrieb eine Lebensmittelkontrolle bestehen bzw. nicht bestehen würde.Using logistic regression with Spark gives you an accurate model of the relationship between violations descriptions in English and whether a given business would pass or fail a food inspection.

Erstellen einer visuellen Darstellung der VorhersageCreate a visual representation of the prediction

Nun können Sie eine endgültige Visualisierung erstellen, um sich mit den Ergebnissen dieses Tests auseinanderzusetzen.You can now construct a final visualization to help you reason about the results of this test.

  1. Beginnen Sie mit dem Extrahieren der unterschiedlichen Vorhersagen und Ergebnisse aus der zuvor erstellten temporären Tabelle Predictions.You start by extracting the different predictions and results from the Predictions temporary table created earlier. Die folgenden Abfragen teilt die Ausgabe in true_positive, false_positive, true_negative, und false_negative auf.The following queries separate the output as true_positive, false_positive, true_negative, and false_negative. In den folgenden Abfragen deaktivieren Sie die Visualisierung mithilfe von -q und speichern auch die Ausgabe (mithilfe von -o) als Datenrahmen, die dann mit der %%local-Magic verwendet werden können.In the queries below, you turn off visualization by using -q and also save the output (by using -o) as dataframes that can be then used with the %%local magic.

    %%sql -q -o true_positive
    SELECT count(*) AS cnt FROM Predictions WHERE prediction = 0 AND results = 'Fail'
    
    %%sql -q -o false_positive
    SELECT count(*) AS cnt FROM Predictions WHERE prediction = 0 AND (results = 'Pass' OR results = 'Pass w/ Conditions')
    
    %%sql -q -o true_negative
    SELECT count(*) AS cnt FROM Predictions WHERE prediction = 1 AND results = 'Fail'
    
    %%sql -q -o false_negative
    SELECT count(*) AS cnt FROM Predictions WHERE prediction = 1 AND (results = 'Pass' OR results = 'Pass w/ Conditions')
    
  2. Abschließend verwenden Sie den folgenden Ausschnitt, um die Grafik mithilfe von Matplotlibzu generieren.Finally, use the following snippet to generate the plot using Matplotlib.

    %%local
    %matplotlib inline
    import matplotlib.pyplot as plt
    
    labels = ['True positive', 'False positive', 'True negative', 'False negative']
    sizes = [true_positive['cnt'], false_positive['cnt'], false_negative['cnt'], true_negative['cnt']]
    colors = ['turquoise', 'seagreen', 'mediumslateblue', 'palegreen', 'coral']
    plt.pie(sizes, labels=labels, autopct='%1.1f%%', colors=colors)
    plt.axis('equal')
    

    Die folgende Ausgabe wird angezeigt.You should see the following output:

    Spark-Machine Learning-Anwendungsausgabe: Prozentsätze der nicht bestandenen Lebensmittelkontrollen im KreisdiagrammSpark machine learning application output - pie chart percentages of failed food inspections.

    In diesem Diagramm bezieht sich ein „positives“ Ergebnis auf eine nicht bestandene Lebensmittelkontrolle, wohingegen sich ein negatives Ergebnis auf eine bestandene Kontrolle bezieht.In this chart, a "positive" result refers to the failed food inspection, while a negative result refers to a passed inspection.

Herunterfahren des NotebooksShut down the notebook

Nach dem Ausführen der Anwendung empfiehlt es sich, das Notebook herunterzufahren, um die Ressourcen freizugeben.After you have finished running the application, you should shut down the notebook to release the resources. Wählen Sie hierzu im Menü Datei des Notebooks die Option Schließen und Anhalten aus.To do so, from the File menu on the notebook, select Close and Halt. Hierdurch wird das Notebook heruntergefahren und geschlossen.This shuts down and closes the notebook.

Weitere InformationenSee also

SzenarienScenarios

Erstellen und Ausführen von AnwendungenCreate and run applications

Tools und ErweiterungenTools and extensions

Verwalten von RessourcenManage resources