Verwenden von "Rückkehr", die die Grundlage für tiefes Lernen ist, Ich möchte ein Programm erstellen, um den Hauspreis vorherzusagen. Ich werde so viel wie möglich aus Anfängersicht schreiben. Der vorherige Artikel ist hier .
Regression ist die Aufgabe, __numerische Werte basierend auf charakteristischen Daten vorherzusagen. Dieses Mal werden wir ein Programm zur Vorhersage der Immobilienpreise erstellen, aber es ist auch möglich, Preisbewegungen von Aktien und Devisen (Devisentransaktionen) vorherzusagen.
import
Import ist ↓. Dieses Mal importieren wir Pandas, um die Daten zu überprüfen.
Pandas sind übrigens sehr einfach zu handhaben, aber sehr langsam. Es ist üblich, Numpy zum Lernen und Pandas zur visuellen Bestätigung und Datenvorverarbeitung zu verwenden.
from tensorflow.keras.datasets import boston_housing
from tensorflow.keras.layers import Activation, Dense, Dropout
from tensorflow.keras.models import Sequential
from tensorflow.keras.callbacks import EarlyStopping
from tensorflow.keras.optimizers import Adam
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
Dieses Mal werden wir eine Bibliothek namens boston_housing verwenden, um die Immobilienpreise vorherzusagen. boston_housing enthält charakteristische Informationen und das richtige Antwortetikett, wenn Sie sich für ein Haus in Boston, USA, entscheiden. Zu den charakteristischen Informationen (im Folgenden als erklärende Variablen bezeichnet) gehören die Kriminalitätsrate und die Zugänglichkeit des Gebiets.
Wenn diese erklärende Variable schlampige Informationen enthält, ist die Genauigkeit der Vorhersage offensichtlich schlecht. Zum Beispiel, selbst wenn Sie die Anzahl der Pachinko-Läden in der Nähe zu den erklärenden Variablen hinzufügen Nur der Pachinker fühlt den Wert, so dass er die Vorhersage stört. Wir müssen etwas hinzufügen, das jeder für wert hält.
Der schwierigste Teil der Regressionsvorhersage ist die Definition dieser erklärenden Variablen. Diesmal ist es einfach, weil es in den heruntergeladenen Daten enthalten ist.
Der Download ist der folgende Code. Die heruntergeladenen erklärenden Variablen trennen die richtigen Antwortetiketten zum Lernen und Verifizieren. (train_data, train_labels) dient zur Schulung und (test_data, test_labels) zur Überprüfung. Dieser Bereich entspricht der Klassifizierung des vorherigen Artikels.
(train_data, train_labels), (test_data, test_labels) = boston_housing.load_data()
Überprüfen Sie die Anzahl der Formen. Es gibt 404 Trainingsdaten und 102 Verifizierungsdaten. Im Vergleich zur Klassifizierung des vorherigen Artikels ist es viel weniger. Es ist die Anzahl der Fälle, die mich fragen lassen, ob ich es wirklich vorhersagen kann.
Als nächstes folgt die einfachste und wichtigste Aufgabe, die Datenvorverarbeitung. Bei dieser Immobilienpreisprognose handelt es sich nicht um Zeitreihendaten, daher besteht keine Kontinuität. Bei der Vorhersage solcher Daten ist es sicherer, die Daten zu mischen.
Verwenden Sie random.random ()
, um eine Zufallszahl zu erstellen, und np.argsort ()
, um einen Index zu erstellen und zu sortieren.
order = np.argsort(np.random.random(train_labels.shape))
train_data = train_data[order]
train_labels = train_labels[order]
Normalisieren Sie als nächstes die erklärenden Variablen, die den Hauspreis bestimmen. Dieses Mal wird die Normalisierung verwendet, um die erklärende Variable auf einen Wert mit einer Varianz von 1 mit einem Durchschnitt von 0 zu setzen.
Bei der Regressionsvorhersage kann die Vorhersage durch eine große Anzahl von erklärenden Variablen gezogen werden. Es wird gesagt, dass es gut ist, auf diese Weise zu normalisieren.
Die Normalisierung kann berechnet werden, indem der Durchschnitt von den zu normalisierenden Daten subtrahiert und durch die Standardabweichung dividiert wird. Der Code ist ↓.
mean = train_data.mean(axis=0)
std = train_data.std(axis=0)
train_data = (train_data - mean) / std
test_data = (test_data - mean) / std
Verwenden Sie Pandas, um sicherzustellen, dass die erklärenden Variablen normalisiert sind.
#Bestätigung der Daten nach Vorverarbeitung des Datensatzes
column_names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT']
df = pd.DataFrame(train_data, columns=column_names)
df.head()
Erstellen Sie ein Modell des neuronalen Netzwerks. Dieses Mal werden wir drei Schichten der gesamten Verbindung vorbereiten.
model = Sequential()
model.add(Dense(64, activation='relu', input_shape=(13,)))
model.add(Dense(64, activation='relu'))
model.add(Dense(1))
model.compile(loss='mse', optimizer=Adam(lr=0.001), metrics=['mae']) #kompilieren
Ich werde jeden erklären.
Erstellen Sie zunächst ein sequentielles Modell mit model = Sequential ()
.
model.add (Dense (64, Aktivierung = 'relu', input_shape = (13,)))
ist die Eingabeebene.
Dicht: Gesamte Gesamtbindung, Anzahl der Einheiten: 64, Aktivierungsfunktion: ReLU, Erklärende Variablen: 13
model.add (Dense (64, activity = 'relu'))
ist eine versteckte Ebene.
Dicht: Gesamte Gesamtbindung, Anzahl der Einheiten: 64, Aktivierungsfunktion: ReLU
model.add (Dense (1))
ist die Ausgabeschicht.
Diesmal handelt es sich um eine numerische Vorhersage, daher gibt es nur eine Einheit (Anzahl der Ausgänge).
Kompilieren Sie mit model.compile (Verlust = 'mse', Optimierer = Adam (lr = 0,001), Metriken = ['mae'])
.
Stellen Sie mit loss = 'mse' die Verlustfunktion __ ein, um den Fehler __ zwischen dem vorhergesagten Wert und dem tatsächlichen Wert zu ermitteln.
Stellen wir mse ein, das für die Regression geeignet sein soll.
Stellen Sie mit Optimierer = Adam (lr = 0,001) Adam auf die Optimierungsfunktion __ ein, um den Fehler zu reduzieren, und setzen Sie die Lernrate auf 0,01.
Stellen Sie mit Metriken = ['mae'] die mae der Bewertungsfunktion __ ein, um die Leistung des __- Modells zu bewerten.
Dieses Mal möchte ich mit Early Stopping lernen. Wenn Sie bei EarlyStopping bei der angegebenen Anzahl von Epochen keine Verbesserung des Lernens feststellen, wird es automatisch gestoppt. Dieses Mal würde ich gerne aufhören, wenn es in 20 Epochen keine Verbesserung gibt.
Setzen Sie zum Lernen die maximale Anzahl von Epochen auf 500, setzen Sie die Verifizierungsdaten auf 20% und aktivieren Sie Early Stop mit Rückrufen = [Early_stop].
#Bereiten Sie sich auf ein frühes Anhalten vor
early_stop = EarlyStopping(monitor='val_loss', patience=30)
#Ausführung des Lernens
history = model.fit(train_data, train_labels, epochs=500,
validation_split=0.2, callbacks=[early_stop])
Dies ist eine Erklärung der Lernsituation. __verlust ist der Trainingsdatenfehler __. Je näher es an 0 liegt, desto besser ist das Ergebnis. __mae ist der durchschnittliche absolute Fehler der Trainingsdaten __. Je näher es an 0 liegt, desto besser ist das Ergebnis. __val_loss ist der Validierungsdatenfehler __. Je näher es an 0 liegt, desto besser ist das Ergebnis. __val_mae ist der durchschnittliche absolute Fehler __ der Validierungsdaten. Je näher es an 0 liegt, desto besser ist das Ergebnis.
Ich habe die Anzahl der Epochen auf 500 festgelegt, aber ich denke, dass sie eingestellt wurde, da auf dem Weg keine Verbesserung erkennbar ist.
Zeichnen Sie history.history, in der das Lernergebnis mit matplotlib gespeichert wird.
plt.plot(history.history['mae'], label='train mae')
plt.plot(history.history['val_mae'], label='val mae')
plt.xlabel('epoch')
plt.ylabel('mae [1000$]')
plt.legend(loc='best')
plt.ylim([0,5])
plt.show()
Werten Sie die Trainingsdaten mit model.evalute aus.
test_loss, test_mae = model.evaluate(test_data, test_labels)
print('loss:{:.3f}\nmae: {:.3f}'.format(test_loss, test_mae))
Das Ergebnis ist schlechter als die Trainingsdaten, aber das Ergebnis ist fast das gleiche. Es ist erstaunlich, dass wir selbst mit einer kleinen Anzahl von Fällen, etwa 400, eine Zahl in der Nähe davon erreichen können. Vielleicht ist die Definition erklärender Variablen ausgezeichnet.
Lassen Sie uns abschließend die Vorhersagedaten ausgeben und überprüfen.
Zeigen Sie zuerst das richtige Antwortetikett an und schließen Sie dann.
Da das Ausgabeergebnis der Inferenz zweidimensional ist, konvertieren wir es mit flatten ()
in eindimensional.
#Zeigen Sie das richtige Antwortetikett an
print(np.round(test_labels[0:10]))
#Anzeige des abgeleiteten Preises
test_predictions = model.predict(test_data[0:10]).flatten()
print(np.round(test_predictions))
Es scheint, dass ein numerischer Wert nahe dem richtigen Antwortetikett erhalten werden kann.
Immobilien, die unter dieser Prognose liegen, werden möglicherweise billiger als der Marktpreis verkauft. Es kann jedoch aus Gründen billiger sein, die nicht durch erklärende Variablen ausgedrückt werden können (z. B. durch auftretende Geister). Es ist gefährlich, nur mit diesem Vorhersageergebnis zu kaufen und zu verkaufen, aber ich denke, es wird hilfreich sein.
Recommended Posts