diff --git a/doc/pub/week45/html/._week45-bs000.html b/doc/pub/week45/html/._week45-bs000.html index fe1e65103..877c6bf0c 100644 --- a/doc/pub/week45/html/._week45-bs000.html +++ b/doc/pub/week45/html/._week45-bs000.html @@ -65,6 +65,11 @@ doconce format html week45.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'combinations-of-classification-results'), + ('Positive and negative prediction values', + 2, + None, + 'positive-and-negative-prediction-values'), + ('Other quantities', 2, None, 'other-quantities'), ('$F_1$ score', 2, None, 'f-1-score'), ('ROC curve', 2, None, 'roc-curve'), ('Cumulative gain curve', 2, None, 'cumulative-gain-curve'), @@ -175,29 +180,31 @@ MathJax.Hub.Config({
It is is easy to think in terms of illness. You could think of the above as
+diff --git a/doc/pub/week45/html/._week45-bs010.html b/doc/pub/week45/html/._week45-bs010.html index 2c56f7dce..ff9125e36 100644 --- a/doc/pub/week45/html/._week45-bs010.html +++ b/doc/pub/week45/html/._week45-bs010.html @@ -65,6 +65,11 @@ doconce format html week45.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'combinations-of-classification-results'), + ('Positive and negative prediction values', + 2, + None, + 'positive-and-negative-prediction-values'), + ('Other quantities', 2, None, 'other-quantities'), ('$F_1$ score', 2, None, 'f-1-score'), ('ROC curve', 2, None, 'roc-curve'), ('Cumulative gain curve', 2, None, 'cumulative-gain-curve'), @@ -175,29 +180,31 @@ MathJax.Hub.Config({
with the fall-out false positive rate
-$$ -{\displaystyle \mathrm {FPR} ={\frac {\mathrm {FP} }{\mathrm {N} }}={\frac {\mathrm {FP} }{\mathrm {FP} +\mathrm {TN} }}=1-\mathrm {TNR} } -$$ -The \( TPR \) defines how many correct positive results occur among all positive samples available during the test
with the fall-out false positive rate
+$$ +{\displaystyle \mathrm {FPR} ={\frac {\mathrm {FP} }{\mathrm {N} }}={\frac {\mathrm {FP} }{\mathrm {FP} +\mathrm {TN} }}=1-\mathrm {TNR} } $$The \( FPR \) defines how many incorrect positive results occur among +all negative samples available during the test. +
@@ -313,7 +284,7 @@ $$
-
In statistical analysis of binary classification, the F-score or -F-measure is a measure of a test's accuracy. It is calculated from the -precision and recall of the test, where the precision is the number of -true positive results divided by the number of all positive results, -including those not identified correctly, and the recall is the number -of true positive results divided by the number of all samples that -should have been identified as positive. Precision is also known as -positive predictive value, and recall is also known as sensitivity in -diagnostic binary classification. +
The positive and negative predictive values +are the proportions of positive and negative results in statistics and +diagnostic tests that are true positive and true negative results, +respectively.[1] The PPV and NPV describe the performance of a +diagnostic test or other statistical measure. A high result can be +interpreted as indicating the accuracy of such a statistic.
-The F1 score is the harmonic mean of the precision and recall. It thus -symmetrically represents both precision and recall in one metric. The -highest possible value of an F-score is 1.0, indicating perfect -precision and recall, and the lowest possible value is 0, if either -precision or recall are zero. -
+It is defined as
+ +@@ -260,7 +271,7 @@ $$
-
A receiver operating characteristic curve, or ROC curve, is a -graphical plot that illustrates the performance of a binary classifier -model at varying threshold values. -
+The ROC curve is the plot of the true positive rate (TPR) against the false positive rate (FPR) at each threshold setting. -See https://en.wikipedia.org/wiki/Receiver_operating_characteristic for more discussions. -
@@ -245,7 +263,7 @@ See 21
-
The cumulative gain curve is a performance evaluation used typically for binary classification problems. -It plots the \( TPR \) True Positive Rate or Sensitivity (which represents the -fraction of examples correctly classified -against Predictive Positive Rate, which represents -the fraction of positively predicted examples. +
In statistical analysis of binary classification, the F-score or +F-measure is a measure of a test's accuracy. It is calculated from the +precision and recall of the test, where the precision is the number of +true positive results divided by the number of all positive results, +including those not identified correctly, and the recall is the number +of true positive results divided by the number of all samples that +should have been identified as positive. Precision is also known as +positive predictive value, and recall is also known as sensitivity in +diagnostic binary classification.
+The F1 score is the harmonic mean of the precision and recall. It thus +symmetrically represents both precision and recall in one metric. The +highest possible value of an F-score is 1.0, indicating perfect +precision and recall, and the lowest possible value is 0, if either +precision or recall are zero. +
+ +It is defined as
+$$ +{\displaystyle \mathrm {F} _{1}=2\times {\frac {\mathrm {PPV} \times \mathrm {TPR} }{\mathrm {PPV} +\mathrm {TPR} }}={\frac {2\mathrm {TP} }{2\mathrm {TP} +\mathrm {FP} +\mathrm {FN} }}} +$$ + +diff --git a/doc/pub/week45/html/._week45-bs014.html b/doc/pub/week45/html/._week45-bs014.html index 67bb54df9..180bb9fc8 100644 --- a/doc/pub/week45/html/._week45-bs014.html +++ b/doc/pub/week45/html/._week45-bs014.html @@ -65,6 +65,11 @@ doconce format html week45.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'combinations-of-classification-results'), + ('Positive and negative prediction values', + 2, + None, + 'positive-and-negative-prediction-values'), + ('Other quantities', 2, None, 'other-quantities'), ('$F_1$ score', 2, None, 'f-1-score'), ('ROC curve', 2, None, 'roc-curve'), ('Cumulative gain curve', 2, None, 'cumulative-gain-curve'), @@ -175,29 +180,31 @@ MathJax.Hub.Config({
-
import matplotlib.pyplot as plt
-import numpy as np
-from sklearn.model_selection import train_test_split
-from sklearn.datasets import load_breast_cancer
-from sklearn.linear_model import LogisticRegression
+A receiver operating characteristic curve, or ROC curve, is a
+graphical plot that illustrates the performance of a binary classifier
+model at varying threshold values.
+
-# Load the data
-cancer = load_breast_cancer()
+The ROC curve is the plot of the true positive rate (TPR) against the false positive rate (FPR) at each threshold setting.
-X_train, X_test, y_train, y_test = train_test_split(cancer.data,cancer.target,random_state=0)
-print(X_train.shape)
-print(X_test.shape)
-# Logistic Regression
-logreg = LogisticRegression(solver='lbfgs')
-logreg.fit(X_train, y_train)
-
-from sklearn.preprocessing import LabelEncoder
-from sklearn.model_selection import cross_validate
-#Cross validation
-accuracy = cross_validate(logreg,X_test,y_test,cv=10)['test_score']
-print(accuracy)
-print("Test set accuracy with Logistic Regression: {:.2f}".format(logreg.score(X_test,y_test)))
-
-import scikitplot as skplt
-y_pred = logreg.predict(X_test)
-skplt.metrics.plot_confusion_matrix(y_test, y_pred, normalize=True)
-plt.show()
-y_probas = logreg.predict_proba(X_test)
-skplt.metrics.plot_roc(y_test, y_probas)
-plt.show()
-skplt.metrics.plot_cumulative_gain(y_test, y_probas)
-plt.show()
-
-To draw a ROC curve, only the true positive rate (TPR) and false +positive rate (FPR) are needed (as functions of some classifier +parameter). The TPR defines how many correct positive results occur +among all positive samples available during the test. FPR, on the +other hand, defines how many incorrect positive results occur among +all negative samples available during the test. +
+See https://en.wikipedia.org/wiki/Receiver_operating_characteristic for more discussions.
@@ -290,7 +260,7 @@ plt.show()
-
The cumulative gain curve is a performance evaluation used typically for binary classification problems. +It plots the \( TPR \) True Positive Rate or Sensitivity (which represents the +fraction of examples correctly classified +against Predictive Positive Rate, which represents +the fraction of positively predicted examples. +
+ +The examples below show the confusion matrix, the ROC curve and the cumulative gain for the Wisconsin cancer data.
@@ -236,7 +252,7 @@ MathJax.Hub.Config({
-
Till now our focus has been, including convolutional neural networks -as well, on feedforward neural networks. The output or the activations -flow only in one direction, from the input layer to the output layer. -
+ +import matplotlib.pyplot as plt
+import numpy as np
+from sklearn.model_selection import train_test_split
+from sklearn.datasets import load_breast_cancer
+from sklearn.linear_model import LogisticRegression
-A recurrent neural network (RNN) looks very much like a feedforward
-neural network, except that it also has connections pointing
-backward.
-
+# Load the data
+cancer = load_breast_cancer()
+
+X_train, X_test, y_train, y_test = train_test_split(cancer.data,cancer.target,random_state=0)
+print(X_train.shape)
+print(X_test.shape)
+# Logistic Regression
+logreg = LogisticRegression(solver='lbfgs')
+logreg.fit(X_train, y_train)
+
+from sklearn.preprocessing import LabelEncoder
+from sklearn.model_selection import cross_validate
+#Cross validation
+accuracy = cross_validate(logreg,X_test,y_test,cv=10)['test_score']
+print(accuracy)
+print("Test set accuracy with Logistic Regression: {:.2f}".format(logreg.score(X_test,y_test)))
+
+import scikitplot as skplt
+y_pred = logreg.predict(X_test)
+skplt.metrics.plot_confusion_matrix(y_test, y_pred, normalize=True)
+plt.show()
+y_probas = logreg.predict_proba(X_test)
+skplt.metrics.plot_roc(y_test, y_probas)
+plt.show()
+skplt.metrics.plot_cumulative_gain(y_test, y_probas)
+plt.show()
+
+RNNs are used to analyze time series data such as stock prices, and -tell you when to buy or sell. In autonomous driving systems, they can -anticipate car trajectories and help avoid accidents. More generally, -they can work on sequences of arbitrary lengths, rather than on -fixed-sized inputs like all the nets we have discussed so far. For -example, they can take sentences, documents, or audio samples as -input, making them extremely useful for natural language processing -systems such as automatic translation and speech-to-text. -
@@ -255,6 +296,8 @@ systems such as automatic translation and speech-to-text.
-
# Start importing packages
-import pandas as pd
-import numpy as np
-import matplotlib.pyplot as plt
-import tensorflow as tf
-from tensorflow.keras import datasets, layers, models
-from tensorflow.keras.layers import Input
-from tensorflow.keras.models import Model, Sequential
-from tensorflow.keras.layers import Dense, SimpleRNN, LSTM, GRU
-from tensorflow.keras import optimizers
-from tensorflow.keras import regularizers
-from tensorflow.keras.utils import to_categorical
-
-
-
-# convert into dataset matrix
-def convertToMatrix(data, step):
- X, Y =[], []
- for i in range(len(data)-step):
- d=i+step
- X.append(data[i:d,])
- Y.append(data[d,])
- return np.array(X), np.array(Y)
-
-step = 4
-N = 1000
-Tp = 800
-
-t=np.arange(0,N)
-x=np.sin(0.02*t)+2*np.random.rand(N)
-df = pd.DataFrame(x)
-df.head()
-
-values=df.values
-train,test = values[0:Tp,:], values[Tp:N,:]
-
-# add step elements into train and test
-test = np.append(test,np.repeat(test[-1,],step))
-train = np.append(train,np.repeat(train[-1,],step))
-
-trainX,trainY =convertToMatrix(train,step)
-testX,testY =convertToMatrix(test,step)
-trainX = np.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1]))
-testX = np.reshape(testX, (testX.shape[0], 1, testX.shape[1]))
-
-model = Sequential()
-model.add(SimpleRNN(units=32, input_shape=(1,step), activation="relu"))
-model.add(Dense(8, activation="relu"))
-model.add(Dense(1))
-model.compile(loss='mean_squared_error', optimizer='rmsprop')
-model.summary()
-
-model.fit(trainX,trainY, epochs=100, batch_size=16, verbose=2)
-trainPredict = model.predict(trainX)
-testPredict= model.predict(testX)
-predicted=np.concatenate((trainPredict,testPredict),axis=0)
-
-trainScore = model.evaluate(trainX, trainY, verbose=0)
-print(trainScore)
-plt.plot(df)
-plt.plot(predicted)
-plt.show()
-
-RNNs are very powerful, because they -combine two properties: -
-With enough neurons and time, RNNs -can compute anything that can be -computed by your computer! -
+@@ -331,6 +241,9 @@ computed by your computer!
-

This is the natural way to model most sequential data.
-



We can think of the recurrent net as a layered, feed-forward -net with shared weights and then train the feed-forward net -with weight constraints. -
-We can also think of this training algorithm in the time domain:
-The forward pass determines the slope of the linear function used for -backpropagating through each neuron +
Till now our focus has been, including convolutional neural networks +as well, on feedforward neural networks. The output or the activations +flow only in one direction, from the input layer to the output layer.
-
A recurrent neural network (RNN) looks very much like a feedforward +neural network, except that it also has connections pointing +backward. +
-





RNNs are used to analyze time series data such as stock prices, and +tell you when to buy or sell. In autonomous driving systems, they can +anticipate car trajectories and help avoid accidents. More generally, +they can work on sequences of arbitrary lengths, rather than on +fixed-sized inputs like all the nets we have discussed so far. For +example, they can take sentences, documents, or audio samples as +input, making them extremely useful for natural language processing +systems such as automatic translation and speech-to-text. +
@@ -365,6 +260,8 @@ backpropagating through each neuron
- -
# Start importing packages
+import pandas as pd
+import numpy as np
+import matplotlib.pyplot as plt
+import tensorflow as tf
+from tensorflow.keras import datasets, layers, models
+from tensorflow.keras.layers import Input
+from tensorflow.keras.models import Model, Sequential
+from tensorflow.keras.layers import Dense, SimpleRNN, LSTM, GRU
+from tensorflow.keras import optimizers
+from tensorflow.keras import regularizers
+from tensorflow.keras.utils import to_categorical
+
+
+
+# convert into dataset matrix
+def convertToMatrix(data, step):
+ X, Y =[], []
+ for i in range(len(data)-step):
+ d=i+step
+ X.append(data[i:d,])
+ Y.append(data[d,])
+ return np.array(X), np.array(Y)
+
+step = 4
+N = 1000
+Tp = 800
+
+t=np.arange(0,N)
+x=np.sin(0.02*t)+2*np.random.rand(N)
+df = pd.DataFrame(x)
+df.head()
+
+values=df.values
+train,test = values[0:Tp,:], values[Tp:N,:]
+
+# add step elements into train and test
+test = np.append(test,np.repeat(test[-1,],step))
+train = np.append(train,np.repeat(train[-1,],step))
+
+trainX,trainY =convertToMatrix(train,step)
+testX,testY =convertToMatrix(test,step)
+trainX = np.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1]))
+testX = np.reshape(testX, (testX.shape[0], 1, testX.shape[1]))
+
+model = Sequential()
+model.add(SimpleRNN(units=32, input_shape=(1,step), activation="relu"))
+model.add(Dense(8, activation="relu"))
+model.add(Dense(1))
+model.compile(loss='mean_squared_error', optimizer='rmsprop')
+model.summary()
+
+model.fit(trainX,trainY, epochs=100, batch_size=16, verbose=2)
+trainPredict = model.predict(trainX)
+testPredict= model.predict(testX)
+predicted=np.concatenate((trainPredict,testPredict),axis=0)
+
+trainScore = model.evaluate(trainX, trainY, verbose=0)
+print(trainScore)
+plt.plot(df)
+plt.plot(predicted)
+plt.show()
+
+RNNs are very powerful, because they +combine two properties: +
+RNNs have difficulty dealing with long-range dependencies.
+With enough neurons and time, RNNs +can compute anything that can be +computed by your computer! +
@@ -246,6 +336,8 @@ MathJax.Hub.Config({
-

This is the natural way to model most sequential data.
+
LSTM uses a memory cell for
- modeling long-range dependencies and avoid vanishing gradient
- problems.
+
+



We can think of the recurrent net as a layered, feed-forward +net with shared weights and then train the feed-forward net +with weight constraints.
+We can also think of this training algorithm in the time domain:
+To preserve information for a long time in -the activities of an RNN, we use a circuit -that implements an analog memory cell. +
The forward pass determines the slope of the linear function used for +backpropagating through each neuron
-
















- -
The following code provides an example of how recurrent neural -networks can be used to extrapolate to unknown values of physics data -sets. Specifically, the data sets used in this program come from -a quantum mechanical many-body calculation of energies as functions of the number of particles. -
- - - -# For matrices and calculations
-import numpy as np
-# For machine learning (backend for keras)
-import tensorflow as tf
-# User-friendly machine learning library
-# Front end for TensorFlow
-import tensorflow.keras
-# Different methods from Keras needed to create an RNN
-# This is not necessary but it shortened function calls
-# that need to be used in the code.
-from tensorflow.keras import datasets, layers, models
-from tensorflow.keras.layers import Input
-from tensorflow.keras import regularizers
-from tensorflow.keras.models import Model, Sequential
-from tensorflow.keras.layers import Dense, SimpleRNN, LSTM, GRU
-# For timing the code
-from timeit import default_timer as timer
-# For plotting
-import matplotlib.pyplot as plt
-
-
-# The data set
-datatype='VaryDimension'
-X_tot = np.arange(2, 42, 2)
-y_tot = np.array([-0.03077640549, -0.08336233266, -0.1446729567, -0.2116753732, -0.2830637392, -0.3581341341, -0.436462435, -0.5177783846,
- -0.6019067271, -0.6887363571, -0.7782028952, -0.8702784034, -0.9649652536, -1.062292565, -1.16231451,
- -1.265109911, -1.370782966, -1.479465113, -1.591317992, -1.70653767])
-
-RNNs have difficulty dealing with long-range dependencies.
@@ -286,6 +251,8 @@ y_tot = np.24
The way the recurrent neural networks are trained in this program
-differs from how machine learning algorithms are usually trained.
-Typically a machine learning algorithm is trained by learning the
-relationship between the x data and the y data. In this program, the
-recurrent neural network will be trained to recognize the relationship
-in a sequence of y values. This is type of data formatting is
-typically used time series forcasting, but it can also be used in any
-extrapolation (time series forecasting is just a specific type of
-extrapolation along the time axis). This method of data formatting
-does not use the x data and assumes that the y data are evenly spaced.
+ LSTM uses a memory cell for
+ modeling long-range dependencies and avoid vanishing gradient
+ problems.
For a standard machine learning algorithm, the training data has the
-form of (x,y) so the machine learning algorithm learns to assiciate a
-y value with a given x value. This is useful when the test data has x
-values within the same range as the training data. However, for this
-application, the x values of the test data are outside of the x values
-of the training data and the traditional method of training a machine
-learning algorithm does not work as well. For this reason, the
-recurrent neural network is trained on sequences of y values of the
-form ((y1, y2), y3), so that the network is concerned with learning
-the pattern of the y data and not the relation between the x and y
-data. As long as the pattern of y data outside of the training region
-stays relatively stable compared to what was inside the training
-region, this method of training can produce accurate extrapolations to
-y values far removed from the training data set.
+ To preserve information for a long time in
+the activities of an RNN, we use a circuit
+that implements an analog memory cell.
@@ -359,6 +330,8 @@ y values far removed from the training data set.
The following code provides an example of how recurrent neural
+networks can be used to extrapolate to unknown values of physics data
+sets. Specifically, the data sets used in this program come from
+a quantum mechanical many-body calculation of energies as functions of the number of particles.
+ Changing the size of the recurrent neural network and its parameters
-can drastically change the results you get from the model. The below
-code takes the simple recurrent neural network from above and adds a
-second hidden layer, changes the number of neurons in the hidden
-layer, and explicitly declares the activation function of the hidden
-layers to be a sigmoid function. The loss function and optimizer can
-also be changed but are kept the same as the above network. These
-parameters can be tuned to provide the optimal result from the
-network. For some ideas on how to improve the performance of a
-recurrent neural network.
+ The way the recurrent neural networks are trained in this program
+differs from how machine learning algorithms are usually trained.
+Typically a machine learning algorithm is trained by learning the
+relationship between the x data and the y data. In this program, the
+recurrent neural network will be trained to recognize the relationship
+in a sequence of y values. This is type of data formatting is
+typically used time series forcasting, but it can also be used in any
+extrapolation (time series forecasting is just a specific type of
+extrapolation along the time axis). This method of data formatting
+does not use the x data and assumes that the y data are evenly spaced.
For a standard machine learning algorithm, the training data has the
+form of (x,y) so the machine learning algorithm learns to assiciate a
+y value with a given x value. This is useful when the test data has x
+values within the same range as the training data. However, for this
+application, the x values of the test data are outside of the x values
+of the training data and the traditional method of training a machine
+learning algorithm does not work as well. For this reason, the
+recurrent neural network is trained on sequences of y values of the
+form ((y1, y2), y3), so that the network is concerned with learning
+the pattern of the y data and not the relation between the x and y
+data. As long as the pattern of y data outside of the training region
+stays relatively stable compared to what was inside the training
+region, this method of training can produce accurate extrapolations to
+y values far removed from the training data set.
+ Besides a simple recurrent neural network layer, there are two other
-commonly used types of recurrent neural network layers: Long Short
-Term Memory (LSTM) and Gated Recurrent Unit (GRU). For a short
-introduction to these layers see https://medium.com/mindboard/lstm-vs-gru-experimental-comparison-955820c21e8b
-and https://medium.com/mindboard/lstm-vs-gru-experimental-comparison-955820c21e8b.
- The first network created below is similar to the previous network,
-but it replaces the SimpleRNN layers with LSTM layers. The second
-network below has two hidden layers made up of GRUs, which are
-preceeded by two dense (feeddorward) neural network layers. These
-dense layers "preprocess" the data before it reaches the recurrent
-layers. This architecture has been shown to improve the performance
-of recurrent neural networks (see the link above and also
-https://arxiv.org/pdf/1807.02857.pdf.
-Formatting the Data
+Four effective ways to learn an RNN
+
+
+
+
+Long Short Term Memory (LSTM)
-
+
+Implementing a memory cell in a neural network
+
+
+
+
+
+
-
-# FORMAT_DATA
-def format_data(data, length_of_sequence = 2):
- """
- Inputs:
- data(a numpy array): the data that will be the inputs to the recurrent neural
- network
- length_of_sequence (an int): the number of elements in one iteration of the
- sequence patter. For a function approximator use length_of_sequence = 2.
- Returns:
- rnn_input (a 3D numpy array): the input data for the recurrent neural network. Its
- dimensions are length of data - length of sequence, length of sequence,
- dimnsion of data
- rnn_output (a numpy array): the training data for the neural network
- Formats data to be used in a recurrent neural network.
- """
+
-
+
- X, Y = [], []
- for i in range(len(data)-length_of_sequence):
- # Get the next length_of_sequence elements
- a = data[i:i+length_of_sequence]
- # Get the element that immediately follows that
- b = data[i+length_of_sequence]
- # Reshape so that each data point is contained in its own array
- a = np.reshape (a, (len(a), 1))
- X.append(a)
- Y.append(b)
- rnn_input = np.array(X)
- rnn_output = np.array(Y)
+
+
- return rnn_input, rnn_output
+
+
+
+
-# ## Defining the Recurrent Neural Network Using Keras
-#
-# The following method defines a simple recurrent neural network in keras consisting of one input layer, one hidden layer, and one output layer.
+
+
-def rnn(length_of_sequences, batch_size = None, stateful = False):
- """
- Inputs:
- length_of_sequences (an int): the number of y values in "x data". This is determined
- when the data is formatted
- batch_size (an int): Default value is None. See Keras documentation of SimpleRNN.
- stateful (a boolean): Default value is False. See Keras documentation of SimpleRNN.
- Returns:
- model (a Keras model): The recurrent neural network that is built and compiled by this
- method
- Builds and compiles a recurrent neural network with one hidden layer and returns the model.
- """
- # Number of neurons in the input and output layers
- in_out_neurons = 1
- # Number of neurons in the hidden layer
- hidden_neurons = 200
- # Define the input layer
- inp = Input(batch_shape=(batch_size,
- length_of_sequences,
- in_out_neurons))
- # Define the hidden layer as a simple RNN layer with a set number of neurons and add it to
- # the network immediately after the input layer
- rnn = SimpleRNN(hidden_neurons,
- return_sequences=False,
- stateful = stateful,
- name="RNN")(inp)
- # Define the output layer as a dense neural network layer (standard neural network layer)
- #and add it to the network immediately after the hidden layer.
- dens = Dense(in_out_neurons,name="dense")(rnn)
- # Create the machine learning model starting with the input layer and ending with the
- # output layer
- model = Model(inputs=[inp],outputs=[dens])
- # Compile the machine learning model using the mean squared error function as the loss
- # function and an Adams optimizer.
- model.compile(loss="mean_squared_error", optimizer="adam")
- return model
-
+
+
+
+
+
+
Predicting New Points With A Trained Recurrent Neural Network
+An extrapolation example
+
+def test_rnn (x1, y_test, plot_min, plot_max):
- """
- Inputs:
- x1 (a list or numpy array): The complete x component of the data set
- y_test (a list or numpy array): The complete y component of the data set
- plot_min (an int or float): the smallest x value used in the training data
- plot_max (an int or float): the largest x valye used in the training data
- Returns:
- None.
- Uses a trained recurrent neural network model to predict future points in the
- series. Computes the MSE of the predicted data set from the true data set, saves
- the predicted data set to a csv file, and plots the predicted and true data sets w
- while also displaying the data range used for training.
- """
- # Add the training data as the first dim points in the predicted data array as these
- # are known values.
- y_pred = y_test[:dim].tolist()
- # Generate the first input to the trained recurrent neural network using the last two
- # points of the training data. Based on how the network was trained this means that it
- # will predict the first point in the data set after the training data. All of the
- # brackets are necessary for Tensorflow.
- next_input = np.array([[[y_test[dim-2]], [y_test[dim-1]]]])
- # Save the very last point in the training data set. This will be used later.
- last = [y_test[dim-1]]
-
- # Iterate until the complete data set is created.
- for i in range (dim, len(y_test)):
- # Predict the next point in the data set using the previous two points.
- next = model.predict(next_input)
- # Append just the number of the predicted data set
- y_pred.append(next[0][0])
- # Create the input that will be used to predict the next data point in the data set.
- next_input = np.array([[last, next[0]]], dtype=np.float64)
- last = next
-
- # Print the mean squared error between the known data set and the predicted data set.
- print('MSE: ', np.square(np.subtract(y_test, y_pred)).mean())
- # Save the predicted data set as a csv file for later use
- name = datatype + 'Predicted'+str(dim)+'.csv'
- np.savetxt(name, y_pred, delimiter=',')
- # Plot the known data set and the predicted data set. The red box represents the region that was used
- # for the training data.
- fig, ax = plt.subplots()
- ax.plot(x1, y_test, label="true", linewidth=3)
- ax.plot(x1, y_pred, 'g-.',label="predicted", linewidth=4)
- ax.legend()
- # Created a red region to represent the points used in the training data.
- ax.axvspan(plot_min, plot_max, alpha=0.25, color='red')
- plt.show()
-
-# Check to make sure the data set is complete
-assert len(X_tot) == len(y_tot)
-
-# This is the number of points that will be used in as the training data
-dim=12
-
-# Separate the training data from the whole data set
-X_train = X_tot[:dim]
-y_train = y_tot[:dim]
+
# For matrices and calculations
+import numpy as np
+# For machine learning (backend for keras)
+import tensorflow as tf
+# User-friendly machine learning library
+# Front end for TensorFlow
+import tensorflow.keras
+# Different methods from Keras needed to create an RNN
+# This is not necessary but it shortened function calls
+# that need to be used in the code.
+from tensorflow.keras import datasets, layers, models
+from tensorflow.keras.layers import Input
+from tensorflow.keras import regularizers
+from tensorflow.keras.models import Model, Sequential
+from tensorflow.keras.layers import Dense, SimpleRNN, LSTM, GRU
+# For timing the code
+from timeit import default_timer as timer
+# For plotting
+import matplotlib.pyplot as plt
-# Generate the training data for the RNN, using a sequence of 2
-rnn_input, rnn_training = format_data(y_train, 2)
-
-
-# Create a recurrent neural network in Keras and produce a summary of the
-# machine learning model
-model = rnn(length_of_sequences = rnn_input.shape[1])
-model.summary()
-
-# Start the timer. Want to time training+testing
-start = timer()
-# Fit the model using the training data genenerated above using 150 training iterations and a 5%
-# validation split. Setting verbose to True prints information about each training iteration.
-hist = model.fit(rnn_input, rnn_training, batch_size=None, epochs=150,
- verbose=True,validation_split=0.05)
-
-for label in ["loss","val_loss"]:
- plt.plot(hist.history[label],label=label)
-
-plt.ylabel("loss")
-plt.xlabel("epoch")
-plt.title("The final validation loss: {}".format(hist.history["val_loss"][-1]))
-plt.legend()
-plt.show()
-
-# Use the trained neural network to predict more points of the data set
-test_rnn(X_tot, y_tot, X_tot[0], X_tot[dim-1])
-# Stop the timer and calculate the total time needed.
-end = timer()
-print('Time: ', end-start)
+# The data set
+datatype='VaryDimension'
+X_tot = np.arange(2, 42, 2)
+y_tot = np.array([-0.03077640549, -0.08336233266, -0.1446729567, -0.2116753732, -0.2830637392, -0.3581341341, -0.436462435, -0.5177783846,
+ -0.6019067271, -0.6887363571, -0.7782028952, -0.8702784034, -0.9649652536, -1.062292565, -1.16231451,
+ -1.265109911, -1.370782966, -1.479465113, -1.591317992, -1.70653767])
Other Things to Try
+Formatting the Data
-def rnn_2layers(length_of_sequences, batch_size = None, stateful = False):
+
# FORMAT_DATA
+def format_data(data, length_of_sequence = 2):
+ """
+ Inputs:
+ data(a numpy array): the data that will be the inputs to the recurrent neural
+ network
+ length_of_sequence (an int): the number of elements in one iteration of the
+ sequence patter. For a function approximator use length_of_sequence = 2.
+ Returns:
+ rnn_input (a 3D numpy array): the input data for the recurrent neural network. Its
+ dimensions are length of data - length of sequence, length of sequence,
+ dimnsion of data
+ rnn_output (a numpy array): the training data for the neural network
+ Formats data to be used in a recurrent neural network.
+ """
+
+ X, Y = [], []
+ for i in range(len(data)-length_of_sequence):
+ # Get the next length_of_sequence elements
+ a = data[i:i+length_of_sequence]
+ # Get the element that immediately follows that
+ b = data[i+length_of_sequence]
+ # Reshape so that each data point is contained in its own array
+ a = np.reshape (a, (len(a), 1))
+ X.append(a)
+ Y.append(b)
+ rnn_input = np.array(X)
+ rnn_output = np.array(Y)
+
+ return rnn_input, rnn_output
+
+
+# ## Defining the Recurrent Neural Network Using Keras
+#
+# The following method defines a simple recurrent neural network in keras consisting of one input layer, one hidden layer, and one output layer.
+
+def rnn(length_of_sequences, batch_size = None, stateful = False):
"""
Inputs:
length_of_sequences (an int): the number of y values in "x data". This is determined
@@ -240,29 +306,25 @@ network. For some ideas on how to improve the performance of a
Returns:
model (a Keras model): The recurrent neural network that is built and compiled by this
method
- Builds and compiles a recurrent neural network with two hidden layers and returns the model.
+ Builds and compiles a recurrent neural network with one hidden layer and returns the model.
"""
# Number of neurons in the input and output layers
in_out_neurons = 1
- # Number of neurons in the hidden layer, increased from the first network
- hidden_neurons = 500
+ # Number of neurons in the hidden layer
+ hidden_neurons = 200
# Define the input layer
inp = Input(batch_shape=(batch_size,
length_of_sequences,
in_out_neurons))
- # Create two hidden layers instead of one hidden layer. Explicitly set the activation
- # function to be the sigmoid function (the default value is hyperbolic tangent)
- rnn1 = SimpleRNN(hidden_neurons,
- return_sequences=True, # This needs to be True if another hidden layer is to follow
- stateful = stateful, activation = 'sigmoid',
- name="RNN1")(inp)
- rnn2 = SimpleRNN(hidden_neurons,
- return_sequences=False, activation = 'sigmoid',
+ # Define the hidden layer as a simple RNN layer with a set number of neurons and add it to
+ # the network immediately after the input layer
+ rnn = SimpleRNN(hidden_neurons,
+ return_sequences=False,
stateful = stateful,
- name="RNN2")(rnn1)
+ name="RNN")(inp)
# Define the output layer as a dense neural network layer (standard neural network layer)
#and add it to the network immediately after the hidden layer.
- dens = Dense(in_out_neurons,name="dense")(rnn2)
+ dens = Dense(in_out_neurons,name="dense")(rnn)
# Create the machine learning model starting with the input layer and ending with the
# output layer
model = Model(inputs=[inp],outputs=[dens])
@@ -270,52 +332,6 @@ network. For some ideas on how to improve the performance of a
# function and an Adams optimizer.
model.compile(loss="mean_squared_error", optimizer="adam")
return model
-
-# Check to make sure the data set is complete
-assert len(X_tot) == len(y_tot)
-
-# This is the number of points that will be used in as the training data
-dim=12
-
-# Separate the training data from the whole data set
-X_train = X_tot[:dim]
-y_train = y_tot[:dim]
-
-
-# Generate the training data for the RNN, using a sequence of 2
-rnn_input, rnn_training = format_data(y_train, 2)
-
-
-# Create a recurrent neural network in Keras and produce a summary of the
-# machine learning model
-model = rnn_2layers(length_of_sequences = 2)
-model.summary()
-
-# Start the timer. Want to time training+testing
-start = timer()
-# Fit the model using the training data genenerated above using 150 training iterations and a 5%
-# validation split. Setting verbose to True prints information about each training iteration.
-hist = model.fit(rnn_input, rnn_training, batch_size=None, epochs=150,
- verbose=True,validation_split=0.05)
-
-
-# This section plots the training loss and the validation loss as a function of training iteration.
-# This is not required for analyzing the couple cluster data but can help determine if the network is
-# being overtrained.
-for label in ["loss","val_loss"]:
- plt.plot(hist.history[label],label=label)
-
-plt.ylabel("loss")
-plt.xlabel("epoch")
-plt.title("The final validation loss: {}".format(hist.history["val_loss"][-1]))
-plt.legend()
-plt.show()
-
-# Use the trained neural network to predict more points of the data set
-test_rnn(X_tot, y_tot, X_tot[0], X_tot[dim-1])
-# Stop the timer and calculate the total time needed.
-end = timer()
-print('Time: ', end-start)
Other Types of Recurrent Neural Networks
-
-Predicting New Points With A Trained Recurrent Neural Network
@@ -235,83 +225,55 @@ of recurrent neural networks (see the link above and also
def lstm_2layers(length_of_sequences, batch_size = None, stateful = False):
+
def test_rnn (x1, y_test, plot_min, plot_max):
"""
Inputs:
- length_of_sequences (an int): the number of y values in "x data". This is determined
- when the data is formatted
- batch_size (an int): Default value is None. See Keras documentation of SimpleRNN.
- stateful (a boolean): Default value is False. See Keras documentation of SimpleRNN.
+ x1 (a list or numpy array): The complete x component of the data set
+ y_test (a list or numpy array): The complete y component of the data set
+ plot_min (an int or float): the smallest x value used in the training data
+ plot_max (an int or float): the largest x valye used in the training data
Returns:
- model (a Keras model): The recurrent neural network that is built and compiled by this
- method
- Builds and compiles a recurrent neural network with two LSTM hidden layers and returns the model.
+ None.
+ Uses a trained recurrent neural network model to predict future points in the
+ series. Computes the MSE of the predicted data set from the true data set, saves
+ the predicted data set to a csv file, and plots the predicted and true data sets w
+ while also displaying the data range used for training.
"""
- # Number of neurons on the input/output layer and the number of neurons in the hidden layer
- in_out_neurons = 1
- hidden_neurons = 250
- # Input Layer
- inp = Input(batch_shape=(batch_size,
- length_of_sequences,
- in_out_neurons))
- # Hidden layers (in this case they are LSTM layers instead if SimpleRNN layers)
- rnn= LSTM(hidden_neurons,
- return_sequences=True,
- stateful = stateful,
- name="RNN", use_bias=True, activation='tanh')(inp)
- rnn1 = LSTM(hidden_neurons,
- return_sequences=False,
- stateful = stateful,
- name="RNN1", use_bias=True, activation='tanh')(rnn)
- # Output layer
- dens = Dense(in_out_neurons,name="dense")(rnn1)
- # Define the midel
- model = Model(inputs=[inp],outputs=[dens])
- # Compile the model
- model.compile(loss='mean_squared_error', optimizer='adam')
- # Return the model
- return model
+ # Add the training data as the first dim points in the predicted data array as these
+ # are known values.
+ y_pred = y_test[:dim].tolist()
+ # Generate the first input to the trained recurrent neural network using the last two
+ # points of the training data. Based on how the network was trained this means that it
+ # will predict the first point in the data set after the training data. All of the
+ # brackets are necessary for Tensorflow.
+ next_input = np.array([[[y_test[dim-2]], [y_test[dim-1]]]])
+ # Save the very last point in the training data set. This will be used later.
+ last = [y_test[dim-1]]
-def dnn2_gru2(length_of_sequences, batch_size = None, stateful = False):
- """
- Inputs:
- length_of_sequences (an int): the number of y values in "x data". This is determined
- when the data is formatted
- batch_size (an int): Default value is None. See Keras documentation of SimpleRNN.
- stateful (a boolean): Default value is False. See Keras documentation of SimpleRNN.
- Returns:
- model (a Keras model): The recurrent neural network that is built and compiled by this
- method
- Builds and compiles a recurrent neural network with four hidden layers (two dense followed by
- two GRU layers) and returns the model.
- """
- # Number of neurons on the input/output layers and hidden layers
- in_out_neurons = 1
- hidden_neurons = 250
- # Input layer
- inp = Input(batch_shape=(batch_size,
- length_of_sequences,
- in_out_neurons))
- # Hidden Dense (feedforward) layers
- dnn = Dense(hidden_neurons/2, activation='relu', name='dnn')(inp)
- dnn1 = Dense(hidden_neurons/2, activation='relu', name='dnn1')(dnn)
- # Hidden GRU layers
- rnn1 = GRU(hidden_neurons,
- return_sequences=True,
- stateful = stateful,
- name="RNN1", use_bias=True)(dnn1)
- rnn = GRU(hidden_neurons,
- return_sequences=False,
- stateful = stateful,
- name="RNN", use_bias=True)(rnn1)
- # Output layer
- dens = Dense(in_out_neurons,name="dense")(rnn)
- # Define the model
- model = Model(inputs=[inp],outputs=[dens])
- # Compile the mdoel
- model.compile(loss='mean_squared_error', optimizer='adam')
- # Return the model
- return model
+ # Iterate until the complete data set is created.
+ for i in range (dim, len(y_test)):
+ # Predict the next point in the data set using the previous two points.
+ next = model.predict(next_input)
+ # Append just the number of the predicted data set
+ y_pred.append(next[0][0])
+ # Create the input that will be used to predict the next data point in the data set.
+ next_input = np.array([[last, next[0]]], dtype=np.float64)
+ last = next
+
+ # Print the mean squared error between the known data set and the predicted data set.
+ print('MSE: ', np.square(np.subtract(y_test, y_pred)).mean())
+ # Save the predicted data set as a csv file for later use
+ name = datatype + 'Predicted'+str(dim)+'.csv'
+ np.savetxt(name, y_pred, delimiter=',')
+ # Plot the known data set and the predicted data set. The red box represents the region that was used
+ # for the training data.
+ fig, ax = plt.subplots()
+ ax.plot(x1, y_test, label="true", linewidth=3)
+ ax.plot(x1, y_pred, 'g-.',label="predicted", linewidth=4)
+ ax.legend()
+ # Created a red region to represent the points used in the training data.
+ ax.axvspan(plot_min, plot_max, alpha=0.25, color='red')
+ plt.show()
# Check to make sure the data set is complete
assert len(X_tot) == len(y_tot)
@@ -330,8 +292,7 @@ rnn_input, rnn_training = format_data(y_trai
# Create a recurrent neural network in Keras and produce a summary of the
# machine learning model
-# Change the method name to reflect which network you want to use
-model = dnn2_gru2(length_of_sequences = 2)
+model = rnn(length_of_sequences = rnn_input.shape[1])
model.summary()
# Start the timer. Want to time training+testing
@@ -341,10 +302,6 @@ start = timer()
hist = model.fit(rnn_input, rnn_training, batch_size=None, epochs=150,
verbose=True,validation_split=0.05)
-
-# This section plots the training loss and the validation loss as a function of training iteration.
-# This is not required for analyzing the couple cluster data but can help determine if the network is
-# being overtrained.
for label in ["loss","val_loss"]:
plt.plot(hist.history[label],label=label)
@@ -359,72 +316,6 @@ test_rnn(X_tot, y_tot, X_tot[0], X_tot[dim
# Stop the timer and calculate the total time needed.
end = timer()
print('Time: ', end-start)
-
-
-# ### Training Recurrent Neural Networks in the Standard Way (i.e. learning the relationship between the X and Y data)
-#
-# Finally, comparing the performace of a recurrent neural network using the standard data formatting to the performance of the network with time sequence data formatting shows the benefit of this type of data formatting with extrapolation.
-
-# Check to make sure the data set is complete
-assert len(X_tot) == len(y_tot)
-
-# This is the number of points that will be used in as the training data
-dim=12
-
-# Separate the training data from the whole data set
-X_train = X_tot[:dim]
-y_train = y_tot[:dim]
-
-# Reshape the data for Keras specifications
-X_train = X_train.reshape((dim, 1))
-y_train = y_train.reshape((dim, 1))
-
-
-# Create a recurrent neural network in Keras and produce a summary of the
-# machine learning model
-# Set the sequence length to 1 for regular data formatting
-model = rnn(length_of_sequences = 1)
-model.summary()
-
-# Start the timer. Want to time training+testing
-start = timer()
-# Fit the model using the training data genenerated above using 150 training iterations and a 5%
-# validation split. Setting verbose to True prints information about each training iteration.
-hist = model.fit(X_train, y_train, batch_size=None, epochs=150,
- verbose=True,validation_split=0.05)
-
-
-# This section plots the training loss and the validation loss as a function of training iteration.
-# This is not required for analyzing the couple cluster data but can help determine if the network is
-# being overtrained.
-for label in ["loss","val_loss"]:
- plt.plot(hist.history[label],label=label)
-
-plt.ylabel("loss")
-plt.xlabel("epoch")
-plt.title("The final validation loss: {}".format(hist.history["val_loss"][-1]))
-plt.legend()
-plt.show()
-
-# Use the trained neural network to predict the remaining data points
-X_pred = X_tot[dim:]
-X_pred = X_pred.reshape((len(X_pred), 1))
-y_model = model.predict(X_pred)
-y_pred = np.concatenate((y_tot[:dim], y_model.flatten()))
-
-# Plot the known data set and the predicted data set. The red box represents the region that was used
-# for the training data.
-fig, ax = plt.subplots()
-ax.plot(X_tot, y_tot, label="true", linewidth=3)
-ax.plot(X_tot, y_pred, 'g-.',label="predicted", linewidth=4)
-ax.legend()
-# Created a red region to represent the points used in the training data.
-ax.axvspan(X_tot[0], X_tot[dim], alpha=0.25, color='red')
-plt.show()
-
-# Stop the timer and calculate the total time needed.
-end = timer()
-print('Time: ', end-start)