Python深度学习实现 Python深度学习库和框架 在这种深度学习的实施中,我们的目标是预测某家银行的客户流失率或激增数据 - 哪些客户可能会离开此银行服务。使用的数据集相对较小,包含10000行,14列。我们使用的是Anaconda发行版,以及Theano,TensorFlow和Keras等框架。Keras建立在Tensorflow和Theano之上,作为其后端。 # Artificial Neural Network # Installing Theano pip install --upgrade theano # Installing Tensorflow pip install –upgrade tensorflow # Installing Keras pip install --upgrade keras 第1步:数据预处理 In[]: # Importing the libraries import numpy as np import matplotlib.pyplot as plt import pandas as pd # Importing the database dataset = pd.read_csv('Churn_Modelling.csv') 第2步 我们创建了数据集和目标变量的特征矩阵,这是列14,标记为“已退出”。 数据的初始外观如下所示 - In[]: X = dataset.iloc[:, 3:13].values Y = dataset.iloc[:, 13].values X 输出 第3步 Y 输出 array([1, 0, 1, ..., 1, 1, 0], dtype = int64) 步骤4 我们通过编码字符串变量来简化分析。我们使用ScikitLearn函数'LabelEncoder'来自动编码0到n_classes-1之间值的列中的不同标签。 from sklearn.preprocessing import LabelEncoder, OneHotEncoder labelencoder_X_1 = LabelEncoder() X[:,1] = labelencoder_X_1.fit_transform(X[:,1]) labelencoder_X_2 = LabelEncoder() X[:, 2] = labelencoder_X_2.fit_transform(X[:, 2]) X 输出 在上面的输出中,国家名称被替换为0,1和2; 而男性和女性则被0和1所取代。 第5步 标记编码数据 我们使用相同的 ScikitLearn 库和另一个称为 OneHotEncoder的 函数来传递创建虚拟变量的列号。 onehotencoder = OneHotEncoder(categorical features = [1]) X = onehotencoder.fit_transform(X).toarray() X = X[:, 1:] X 现在,前2列代表国家,第4列代表性别。 输出 我们总是将数据分成培训和测试部分; 我们在训练数据上训练我们的模型,然后检查测试数据模型的准确性,这有助于评估模型的效率。 第6步 我们使用ScikitLearn的 train_test_split 函数将数据分割为训练集和测试集。我们将列车 - 测试分流比保持为80:20。 #Splitting the dataset into the Training set and the Test Set from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2) 一些变量的值为数千,而有些变量的值为数十或一。我们调整数据以便它们更具代表性。 第7步 在此代码中,我们使用 StandardScaler 函数拟合和转换训练数据。我们将我们的缩放标准化,以便我们使用相同的拟合方法来转换/缩放测试数据。 # Feature Scaling fromsklearn.preprocessing import StandardScaler sc = StandardScaler() X_train = sc.fit_transform(X_train) X_test = sc.transform(X_test) 输出 现在数据正确缩放。最后,我们完成了我们的数据预处理。现在,我们将从我们的模型开始。 第8步 我们在这里导入所需的模块。我们需要Sequential模块来初始化神经网络和密集模块来添加隐藏层。 # Importing the Keras libraries and packages import keras from keras.models import Sequential from keras.layers import Dense 第9步 我们将该模型命名为分类器,因为我们的目标是对客户流失进行分类。然后我们使用Sequential模块进行初始化。 #Initializing Neural Network classifier = Sequential() 第10步 我们使用密集函数逐个添加隐藏层。在下面的代码中,我们会看到很多参数。 我们的第一个参数是 output_dim 。这是我们添加到此图层的节点数量。 init 是随机梯度下降的初始化。在神经网络中,我们为每个节点分配权重。在初始化时,权重应该接近零,并且我们使用统一函数随机地初始化权重。该 input_dim 只需要为第一层参数,因为该模型并不知道我们的输入变量的数目。这里输入变量的总数是11.在第二层,模型自动知道来自第一隐藏层的输入变量的数量。 执行下面的代码行来添加输入图层和第一个隐藏层 - classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu', input_dim = 11)) 执行下面的代码行来添加第二个隐藏层 - classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu')) 执行下面的代码行来添加输出图层 - classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid')) 第11步 编译ANN 到目前为止,我们已经为分类器添加了多个图层。我们现在将使用 编译 方法编译它们。在最终编译控制中添加的参数完成了神经网络。因此,在这一步我们需要小心。 这里是对论点的简要解释。 第一个参数是 Optimizer 。这是一种用于查找最佳权重集合的算法。这种算法被称为 随机梯度下降(SGD) 。这里我们使用几种类型中的一种,称为'Adam优化器'。新元取决于损失,所以我们的第二个参数是损失。如果我们的因变量是二元的,我们使用称为 'binary_crossentropy'的 对数损失函数,并且如果我们的因变量在输出中有两个以上的类别,那么我们使用 'categorical_crossentropy' 。我们希望基于 精度 提高神经网络的性能,所以我们将 度量 添加为精度。 # Compiling Neural Network classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy']) 第12步 在这一步中需要执行许多代码。 将ANN连接到训练集 我们现在训练我们的训练数据模型。我们使用 拟合 方法来拟合我们的模型。我们还优化权重以提高模型效率。为此,我们必须更新权重。 批量大小 是我们更新权重后的观察次数。 Epoch 是迭代的总数。批量大小和历元的值通过试错法选择。 classifier.fit(X_train, y_train, batch_size = 10, epochs = 50) 进行预测并评估模型 # Predicting the Test set results y_pred = classifier.predict(X_test) y_pred = (y_pred > 0.5) 预测一个新的观察 # Predicting a single new observation """Our goal is to predict if the customer with the following data will leave the bank: Geography: Spain Credit Score: 500 Gender: Female Age: 40 Tenure: 3 Balance: 50000 Number of Products: 2 Has Credit Card: Yes Is Active Member: Yes 步骤13 预测测试集结果 预测结果将为您提供客户离开公司的可能性。我们会将该概率转换为二进制0和1。 # Predicting the Test set results y_pred = classifier.predict(X_test) y_pred = (y_pred > 0.5) new_prediction = classifier.predict(sc.transform (np.array([[0.0, 0, 500, 1, 40, 3, 50000, 2, 1, 1, 40000]]))) new_prediction = (new_prediction > 0.5) 第14步 这是我们评估模型性能的最后一步。我们已经有了原始结果,因此我们可以构建混淆矩阵来检查模型的准确性。 制作混乱矩阵 from sklearn.metrics import confusion_matrix cm = confusion_matrix(y_test, y_pred) print (cm) 输出 loss: 0.3384 acc: 0.8605 [ [1541 54] [230 175] ] 从混淆矩阵中,我们模型的准确度可以计算为 - Accuracy = 1541+175/2000=0.858 我们达到了85.8%的准确度 ,这很好。 前向传播算法 在本节中,我们将学习如何编写代码来完成简单神经网络的前向传播(预测) 每个数据点都是一个客户。第一个输入是他们有多少个帐户,第二个输入是他们有多少个孩子。该模型将预测用户在明年进行的交易次数。 输入数据作为输入数据预加载,并且权重位于称为权重的字典中。隐藏层中第一个节点的权重阵列的权重为['node_0'],隐藏层中的第二个节点分别为权重['node_1']。 馈入输出节点的权重可用权重。 整流线性激活函数 “激活功能”是一个在每个节点上工作的功能。它将节点的输入转换为一些输出。 整流线性激活功能(称为 ReLU )广泛用于高性能网络。该函数将单个数字作为输入,如果输入为负数则返回0,如果输入为正数则返回输出。 这里有一些例子 - relu(4)= 4 relu(-2)= 0 我们填写relu()函数的定义 - 我们使用max()函数来计算relu()的输出值。 我们将relu()函数应用于node_0_input以计算node_0_output。 我们将relu()函数应用于node_1_input以计算node_1_output。 import numpy as np input_data = np.array([-1, 2]) weights = { 'node_0': np.array([3, 3]), 'node_1': np.array([1, 5]), 'output': np.array([2, -1]) } node_0_input = (input_data * weights['node_0']).sum() node_0_output = np.tanh(node_0_input) node_1_input = (input_data * weights['node_1']).sum() node_1_output = np.tanh(node_1_input) hidden_layer_output = np.array(node_0_output, node_1_output) output =(hidden_layer_output * weights['output']).sum() print(output) def relu(input): '''Define your relu activation function here''' # Calculate the value for the output of the relu function: output output = max(input,0) # Return the value just calculated return(output) # Calculate node 0 value: node_0_output node_0_input = (input_data * weights['node_0']).sum() node_0_output = relu(node_0_input) # Calculate node 1 value: node_1_output node_1_input = (input_data * weights['node_1']).sum() node_1_output = relu(node_1_input) # Put node values into array: hidden_layer_outputs hidden_layer_outputs = np.array([node_0_output, node_1_output]) # Calculate model output (do not apply relu) odel_output = (hidden_layer_outputs * weights['output']).sum() print(model_output)# Print model output 输出 0.9950547536867305 -3 将网络应用于许多观察/数据行 在本节中,我们将学习如何定义一个名为predict_with_network()的函数。该函数将生成多个数据观测值的预测值,这些值来自上面的网络作为input_data。上述网络中给出的权重正在被使用。relu()函数定义也被使用。 让我们定义一个名为predict_with_network()的函数,它接受两个参数 - input_data_row和weights - 并从网络返回一个预测作为输出。 我们计算每个节点的输入和输出值,将它们存储为:node_0_input,node_0_output,node_1_input和node_1_output。 为了计算节点的输入值,我们将相关数组相乘并计算它们的总和。 要计算节点的输出值,我们将relu()函数应用于节点的输入值。我们使用'for循环'迭代input_data - 我们还使用我们的predict_with_network()来为input_data - input_data_row的每一行生成预测。我们还附加每个预测结果。 # Define predict_with_network() def predict_with_network(input_data_row, weights): # Calculate node 0 value node_0_input = (input_data_row * weights['node_0']).sum() node_0_output = relu(node_0_input) # Calculate node 1 value node_1_input = (input_data_row * weights['node_1']).sum() node_1_output = relu(node_1_input) # Put node values into array: hidden_layer_outputs hidden_layer_outputs = np.array([node_0_output, node_1_output]) # Calculate model output input_to_final_layer = (hidden_layer_outputs*weights['output']).sum() model_output = relu(input_to_final_layer) # Return model output return(model_output) # Create empty list to store prediction results results = [] for input_data_row in input_data: # Append prediction to results results.append(predict_with_network(input_data_row, weights)) print(results)# Print results 输出 [0, 12] 深层多层神经网络 在这里,我们正在编写代码来为具有两个隐藏层的神经网络进行前向传播。每个隐藏层都有两个节点。输入数据已被预加载为 input_data 。第一个隐藏层中的节点称为node_0_0和node_0_1。 它们的权重分别预加载为权重['node_0_0']和权重['node_0_1']。 第二个隐藏层中的节点称为 node_1_0和node_1_1 。它们的权重分别预加载为 权重['node_1_0'] 和 权重['node_1_1'] 。 然后,我们使用作为 权 重预加载的 权重['output'] 从隐藏节点创建模型输出。 我们使用它的权重weight ['node_0_0']和给定的input_data来计算node_0_0_input。然后应用relu()函数来获取node_0_0_output。 我们对node_0_1_input执行上述操作以获取node_0_1_output。 我们使用它的权重['node_10']和第一个隐藏层的输出 - hidden0_outputs来计算node_1_0_input。然后我们应用relu()函数来获取node_1_0_output。 我们对node_1_1_input执行上述操作以获取node_1_1_output。 我们使用权重['输出']和来自第二隐藏层hidden_1_outputs数组的输出来计算model_output。我们不会将relu()函数应用于此输出。 import numpy as np input_data = np.array([3, 5]) weights = { 'node_0_0': np.array([2, 4]), 'node_0_1': np.array([4, -5]), 'node_1_0': np.array([-1, 1]), 'node_1_1': np.array([2, 2]), 'output': np.array([2, 7]) } def predict_with_network(input_data): # Calculate node 0 in the first hidden layer node_0_0_input = (input_data * weights['node_0_0']).sum() node_0_0_output = relu(node_0_0_input) # Calculate node 1 in the first hidden layer node_0_1_input = (input_data*weights['node_0_1']).sum() node_0_1_output = relu(node_0_1_input) # Put node values into array: hidden_0_outputs hidden_0_outputs = np.array([node_0_0_output, node_0_1_output]) # Calculate node 0 in the second hidden layer node_1_0_input = (hidden_0_outputs*weights['node_1_0']).sum() node_1_0_output = relu(node_1_0_input) # Calculate node 1 in the second hidden layer node_1_1_input = (hidden_0_outputs*weights['node_1_1']).sum() node_1_1_output = relu(node_1_1_input) # Put node values into array: hidden_1_outputs hidden_1_outputs = np.array([node_1_0_output, node_1_1_output]) # Calculate model output: model_output model_output = (hidden_1_outputs*weights['output']).sum() # Return model_output return(model_output) output = predict_with_network(input_data) print(output) 输出 364 Python深度学习库和框架