使用Keras构建深度学习模型
神经网络
深度学习是机器学习中一个日益流行的子集。利用神经网络建立深度学习模型。神经网络接收输入信息,然后利用训练过程中调整的权重在隐藏层中进行处理。然后,该模型给出了一个预测。调整权重以找到模式,以便做出更好的预测。用户不需要指定要查找的模式——神经网络自己学习。
Keras是一个用Python编写的用户友好的神经网络库。在本教程中,我将介绍两种使用Keras的深度学习模型:一种用于回归,另一种用于分类。我们将建立一个回归模型来预测员工每小时的工资,我们将建立一个分类模型来预测病人是否患有糖尿病。
注意:我们将使用的数据集相对比较干净,因此我们不会执行任何数据预处理,以便为建模准备数据。您将在将来的项目中使用的数据集可能不是那么干净—例如,它们可能有缺失的值—所以您可能需要使用数据预处理技术来更改数据集以获得更精确的结果。
读取训练数据
对于我们的回归深度学习模型,第一步是读入我们将用作输入的数据。对于此示例,我们使用“hourly wages”数据集(https://github.com/eijaz1/Deep-Learning-in-Keras-Tutorial/blob/master/data/hourly_wages_data.csv)。首先,我们将使用Pandas读入数据。我不会详细介绍Pandas,但是如果你想进一步深入数据科学和机器学习,那么你应该熟悉这个库。
'df'代表dataframe。Pandas将csv文件作为dataframe读入。'head()'函数将显示数据帧的前5行,以便您可以检查数据是否已正确读取,并可以初步了解数据的结构。
Python代码如下: Import pandas as pd #read in data using pandas train_df = pd.read_csv(‘data/hourly_wages_data.csv’) #check data has been read in properly train_df.head()
将数据集拆分为输入和目标
接下来,我们需要将数据集拆分为输入(train_X)和目标(train_y)。我们的输入将是除'wage_per_hour'之外的所有列,因为'wage_per_hour'是我们将尝试预测的内容。因此,'wage_per_hour'将成为我们的目标。
我们将使用pandas'drop'函数从我们的数据帧中删除'wage_per_hour'列并将其存储在变量'train_X'中。Python代码如下:
#create a dataframe with all training data except the target column train_X = train_df.drop(columns=['wage_per_hour']) #check that the target variable has been removed train_X.head()
我们将列'wage_per_hour'插入到我们的目标变量(train_y)中。
#create a dataframe with only the target column train_y = train_df[['wage_per_hour']] #view dataframe train_y.head()
建立深度学习模型
接下来,我们必须构建机器学习模型。这是Python代码:
from keras.models import Sequential from keras.layers import Dense #create model model = Sequential() #get number of columns in training data n_cols = train_X.shape[1] #add model layers model.add(Dense(10, activation='relu', input_shape=(n_cols,))) model.add(Dense(10, activation='relu')) model.add(Dense(1))
我们将使用的模型类型是Sequential。Sequential是在Keras中构建模型的最简单方法。它允许您逐层构建模型。每个层都具有与其后面的层对应的权重。
我们使用'add()'函数将层添加到模型中。我们将添加两个层和一个输出层。
'Dense'是层类型。Dense是一种适用于大多数情况的标准层类型。在Dense层中,上一层中的所有节点都连接到当前层中的节点。
我们的每个输入层都有10个节点。这个数字也可以是数百或数千。增加每层中的节点数会增加模型容量。
'activation'是层的激活函数。激活函数允许模型考虑非线性关系。例如,如果您预测患者的糖尿病,从10岁到11岁不等于60-61岁。
我们将使用的激活函数是ReLU。虽然它是两个线性部分,但它已被证明在神经网络中运行良好。
ReLU激活函数
第一层需要输入shape。输入shape指定输入中的行数和列数。输入中的列数存储在“n_cols”中。逗号后面没有任何内容表示可以有任意数量的行。
最后一层是输出层。它只有一个节点,用于我们的预测。
编译深度学习模型
接下来,我们需要编译我们的模型。编译模型需要两个参数:优化器和损失。
优化器控制学习速率。我们将使用'adam'作为我们的优化器。在许多情况下,Adam通常是一个很好的优化器。adam优化器会在整个训练过程中调整学习率。
学习率决定了计算机器学习模型的最佳权重的速度。较小的学习率可能会导致更准确的权重(达到某一点),但计算权重所需的时间会更长。
对于我们的损失函数,我们将使用'mean_squared_error'。它是通过取预测值和实际值之间的均方误差来计算的。它是回归问题的流行损失函数。这越接近0,模型执行得越好。
均方误差
Python代码如下:
#compile model using mse as a measure of model performance model.compile(optimizer='adam', loss='mean_squared_error')
训练机器学习模型
现在我们将训练我们的模型。为了训练,我们将在我们的模型上使用'fit()'函数,具有以下五个参数:训练数据(train_X),目标数据(train_y),validation split,epochs数和callbacks。
validation split将随机拆分数据以用于训练和测试。在训练期间,我们将能够看到验证损失,它给出了验证集上模型的均方误差。我们将验证分割设置为0.2,这意味着我们在模型中提供的20%的训练数据将被留出来用于测试模型性能。
epochs数是模型循环数据的次数。我们运行的epochs越多,模型就会越能改进性能,直到某一点。在那之后,模型将在每个epoch停止改进。此外,epochs越多,模型运行的时间就越长。为了监控这一点,我们将使用“early stopping”。
如果模型停止改进,early stopping将在达到时期数之前停止模型训练。我们将early stopping设置为3.这意味着在连续3个epochs模型没有改进之后,训练将停止。有时,验证损失可能会停止改善,然后在下一个epoch得到改善,但在验证损失没有改善的3个时期之后,它通常不会再次改善。
from keras.callbacks import EarlyStopping #set early stopping monitor so the model stops training when it won't improve anymore early_stopping_monitor = EarlyStopping(patience=3) #train model model.fit(train_X, train_y, validation_split=0.2, epochs=30, callbacks=[early_stopping_monitor])
对新数据进行预测
如果您想使用此模型对新数据进行预测,我们将使用'predict()'函数,传入新数据。输出将是'wage_per_hour'预测。
#example on how to use our newly trained model on how to make predictions on unseen data (we will pretend our new data is saved in a dataframe called 'test_X'). test_y_predictions = model.predict(test_X)
你已经在Keras建立了一个深度学习模型!它还不是很准确,但可以通过使用更多的训练数据和“模型容量”来改善。
模型容量
随着模型中节点和层数的增加,模型容量也会增加。增加模型容量可以产生更准确的模型,直到某个点,模型将停止改进。通常,您提供的训练数据越多,模型应该越大。我们只使用少量数据,因此我们的模型非常小。模型越大,它需要的计算能力越多,训练需要更长的时间。
让我们使用与之前模型相同的训练数据创建一个新模型。这次,我们将添加一个层并将每个层中的节点增加到200.我们将训练模型以查看增加模型容量是否会提高我们的验证分数。
#training a new model on the same data to show the effect of increasing model capacity #create model model_mc = Sequential() #add model layers model_mc.add(Dense(200, activation='relu', input_shape=(n_cols,))) model_mc.add(Dense(200, activation='relu')) model_mc.add(Dense(200, activation='relu')) model_mc.add(Dense(1)) #compile model using mse as a measure of model performance model_mc.compile(optimizer='adam', loss='mean_squared_error') #train model model_mc.fit(train_X, train_y, validation_split=0.2, epochs=30, callbacks=[early_stopping_monitor])
我们可以看到,通过提高模型容量,我们将validation loss从旧模型中的32.63提高到新模型中的28.06。
分类模型
现在让我们继续构建我们的分类模型。由于许多步骤将是以前模型的重复,我将只讨论新概念。
对于下一个模型,我们将预测患者是否患有糖尿病(https://github.com/eijaz1/Deep-Learning-in-Keras-Tutorial/blob/master/data/diabetes_data.csv)。
#read in training data train_df_2 = pd.read_csv('documents/data/diabetes_data.csv') #view data structure train_df_2.head()
#create a dataframe with all training data except the target column train_X_2 = df_2.drop(columns=['diabetes']) #check that the target variable has been removed train_X_2.head()
在分离目标列时,我们需要调用' to_categorical() '函数,以便该列将被' one-hot编码'。目前,在糖尿病列中,没有糖尿病的患者用0表示,而糖尿病患者用1表示。使用one-hot编码,将删除整数,并为每个类别输入一个二进制变量。在我们的案例中,我们有两类:没有糖尿病和糖尿病。无糖尿病患者用[1 0]代表,糖尿病患者用[0 1]代表。
from keras.utils import to_categorical #one-hot encode target column train_y_2 = to_categorical(df_2.diabetes) #vcheck that target column has been converted train_y_2[0:5]
#create model model_2 = Sequential() #get number of columns in training data n_cols_2 = train_X_2.shape[1] #add layers to model model_2.add(Dense(250, activation='relu', input_shape=(n_cols_2,))) model_2.add(Dense(250, activation='relu')) model_2.add(Dense(250, activation='relu')) model_2.add(Dense(2, activation='softmax'))
我们模型的最后一层有2个节点 - 每个选项一个:患者患有糖尿病,或者他们没有。
激活是'softmax'。Softmax使输出总和达到1,因此输出可以解释为概率。然后,模型将基于哪个选项具有更高概率来进行预测。
#compile model using accuracy to measure model performance model_2.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
我们将使用'categorical_crossentropy'来表示我们的损失函数。这是分类的最常见选择。分数越低表示模型表现越好。
为了使事情更容易理解,我们将使用“准确度”指标来查看每个时代结束时验证集的准确度分数。
#train model model_2.fit(X_2, target, epochs=30, validation_split=0.2, callbacks=[early_stopping_monitor])
您现在正在努力在Keras建立令人惊叹的深度学习模型!