Verwendung des TensorFlow-Neuralnetzwerks für maschinelle Lernvorhersagen mit TripAdvisor-Daten

Verwendung des TensorFlow-Neuralnetzwerks für maschinelle Lernvorhersagen mit TripAdvisor-Daten

  • Künstliche Intelligenz
6 Minuten Lesezeit Aktualisiert May 21, 2018

Auf einen Blick: Unter Verwendung von TensorFlow wird ein neuronales Netzwerk entwickelt, um TripAdvisor-Hotelbewertungen vorherzusagen, indem ein Datensatz aus CSV-Daten erstellt und das Modell trainiert wird, um Bewertungen von 1 bis 5 zu klassifizieren. Techniken umfassen Datenparsing, Tensorerstellung und den Einsatz des DNNClassifiers.

  • Codebeispiele veranschaulichen Datenvorverarbeitung und Modelltraining.
  • Die Integration der TensorFlow-Funktionen verbessert die Vorhersagegenauigkeit.

Hier ist der letzte Teil unserer Analyse der Tripadvisor-Daten. Teil eins ist hier. Um das zu verstehen, müssen Sie Python und Numpy Arrays sowie die Grundlagen hinter Tensorflow und neuronalen Netzen kennen. Falls nicht, können Sie hier eine Einführung in Tensorflow lesen.

Der Code aus diesem Beispiel ist hier und die Eingabedaten hier. Wir erstellen ein neuronales Netzwerk mit dem Tensorflow tf.estimator.DNNClassifier. (DNN bedeutet tiefes neuronales Netzwerk, also eines mit versteckten Schichten zwischen Ein- und Ausgabeschicht.)

Im Folgenden besprechen wir jeden Abschnitt des Codes.

parse_line

feature_names ist der Name, den wir den Feature-Spalten zugewiesen haben.

FIELD_DEFAULTS ist ein Array aus 20 ganzen Zahlen. Dies zeigt dem Tensorflow, dass unsere Eingaben ganze Zahlen sind und dass es 20 Features gibt. Wenn wir 1.0 verwendet hätten, würden diese als Floats deklariert werden.

parse_line

    import tensorflow as tf
import numpy as np
feature_names = ['Usercountry', 'Nrreviews','Nrhotelreviews','Helpfulvotes','Periodofstay',
'Travelertype','Pool','Gym','Tenniscourt','Spa','Casino',
'Freeinternet','Hotelname','Hotelstars','Nrrooms','Usercontinent',
'Memberyears','Reviewmonth','Reviewweekday']
FIELD_DEFAULTS = [[0], [0], [0], [0], [0],
[0], [0], [0], [0], [0],
[0], [0], [0], [0], [0],
[0], [0], [0], [0], [0]]

DNNClassifier.train benötigt ein input_fn , das Features und Labels zurückgibt. Es soll nicht mit Argumenten aufgerufen werden, daher verwenden wir unten lambda , um es iterativ aufzurufen und einen Parameter zu übergeben, der der Name der Textdatei ist, die gelesen werden soll...

Wir können nicht einfach eines der von TensorFlow bereitgestellten Beispiele verwenden, wie zum Beispiel das helloword-typische Beispiel, das Iris-Blumendaten liest, um die Daten zu lesen. Wir haben unsere eigenen Daten erstellt und in eine .csv-Datei eingefügt. Wir brauchen also unseren eigenen Parser. In diesem Fall verwenden wir die Methode tf.data.TextLineDataset, um aus der CSV-Textdatei zu lesen und in diesen Parser einzuspeisen. Dieser liest diese Zeilen und gibt die Features und Labels als Wörterbuch- und Tensorpaar zurück.

In del parsed_line[4] haben wir den 5. Tensor aus der Eingabe gelöscht, also den Tripadvisor-Score. Denn das ist ein Label (d. h. Output) und kein Merkmal (Input).

tf.decode_csv(Zeile, FIELD_DEFAULTS) erstellt Tensoren für jedes Element, das aus der .csv Datei gelesen wird.

Du kannst keine Tensore sehen, wenn sie einen Wert haben. Und sie haben keinen Wert, bis du eine Tensorsitzung ausführst. Aber du kannst diese Werte mit tp inspizieren . Print(). Beachte auch, dass du für Debug-Zwecke die Parsefunktionen testen kannst:

    import pandas as pd
df = pd.read_csv("/home/walker/TripAdvisor.csv")
ds = df.map(parse_line)

Weiter mit unserer Erklärung: dict(zip(feature_names, features)) erstellen ein Wörterbuch aus den Features-Tensoren und den Features-Namen. Für das Label weisen wir einfach dieses Label = parsed_line[4] vom fünften Element in parsed_line zu.

csv_input

    def parse_line(line):
parsed_line = tf.decode_csv(line, FIELD_DEFAULTS)
tf.Print(input_=parsed_line , data=[parsed_line ], message="parsed_line ")
tf.Print(input_=parsed_line[4], data=[parsed_line[4]], message="score")
label = parsed_line[4]
del parsed_line[4]
features = parsed_line
d = dict(zip(feature_names, features))
return d, label

