Ich habe eine einfache multiple Regressionsanalyse mit Deep Learning (oder Keras) versucht. Deep Learning hat das Bild von Klassifizierungsproblemen und Bestärkungslernen, bedeutet jedoch nicht, dass eine Regressionsanalyse nicht möglich ist. Neuronale Netze werden auch für die Regressionsanalyse verwendet, daher ist dies ein Versuch, eine Regressionsanalyse auch beim Deep Learning durchzuführen.
Der Code, den ich gemacht habe, ist hier. https://github.com/shibuiwilliam/keras_regression_sample
Die multiple Regressionsanalyse wird mithilfe der Keras-Regressor-API von Keras durchgeführt. Die Daten sind Beispieldaten von Diabetikern, die von scikit-learn bereitgestellt werden. Es wird häufig in der Regressionsanalyse verwendet und enthält kleine und bequeme Daten.
Der Zweck dieser Zeit ist es, ein Verfahren zu schreiben, um eine Regressionsanalyse in Deep Learning oder einem neuronalen Netzwerk durchzuführen. Das Erstellen eines Regressionsanalysemodells mit Deep Learning verbessert jedoch nicht die Genauigkeit.
Bitte beachten Sie auch, dass die Regressionsanalyse diesmal keine numerische Zeitreihen-Datenvorhersage durch RNN oder LSTM ist.
Wenn Sie das Modell des maschinellen Lernens und des tiefen Lernens ** sehr grob ** positionieren, sieht es so aus.
Ich denke nicht, dass dies alles ist, da täglich neue Papiere und Modelle vorgeschlagen werden, aber es ist ein grobes Bild. Dieses Mal werden wir DNN tun.
Laden Sie die Daten als vorläufige Vorbereitung.
# import libraries
import numpy as np
import pandas as pds
from keras.models import Sequential
from keras.layers import Input, Dense, Dropout, BatchNormalization
from keras.wrappers.scikit_learn import KerasRegressor
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.metrics import mean_squared_error
from sklearn.datasets import load_diabetes
# use diabetes sample data from sklearn
diabetes = load_diabetes()
# load them to X and Y
X = diabetes.data
Y = diabetes.target
Daten wie diese werden geladen.
Es scheint, dass es bereits normalisiert wurde. Es handelt sich um kleine Beispieldaten mit 442 Zeilen und 10 Eingangsvariablen.
Siehe hier für Details zu den Daten. http://web.stanford.edu/~hastie/Papers/LARS/LeastAngle_2002.pdf
KerasRegressor Keras bietet eine API für die Regressionsanalyse namens Keras Regressor. https://keras.io/ja/scikit-learn-api/
Keras selbst gibt nicht viele Details an, aber der Punkt ist, dass es ein Wrapper für das Regressionsmodell von Scicit-Learn zu sein scheint. Möglicherweise wurde Keras Regressor erstellt, um mit einer praktischen Metrik-API für die Scikit-Learn-Regressionsanalyse (z. B. cross_val_score oder mean_squared_error) zu arbeiten.
Der Weg, ein neuronales Netzwerkmodell zu schreiben, ist Keras selbst. Lassen Sie uns zunächst ein einfaches Modell erstellen (eine Eingabeebene, eine Zwischenebene und eine Ausgabeebene).
# create regression model
def reg_model():
model = Sequential()
model.add(Dense(10, input_dim=10, activation='relu'))
model.add(Dense(16, activation='relu'))
model.add(Dense(1))
# compile model
model.compile(loss='mean_squared_error', optimizer='adam')
return model
Wenn man eine Zusammenfassung macht, sieht es so aus.
Bis zu diesem Punkt bleibt der herkömmliche Keras derselbe. Der Unterschied zur Vergangenheit besteht darin, wie man beim Lernen fit schreibt.
Es gibt ungefähr zwei Möglichkeiten zu lernen.
Es scheint, dass eine allgemeine Methode für die Regressionsanalyse verwendet werden kann.
Lassen Sie uns das obige einfache Modell getrennt von Trainingsdaten und Testdaten lernen.
# use data split and fit to run the model
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.1, random_state=0)
estimator = KerasRegressor(build_fn=reg_model, epochs=100, batch_size=10, verbose=0)
estimator.fit(x_train, y_train)
y_pred = estimator.predict(x_test)
# show its root mean square error
mse = mean_squared_error(y_test, y_pred)
print("KERAS REG RMSE : %.2f" % (mse ** 0.5))
Schließlich gibt die Standardausgabe den quadratischen Mittelwert des Erro an. Der Schreibstil ist Scikit-Lern-ähnlich (aber Keras ist in erster Linie Scikit-Lern-ähnlich).
Lassen Sie uns mit der gegenseitigen Überprüfung weiter lernen.
# use Kfold and cross validation to run the model
seed = 7
np.random.seed(seed)
estimator = KerasRegressor(build_fn=reg_model, epochs=100, batch_size=10, verbose=0)
kfold = KFold(n_splits=10, random_state=seed)
# show its root mean square error
results = cross_val_score(estimator, X, Y, scoring='neg_mean_squared_error', cv=kfold)
mse = -results.mean()
print("KERAS REG RMSE : %.2f" % (mse ** 0.5))
Auch hier wird am Ende die Quadratwurzel des durchschnittlichen Quadratfehlers berechnet. Lassen Sie uns jedes Ergebnis arrangieren.
Nun, es macht keinen großen Unterschied.
Ich habe bisher mehrere Regressionsanalysen mit einem einfachen neuronalen Netzwerk durchgeführt. Versuchen wir nun, die Netzwerkschicht zu vertiefen.
# create deep learning like regression model
def deep_reg_model():
model = Sequential()
model.add(Dense(10, input_dim=10, activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.2))
model.add(Dense(256, activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.2))
model.add(Dense(128, activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.2))
model.add(Dense(64, activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.2))
model.add(Dense(1))
# compile model
model.compile(loss='mean_squared_error', optimizer='adam')
return model
Da es eine große Sache ist, habe ich Batch-Normalisierung und Dropout hinzugefügt.
Lass uns lernen.
# use data split and fit to run the model
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.1, random_state=0)
estimator = KerasRegressor(build_fn=deep_reg_model, epochs=100, batch_size=10, verbose=0)
estimator.fit(x_train, y_train)
y_pred = estimator.predict(x_test)
# show its root mean square error
mse = mean_squared_error(y_test, y_pred)
print("KERAS REG RMSE : %.2f" % (mse ** 0.5))
# use Kfold and cross validation to run the model
seed = 7
np.random.seed(seed)
estimator = KerasRegressor(build_fn=deep_reg_model, epochs=100, batch_size=10, verbose=0)
kfold = KFold(n_splits=10, random_state=seed)
# show its root mean square error
results = cross_val_score(estimator, X, Y, scoring='neg_mean_squared_error', cv=kfold)
mse = -results.mean()
print("KERAS REG RMSE : %.2f" % (mse ** 0.5))
Es unterscheidet sich nicht wesentlich von einem einfachen Netzwerk. In Anbetracht der Berechnungszeit macht es keinen Sinn, sie zu vertiefen.
Ich habe mit Keras Regressor eine multiple Regressionsanalyse versucht. Vielleicht gibt es viele Leute, die das Gleiche versucht haben, aber der Grund, warum es nicht viele Beispiele für Google gibt, ist wahrscheinlich, dass die Genauigkeit nicht dramatisch verbessert wurde (Nageyari). Wenn Sie es mit größeren und komplexeren Daten versuchen, können Sie möglicherweise etwas anderes sagen. Wenn Sie also Daten finden, die gut aussehen, versuchen Sie es erneut.
https://keras.io/ja/scikit-learn-api/ http://machinelearningmastery.com/regression-tutorial-keras-deep-learning-library-python/ http://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_diabetes.html http://qiita.com/TomokIshii/items/f355d8e87d23ee8e0c7a http://s0sem0y.hatenablog.com/entry/2016/05/22/215529
Recommended Posts