[PYTHON] <Kurs> Maschinelles Lernen Kapitel 2: Nichtlineares Regressionsmodell

Maschinelles Lernen

Inhaltsverzeichnis Kapitel 1: Lineares Regressionsmodell [Kapitel 2: Nichtlineares Regressionsmodell] (https://qiita.com/matsukura04583/items/baa3f2269537036abc57) [Kapitel 3: Logistisches Regressionsmodell] (https://qiita.com/matsukura04583/items/0fb73183e4a7a6f06aa5) [Kapitel 4: Hauptkomponentenanalyse] (https://qiita.com/matsukura04583/items/b3b5d2d22189afc9c81c) [Kapitel 5: Algorithmus 1 (k-Nachbarschaftsmethode (kNN))] (https://qiita.com/matsukura04583/items/543719b44159322221ed) [Kapitel 6: Algorithmus 2 (k-Mittel)] (https://qiita.com/matsukura04583/items/050c98c7bb1c9e91be71) [Kapitel 7: Support Vector Machine] (https://qiita.com/matsukura04583/items/6b718642bcbf97ae2ca8)

Kapitel 2: Nichtlineares Regressionsmodell

Beschreibung des nichtlinearen Regressionsmodells

NLR1.jpg

Es unterscheidet sich nicht wesentlich vom linearen Modell, nur das lineare Mapping wird mit dem Teil $ \ phi $ multipliziert, um es nichtlinear zu machen.

NLR7.jpg

  • Generalisierungsleistung
  • Vorausschauende Leistung nicht nur für die zum Lernen verwendeten Eingaben, sondern auch für neue Eingaben, die noch nie zuvor gesehen wurden
  • Ein Modell mit guter Leistung ist eines mit einem kleinen Generalisierungsfehler (Testfehler) (kein Lernfehler).
  • Der Generalisierungsfehler wird normalerweise durch Messen der Leistung mit Validierungsdaten geschätzt, die getrennt von den Trainingsdaten erfasst werden
  • Bias / Varianzzerlegung (Referenz) Bias-Variant-Zerlegung: Leistungsbewertung des maschinellen Lernens

NLR8.jpg

  • Ob Ihr Modell in den Daten verlernt oder überfordert ist

  • Sowohl Trainingsfehler als auch Testfehler sind gering. ▶ Möglichkeit eines verallgemeinerten Modells

  • Kleiner Trainingsfehler, aber großer Testfehler ▶ Überlernen

  • Weder Trainingsfehler noch Testfehler werden klein ▶ verlernt

  • Im Falle einer Regression wird die Lösung explizit erhalten (Vergleich der Werte von Trainingsfehler und Trainingsfehler) 52 Nichtlineares Regressionsmodell

  • Holdout-Methode

  • Teilen Sie endliche Daten in zwei Teile, einen für das Training und einen für das Testen, und verwenden Sie sie, um die "Vorhersagegenauigkeit" und die "Fehlerrate" zu schätzen.

  • Wenn Sie die Anzahl für das Lernen erhöhen, verringert sich die Anzahl für das Testen und die Lerngenauigkeit verbessert sich, aber die Genauigkeit der Leistungsbewertung verschlechtert sich.

  • Im Gegenteil, wenn die Anzahl der Tests erhöht wird, verringert sich der Lernaufwand, sodass sich die Genauigkeit des Lernens selbst verschlechtert.

  • Es gibt einen Nachteil, dass es keine gute Leistungsbewertung gibt, es sei denn, es ist eine große Datenmenge verfügbar. Wenn Sie es beispielsweise in zwei Teile teilen, besteht das Risiko, dass die verlorenen Daten nur an einen von ihnen gesendet werden.

  • Im nichtlinearen Regressionsmodell, das auf der Basiserweiterungsmethode basiert, werden Anzahl, Position, Bandbreitenwert und Abstimmungsparameter der Basisfunktion durch das Modell bestimmt, das den Holdout-Wert reduziert. 53 Nichtlineares Regressionsmodell

Kreuzvalidierung

Die folgenden Verifizierungsdaten und Trainingsdaten werden für jeden Iterator getrennt und das Modell wird vorbereitet. Nachfolgend finden Sie ein Beispiel für die Aufteilung der Daten in 5 Teile für Schulung und Bewertung. Wichtig ist, dass die Verifizierungsdaten und Trainingsdaten nicht erfasst werden.

NLR9.jpg NLR10.jpg Selbst wenn die Genauigkeit bei der Überprüfung durch die Holdout-Überprüfungsmethode 70% und bei CV 65% beträgt, wird CV zur Schätzung der Generalisierungsleistung verwendet. Die Kreuzvalidierung bietet eine höhere Generalisierungsleistung als die Holdout-Überprüfungsmethode. NLR11.jpg

(Trainieren)

Google Drive Mount

from google.colab import drive
drive.mount('/content/drive')

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline

#Seaborn Einstellungen
sns.set()
#Hintergrundänderung
sns.set_style("darkgrid", {'grid.linestyle': '--'})
#Größe(Skalenänderung)
sns.set_context("paper")

n=100

def true_func(x):
    z = 1-48*x+218*x**2-315*x**3+145*x**4
    return z 

def linear_func(x):
    z = x
    return z 
#Generieren Sie verrauschte Daten aus echten Funktionen

#Datengenerierung aus einer echten Funktion
data = np.random.rand(n).astype(np.float32)
data = np.sort(data)
target = true_func(data)

#Rauschen hinzufügen
noise = 0.5 * np.random.randn(n) 
target = target  + noise

#Zeichnen Sie Daten mit Rauschen

plt.scatter(data, target)

plt.title('NonLinear Regression')
plt.legend(loc=2)
スクリーンショット 2019-12-12 12.12.35.png
from sklearn.linear_model import LinearRegression

clf = LinearRegression()
data = data.reshape(-1,1)
target = target.reshape(-1,1)
clf.fit(data, target)

p_lin = clf.predict(data)

plt.scatter(data, target, label='data')
plt.plot(data, p_lin, color='darkorange', marker='', linestyle='-', linewidth=1, markersize=6, label='linear regression')
plt.legend()
print(clf.score(data, target))
スクリーンショット 2019-12-12 12.14.12.png
from sklearn.kernel_ridge import KernelRidge

clf = KernelRidge(alpha=0.0002, kernel='rbf')
clf.fit(data, target)

p_kridge = clf.predict(data)

plt.scatter(data, target, color='blue', label='data')

plt.plot(data, p_kridge, color='orange', linestyle='-', linewidth=3, markersize=6, label='kernel ridge')
plt.legend()
#plt.plot(data, p, color='orange', marker='o', linestyle='-', linewidth=1, markersize=6)
スクリーンショット 2019-12-12 12.15.24.png
#Ridge

from sklearn.metrics.pairwise import rbf_kernel
from sklearn.linear_model import Ridge

kx = rbf_kernel(X=data, Y=data, gamma=50)
#KX = rbf_kernel(X, x)

#clf = LinearRegression()
clf = Ridge(alpha=30)
clf.fit(kx, target)

p_ridge = clf.predict(kx)

plt.scatter(data, target,label='data')
for i in range(len(kx)):
    plt.plot(data, kx[i], color='black', linestyle='-', linewidth=1, markersize=3, label='rbf', alpha=0.2)

#plt.plot(data, p, color='green', marker='o', linestyle='-', linewidth=0.1, markersize=3)
plt.plot(data, p_ridge, color='green', linestyle='-', linewidth=1, markersize=3,label='ridge regression')
#plt.legend()

print(clf.score(kx, target))
スクリーンショット 2019-12-12 12.17.26.png
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline
#PolynomialFeatures(degree=1)

deg = [1,2,3,4,5,6,7,8,9,10]
for d in deg:
    regr = Pipeline([
        ('poly', PolynomialFeatures(degree=d)),
        ('linear', LinearRegression())
    ])
    regr.fit(data, target)
    # make predictions
    p_poly = regr.predict(data)
    # plot regression result
    plt.scatter(data, target, label='data')
    plt.plot(data, p_poly, label='polynomial of degree %d' % (d))
スクリーンショット 2019-12-12 12.19.29.png
#Lasso

from sklearn.metrics.pairwise import rbf_kernel
from sklearn.linear_model import Lasso

kx = rbf_kernel(X=data, Y=data, gamma=5)
#KX = rbf_kernel(X, x)

#lasso_clf = LinearRegression()
lasso_clf = Lasso(alpha=10000, max_iter=1000)
lasso_clf.fit(kx, target)

p_lasso = lasso_clf.predict(kx)

plt.scatter(data, target)

#plt.plot(data, p, color='green', marker='o', linestyle='-', linewidth=0.1, markersize=3)
plt.plot(data, p_lasso, color='green', linestyle='-', linewidth=3, markersize=3)

print(lasso_clf.score(kx, target))
スクリーンショット 2019-12-12 12.21.39.png
from sklearn import model_selection, preprocessing, linear_model, svm

# SVR-rbf
clf_svr = svm.SVR(kernel='rbf', C=1e3, gamma=0.1, epsilon=0.1)
clf_svr.fit(data, target)
y_rbf = clf_svr.fit(data, target).predict(data)
 
# plot

plt.scatter(data, target, color='darkorange', label='data')
plt.plot(data, y_rbf, color='red', label='Support Vector Regression (RBF)')
plt.legend()
plt.show()

Ergebnis


/usr/local/lib/python3.6/dist-packages/sklearn/utils/validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().
  y = column_or_1d(y, warn=True)
/usr/local/lib/python3.6/dist-packages/sklearn/utils/validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().
  y = column_or_1d(y, warn=True)
スクリーンショット 2019-12-12 12.25.35.png
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(data, target, test_size=0.1, random_state=0)
from keras.callbacks import EarlyStopping, TensorBoard, ModelCheckpoint

cb_cp = ModelCheckpoint('/content/drive/My Drive/study_ai_ml/skl_ml/out/checkpoints/weights.{epoch:02d}-{val_loss:.2f}.hdf5', verbose=1, save_weights_only=True)
cb_tf  = TensorBoard(log_dir='/content/drive/My Drive/study_ai_ml/skl_ml/out/tensorBoard', histogram_freq=0)
def relu_reg_model():
    model = Sequential()
    model.add(Dense(10, input_dim=1, activation='relu'))
    model.add(Dense(1000, activation='relu'))
    model.add(Dense(1000, activation='relu'))
    model.add(Dense(1000, activation='relu'))
    model.add(Dense(1000, activation='relu'))
    model.add(Dense(1000, activation='relu'))
    model.add(Dense(1000, activation='relu'))
    model.add(Dense(1000, activation='relu'))
    model.add(Dense(1000, activation='linear'))
#     model.add(Dense(100, activation='relu'))
#     model.add(Dense(100, activation='relu'))
#     model.add(Dense(100, activation='relu'))
#     model.add(Dense(100, activation='relu'))
    model.add(Dense(1))

    model.compile(loss='mean_squared_error', optimizer='adam')
    return model
from keras.models import Sequential
from keras.layers import Input, Dense, Dropout, BatchNormalization
from keras.wrappers.scikit_learn import KerasRegressor

# use data split and fit to run the model
estimator = KerasRegressor(build_fn=relu_reg_model, epochs=100, batch_size=5, verbose=1)

history = estimator.fit(x_train, y_train, callbacks=[cb_cp, cb_tf], validation_data=(x_test, y_test))

Ergebnis


WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:66: The name tf.get_default_graph is deprecated. Please use tf.compat.v1.get_default_graph instead.

WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:541: The name tf.placeholder is deprecated. Please use tf.compat.v1.placeholder instead.

WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:4432: The name tf.random_uniform is deprecated. Please use tf.random.uniform instead.

WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/optimizers.py:793: The name tf.train.Optimizer is deprecated. Please use tf.compat.v1.train.Optimizer instead.

WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:1033: The name tf.assign_add is deprecated. Please use tf.compat.v1.assign_add instead.

WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:1020: The name tf.assign is deprecated. Please use tf.compat.v1.assign instead.

WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:3005: The name tf.Session is deprecated. Please use tf.compat.v1.Session instead.

Train on 90 samples, validate on 10 samples
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:190: The name tf.get_default_session is deprecated. Please use tf.compat.v1.get_default_session instead.

WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:197: The name tf.ConfigProto is deprecated. Please use tf.compat.v1.ConfigProto instead.

WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:207: The name tf.global_variables is deprecated. Please use tf.compat.v1.global_variables instead.

WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:216: The name tf.is_variable_initialized is deprecated. Please use tf.compat.v1.is_variable_initialized instead.

WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:223: The name tf.variables_initializer is deprecated. Please use tf.compat.v1.variables_initializer instead.

WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/callbacks.py:1122: The name tf.summary.merge_all is deprecated. Please use tf.compat.v1.summary.merge_all instead.

WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/callbacks.py:1125: The name tf.summary.FileWriter is deprecated. Please use tf.compat.v1.summary.FileWriter instead.

Epoch 1/100
90/90 [==============================] - 2s 17ms/step - loss: 1.7399 - val_loss: 0.4522

Epoch 00001: saving model to /content/drive/My Drive/study_ai_ml/skl_ml/out/checkpoints/weights.01-0.45.hdf5
---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
<ipython-input-19-26d4341f0e70> in <module>()
      6 estimator = KerasRegressor(build_fn=relu_reg_model, epochs=100, batch_size=5, verbose=1)
      7 
----> 8 history = estimator.fit(x_train, y_train, callbacks=[cb_cp, cb_tf], validation_data=(x_test, y_test))

8 frames
/usr/local/lib/python3.6/dist-packages/h5py/_hl/files.py in make_fid(name, mode, userblock_size, fapl, fcpl, swmr)
    146         fid = h5f.create(name, h5f.ACC_EXCL, fapl=fapl, fcpl=fcpl)
    147     elif mode == 'w':
--> 148         fid = h5f.create(name, h5f.ACC_TRUNC, fapl=fapl, fcpl=fcpl)
    149     elif mode == 'a':
    150         # Open in append mode (read/write).

h5py/_objects.pyx in h5py._objects.with_phil.wrapper()

h5py/_objects.pyx in h5py._objects.with_phil.wrapper()

h5py/h5f.pyx in h5py.h5f.create()

OSError: Unable to create file (unable to open file: name = '/content/drive/My Drive/study_ai_ml/skl_ml/out/checkpoints/weights.01-0.45.hdf5', errno = 2, error message = 'No such file or directory', flags = 13, o_flags = 242)
y_pred = estimator.predict(x_train)

Ergebnis


90/90 [==============================] - 0s 1ms/step
plt.title('NonLiner Regressions via DL by ReLU')
plt.plot(data, target, 'o')
plt.plot(data, true_func(data), '.')
plt.plot(x_train, y_pred, "o", label='predicted: deep learning')
#plt.legend(loc=2)
スクリーンショット 2019-12-12 12.39.58.png
print(lasso_clf.coef_)

Ergebnis


[-0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0.
 -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0.
 -0. -0. -0. -0. -0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.
  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.
  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.
  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]

Verwandte Seiten

Kapitel 1: Lineares Regressionsmodell [Kapitel 2: Nichtlineares Regressionsmodell] (https://qiita.com/matsukura04583/items/baa3f2269537036abc57) [Kapitel 3: Logistisches Regressionsmodell] (https://qiita.com/matsukura04583/items/0fb73183e4a7a6f06aa5) [Kapitel 4: Hauptkomponentenanalyse] (https://qiita.com/matsukura04583/items/b3b5d2d22189afc9c81c) [Kapitel 5: Algorithmus 1 (k-Nachbarschaftsmethode (kNN))] (https://qiita.com/matsukura04583/items/543719b44159322221ed) [Kapitel 6: Algorithmus 2 (k-Mittel)] (https://qiita.com/matsukura04583/items/050c98c7bb1c9e91be71) [Kapitel 7: Support Vector Machine] (https://qiita.com/matsukura04583/items/6b718642bcbf97ae2ca8)

Recommended Posts