Ein Datensatz ist ein Tensorflow-Datensatz und kein einfacheres Python-Objekt. Wir rufen parse_line mit der Methode dataset.map() auf, nachdem wir den Datensatz aus der .csv Textdatei mit tf.data.TextLineDataset(csv_path) erstellt haben.

    def csv_input_fn(csv_path, batch_size):
dataset = tf.data.TextLineDataset(csv_path)
dataset = dataset.map(parse_line)
dataset = dataset.shuffle(1000).repeat().batch(batch_size)
return dataset

Tensoren erstellen

Hier erstellen wir die Tensoren als stetige Zahlen statt als kategorische. Das ist korrekt, könnte aber verbessert werden. Siehe die untenstehende Anmerkung.

    Note: User country, is a set of discrete values.  So we could have used, for example, Usercountry = tf.feature_column.indicator_column(tf.feature_column. categorical_column_with_identity("Usercountry",47))
since there are 47 countries in our dataset.  You can experiment with that and see if you can make that change. I got errors trying to get that to work since tf.decode_csv() appeared to be reading the wrong column in certain cases this given values that were, for example, not one of the 47 countries.  So there must be a few rows in the input data that has a different number of commas than the others.  You can experiment with that.

Schließlich ist feature_columns ein Array der Tensoren, die wir erstellt haben.

    Usercountry = tf.feature_column.numeric_column("Usercountry")
Nrreviews = tf.feature_column.numeric_column("Nrreviews")
Nrhotelreviews = tf.feature_column.numeric_column("Nrhotelreviews")
Helpfulvotes = tf.feature_column.numeric_column("Helpfulvotes")
Periodofstay = tf.feature_column.numeric_column("Periodofstay")
Travelertype = tf.feature_column.numeric_column("Travelertype")
Pool = tf.feature_column.numeric_column("Pool")
Gym = tf.feature_column.numeric_column("Gym")
Tenniscourt = tf.feature_column.numeric_column("Tenniscourt")
Spa = tf.feature_column.numeric_column("Spa")
Casino = tf.feature_column.numeric_column("Casino")
Freeinternet = tf.feature_column.numeric_column("Freeinternet")
Hotelname = tf.feature_column.numeric_column("Hotelname")
Hotelstars = tf.feature_column.numeric_column("Hotelstars")
Nrrooms = tf.feature_column.numeric_column("Nrrooms")
Usercontinent = tf.feature_column.numeric_column("Usercontinent")
Memberyears = tf.feature_column.numeric_column("Memberyears")
Reviewmonth = tf.feature_column.numeric_column("Reviewmonth")
Reviewweekday = tf.feature_column.numeric_column("Reviewweekday")
feature_columns = [Usercountry, Nrreviews,Nrhotelreviews,Helpfulvotes,Periodofstay,
Travelertype,Pool,Gym,Tenniscourt,Spa,Casino,Freeinternet,Hotelname,
Hotelstars,Nrrooms,Usercontinent,Memberyears,Reviewmonth,
Reviewweekday]

Create Classifier

Jetzt trainieren wir das Modell. Das hidden_units [10,10] bedeutet, dass die erste versteckte Schicht des tiefen neuronalen Netzwerks 10 Knoten hat und die zweite 10. Der model_dir ist der temporäre Ordner, in dem das trainierte Modell gespeichert wird. Die Hotelwerte reichen von 1 bis 5, also ist n_classes 6, da es größer sein muss als diese Anzahl von Buckets.

Trainiere das Modell

    classifier=tf.estimator.DNNClassifier(
feature_columns=feature_columns,
hidden_units=[10, 10],
n_classes=6,
model_dir="/tmp")
batch_size = 100

Jetzt trainieren wir das Modell. Wir verwenden Lambda, weil in der Dokumentation steht: "Schätzer erwarten, dass ein input_fn keine Argumente annimmt. Um diese Einschränkung zu umgehen, verwenden wir Lambda, um die Argumente zu erfassen und die erwartete Schnittstelle bereitzustellen."

    classifier.train(
steps=100,
input_fn=lambda : csv_input_fn("/home/walker/tripAdvisorFL.csv", batch_size))

Mach eine Vorhersage

Jetzt machen wir eine Vorhersage für das trainierte Modell. In der Praxis solltest du auch einen Evaluationsschritt ausführen. Du wirst im Code auf GitHub sehen, dass ich das geschrieben habe, aber es hat den Evaluationsschritt nie verlassen. Das bleibt also ein offenes Thema, das hier geklärt werden muss.

