搭建神经网络进行简单的回归预测

先展示数据集如下

搭建神经网络进行简单的回归预测_第1张图片

回归预测的目的是预测出Adj Close列的值,先附上所有代码

import numpy as np
import pandas as pd
import  matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras import layers
import tensorflow.keras
import warnings
warnings.filterwarnings("ignore")

features = pd.read_csv(r"D:\python\apple.csv")
print(features.head())

features = pd.get_dummies(features)
print(features.head())

label = np.array(features['Adj Close'])
features = features.drop('Adj Close',axis=1)

features_list = list(features.columns)
features = np.array(features)

from sklearn import preprocessing

input_features = preprocessing.StandardScaler().fit_transform(features)

model = tf.keras.Sequential()
model.add(layers.Dense(16,kernel_initializer = 'random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.03)))
model.add(layers.Dense(32,kernel_initializer = 'random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.03)))
model.add(layers.Dense(1,kernel_initializer = 'random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.03)))

model.compile(optimizer=tf.keras.optimizers.SGD(0.001),loss = 'mean_squared_error')
model.fit(input_features,label,validation_split=0.25,epochs=10,batch_size=64)

print(model.summary())

再来细说我认为比较重要的几段代码。

1:独热编码

对于一些非数值型特征的特征值,我们往往需要将其进行处理。这里有特定的函数可以直接进行转换。

features = pd.get_dummies(features)
print(features.head())


    Open   High    Low  ...  Date_2014-07-03  Date_2014-07-07  Date_2014-07-08
0  96.27  96.80  93.92  ...                0                0                1
1  94.14  95.99  94.10  ...                0                1                0
2  93.67  94.10  93.20  ...                1                0                0
3  93.87  94.06  93.09  ...                0                0                0
4  93.52  94.07  93.13  ...                0                0                0

2:标签提取和格式转换:

label = np.array(features['Adj Close'])
features = features.drop('Adj Close',axis=1)

将预测值单独提取出来,并转换为array格式,并在原表中把预测值删去。

features_list = list(features.columns)
features = np.array(features)

同样把features转换为array型,如下:
[[96.27 96.8  93.92 ...  0.    0.    1.  ]
 [94.14 95.99 94.1  ...  0.    1.    0.  ]
 [93.67 94.1  93.2  ...  1.    0.    0.  ]
 ...
 [25.37 25.37 25.25 ...  0.    0.    0.  ]
 [27.38 27.38 27.25 ...  0.    0.    0.  ]
 [28.75 28.87 28.75 ...  0.    0.    0.  ]]

3:基于keras构建网络模型:

一些常用的参数如下:

1:activation:激活函数的选择,一般常用relu。

2:kernel_initiailzer,bias_initiailzer:权重与偏置参数的初始化方法,有时候不收敛换种初始化方式就突然好使了。。。玄学

3:kernel_regularizer,bias_regularizer:要不要加入正则化

4:inputs:输入,可以自己指定,也可以让网络自动选择

5:units:神经元个数

按顺序构造网络模型如下:

model = tf.keras.Sequential()
model.add(layers.Dense(16,kernel_initializer = 'random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.03)))
model.add(layers.Dense(32,kernel_initializer = 'random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.03)))
model.add(layers.Dense(1,kernel_initializer = 'random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.03)))

compile相当于对网络进行配置,指定优化器和损失函数等:

model.compile(optimizer=tf.keras.optimizers.SGD(0.001),loss = 'mean_squared_error')
model.fit(input_features,label,validation_split=0.25,epochs=10,batch_size=64)

SGD梯度下降,最后打印出来结果如下:

Epoch 1/10
100/100 [==============================] - 1s 5ms/step - loss: 495.3839 - val_loss: 74.8041
Epoch 2/10
100/100 [==============================] - 0s 2ms/step - loss: 108.1067 - val_loss: 63.7927
Epoch 3/10
100/100 [==============================] - 0s 2ms/step - loss: 43.9638 - val_loss: 51.7097
Epoch 4/10
100/100 [==============================] - 0s 2ms/step - loss: 23.7410 - val_loss: 40.7557
Epoch 5/10
100/100 [==============================] - 0s 2ms/step - loss: 17.7643 - val_loss: 59.5351
Epoch 6/10
100/100 [==============================] - 0s 2ms/step - loss: 13.9196 - val_loss: 61.0615
Epoch 7/10
100/100 [==============================] - 0s 2ms/step - loss: 12.1676 - val_loss: 59.8782
Epoch 8/10
100/100 [==============================] - 0s 2ms/step - loss: 12.4974 - val_loss: 59.4272
Epoch 9/10
100/100 [==============================] - 0s 2ms/step - loss: 11.3719 - val_loss: 60.3682
Epoch 10/10
100/100 [==============================] - 0s 2ms/step - loss: 10.7299 - val_loss: 62.4113

最后补一点小插曲。

对于某些场景,调整一些参数可以降低损失函数。

你可能感兴趣的:(搭建神经网络进行简单的回归预测)