Wir brauchen einige Daten zum Testen. Wir haben die erste Zeile aus dem Trainingsset-Eingabe und geben sie hier ein. Dieser Prüfer hat dem Hotel eine Punktzahl von 5 gegeben. Unser erwartetes Ergebnis ist also 5. Das neuronale Netzwerk gibt die Wahrscheinlichkeit an, dass das erwartete Ergebnis 5 beträgt. Die Classifier.predict()- Methode führt in diesem Fall die Eingabefunktion aus, die wir ihr sagen. predict_input_fn(). Das gibt die Features als Wörterbuch zurück. Wenn wir die Auswertung ausgeführt hätten, bräuchten wir sowohl die Features als auch das Label.

    features = {'Usercountry': np.array([233]), 'Nrreviews': np.array([11]),'Nrhotelreviews': np.array([4]),'Helpfulvotes': np.array([13]),'Periodofstay': np.array([582]),'Travelertype': np.array([715]),'Pool' : np.array([0]),'Gym' : np.array([1]),'Tenniscourt' : np.array([0]),'Spa' : np.array([0]),'Casino' : np.array([0]),'Freeinternet' : np.array([1]),'Hotelname' : np.array([3367]),'Hotelstars' : np.array([3]),'Nrrooms' : np.array([3773]),'Usercontinent' : np.array([1245]),'Memberyears' : np.array([9]),'Reviewmonth' : np.array([730]),'Reviewweekday' : np.array([852])}
def predict_input_fn():
return features
expected = [5]
prediction = classifier.predict(input_fn=predict_input_fn)
for pred_dict, expec in zip(prediction, expected):
class_id = pred_dict['class_ids'][0]
probability = pred_dict['probabilities'][class_id]
print ('class_ids=', class_id, ' probabilities=',  probability)

Dann drucken wir die Ergebnisse aus. Die Wahrscheinlichkeit für eine 5 beträgt in diesem Beispiel 38 %. Wir hoffen, etwa etwa 90 % zu erreichen. Das könnte ein Ausreißerwert sein. Wir wissen es nicht, da er das Modell noch nicht bewertet hat .

Offensichtlich müssen wir das Modell noch einmal evaluieren und es erneut mit zusätzlichen Daten versuchen. Man könnte meinen, Hotelwerte korrelieren tatsächlich mit den Tripadvisor-Daten, die wir ihm gegeben haben. Aber der Fokus liegt hier darauf, das Modell zum Laufen zu bringen. Jetzt müssen wir uns feinjustieren und sehen, ob ein anderes ML-Modell passender sein könnte.

    class_ids= 5  probabilities= 0.38341486

Nachtrag

Sie können diese ausprobieren, um die oben genannten diskreten Wertspalten zu erstellen:

    Usercountry = tf.feature_column.indicator_column(tf.feature_column.
categorical_column_with_identity("Usercountry",47))
Nrreviews = tf.feature_column.numeric_column("Nrreviews")
Nrhotelreviews = tf.feature_column.numeric_column("Nrhotelreviews")
Helpfulvotes = tf.feature_column.numeric_column("Helpfulvotes")
Periodofstay = tf.feature_column.numeric_column("Periodofstay")
Travelertype = tf.feature_column.indicator_column(tf.feature_column.
categorical_column_with_identity("Travelertype",5))
Pool = tf.feature_column.indicator_column(tf.feature_column.
categorical_column_with_identity("Pool",2))
Gym = tf.feature_column.indicator_column(tf.feature_column.
categorical_column_with_identity("Gym",2))
Tenniscourt = tf.feature_column.indicator_column(tf.feature_column.
categorical_column_with_identity("Tenniscourt",2))
Spa = tf.feature_column.indicator_column(tf.feature_column.
categorical_column_with_identity("Spa",2))
Casino = tf.feature_column.indicator_column(tf.feature_column.
categorical_column_with_identity("Casino",2))
Freeinternet = tf.feature_column.indicator_column(tf.feature_column.
categorical_column_with_identity("Freeinternet",2))
Hotelname = tf.feature_column.indicator_column(tf.feature_column.
categorical_column_with_identity("Hotelname",22))
Hotelstars = tf.feature_column.indicator_column(tf.feature_column.
categorical_column_with_identity("Hotelstars",5))
Nrrooms = tf.feature_column.numeric_column("Nrrooms")
Usercontinent = tf.feature_column.indicator_column(tf.feature_column.
categorical_column_with_identity("Usercontinent",6))
Memberyears = tf.feature_column.numeric_column("Memberyears")
Reviewmonth = tf.feature_column.indicator_column(tf.feature_column.
categorical_column_with_identity("Reviewmonth",12))
Reviewweekday = tf.feature_column.indicator_column(tf.feature_column.
categorical_column_with_identity("Reviewweekday",7))

Diese Beiträge sind meine eigenen und spiegeln nicht unbedingt die Position, Strategien oder Meinung von BMC wider.

Mehr aus Künstliche Intelligenz

Abonnieren Sie The Brief

Mit der Registrierung für dieses Angebot bestätigen Sie, dass Sie die Datenschutzrichtlinie von BMC gelesen und zugestimmt haben.

Danke

Sie haben The Brief abonniert
Das Briefing umfasst die Mainframe- und Enterprise-Orchestrierung – BMC AMI und Control-M – sowie die Analystenforschung, Kundeneinsätze und Events in beiden Bereichen.