keras框架开发教程学习(Keras深度学习简介教程)
keras框架开发教程学习(Keras深度学习简介教程)当整个训练集已经通过神经网络时达到一个时间点。重复步骤1-5正向传播(从左到右):神经元被激活并获得预测值。将预测结果与实际值进行比较并测量误差。向后传播(从右向左):权重被调整。
在本文中,我们将使用Keras构建一个简单的神经网络。我们假设您有机器学习软件包的先前知识,例如scikit-learn和其他科学软件包,如Pandas和numpy。
训练人工神经网络训练人工神经网络涉及以下步骤:
-
权重随机初始化为接近零但不为零的数字。
-
将数据集的观察值输入到输入图层。
-
正向传播(从左到右):神经元被激活并获得预测值。
-
将预测结果与实际值进行比较并测量误差。
-
向后传播(从右向左):权重被调整。
-
重复步骤1-5
-
当整个训练集已经通过神经网络时达到一个时间点。
现在让我们继续解决一个真正的商业问题。一家保险公司已经向他们提供了他们客户之前索赔的数据集。保险公司希望你开发一个模型来帮助他们预测哪些索赔看起来有欺诈性。通过这样做,你希望每年为公司节省数百万美元。这是一个分类问题。这些是我们数据集中的列。
数据预处理正如许多商业问题一样,所提供的数据将不会为我们处理。因此,我们必须以我们的算法将接受它的方式来进行准备。我们从数据集中看到,我们有一些分类列。我们需要将这些转换为零和一些,以便我们的深度学习模型能够理解它们。另外需要注意的是,我们必须将我们的数据集作为numpy数组提供给模型。下面我们导入必要的软件包,然后加载到我们的数据集中。
import pandas as pd
import numpy as np
df = pd.read_csv(‘Datasets/claims/insurance_claims.csv’)
然后我们将分类列转换为虚拟变量。
feats= [‘policy_state’ ’insured_sex’ ’insured_education_level’ ’insured_occupation’ ’insured_hobbies’ ’insured_relationship’ ’collision_type’ ’incident_severity’ ’authorities_contacted’ ’incident_state’ ’incident_city’ ’incident_location’ ’property_damage’ ’police_report_available’ ’auto_make’ ’auto_model’ ’fraud_reported’ ’incident_type’]
df_final = pd.get_dummies(df columns=feats drop_first=True)
在这种情况下,我们使用drop_first = True。例如,如果你有a,b,c,d作为类别,那么你可以把d作为一个虚拟变量。这是因为如果某件东西不属于a,b或c,那么它肯定在d中。
我们使用sklearn的 train_test_split将数据分成训练集和测试集。
from sklearn.model_selection import train_test_split
接下来,我们确保放弃我们预测的列,以防止它泄漏到训练集和测试集中。我们必须避免使用相同的数据集来训练和测试模型。我们在数据集的末尾设置 .values以获得numpy数组。这是我们的深度学习模式将接受数据的方式。这一步很重要,因为我们的机器学习模型期望以数组形式存在数据。
X = df_final.drop([‘fraud_reported_Y’ ’policy_csl’ ’policy_bind_date’ ’incident_date’] axis=1).values
y = df_final[‘fraud_reported_Y’].values
然后我们将数据分成训练和测试集。我们使用0.7的训练数据和0.3的测试数据。
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.3)
接下来,我们必须使用Sklearn的StandardScaler来缩放我们的数据集。由于大量的计算发生在深度学习中,所以功能缩放是强制性的。特征缩放标准化了我们自变量的范围。
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
建立人工神经网络(ANN)我们需要做的第一件事是导入Keras。默认情况下,Keras将使用TensorFlow作为其后端。
import keras
接下来我们需要从Keras导入几个模块。Sequential模块需要初始化ANN,并且需要Dense模块来构建我们ANN的图层。
from keras.models import Sequential
from keras.layers import Dense
接下来,我们需要通过创建Sequential实例来初始化我们的ANN。Sequential函数初始化一个线性堆栈层。这允许我们稍后使用Dense模块添加更多图层。
classifier = Sequential()
添加输入图层(第一隐藏层)我们使用add方法为ANN添加不同的图层。第一个参数是要添加到此图层的节点数量。对于您应该添加多少个节点没有经验法则。然而,常见的策略是选择节点数作为输入层中节点的平均数和输出层中节点的数量。
比如说你有五个独立变量和一个输出。那么你会拿这个数字的总和除以二,即三。您也可以决定尝试一种称为参数调整的技巧。第二个参数,kernel_initializer, 是将被用于初始化权重的功能。在这种情况下,它将使用均匀分布来确保权重是接近零的小数。下一个参数是激活功能。我们使用整流器功能,缩短为relu。我们主要将这个函数用于ANN中的隐藏层。最后一个参数是input_dim,它是输入层中的节点数。它代表了自变量的数量。
classiifier.add(
Dense(3,kernel_initializer ='uniform',
activation ='relu',input_dim = 5))
添加第二个隐藏层添加第二个隐藏层与添加第一个隐藏层相似。
classiifier.add(
Dense(3,kernel_initializer ='uniform',
activation ='relu'))
我们不需要指定input_dim参数,因为我们已经在第一个隐藏层中指定了它。在我们指定的第一个隐藏层中,为了让图层知道需要多少个输入节点。在第二个隐藏层中,ANN已经知道需要多少个输入节点,所以我们不需要重复自己。
添加输出图层classifier.add(
Dense(1,kernel_initializer ='uniform',
activation ='sigmoid'))
我们改变第一个参数,因为在我们的输出节点中,我们期望一个节点 这是因为我们只想知道索赔是否有欺诈行为。我们更改激活函数是因为我们想要获得索赔是欺诈的概率。我们通过使用Sigmoid激活功能来做到这一点。如果你处理的分类问题有两个以上的类别(即分类猫,狗和猴子),我们需要改变两件事。我们将第一个参数更改为3,并将激活函数更改为softmax。Softmax是一个sigmoid函数,适用于具有两个以上类别的自变量。
编译ANNclassifier.compile(optimizer ='adam',
loss ='binary_crossentropy',
metrics = ['accuracy'])
编译基本上是对整个神经网络应用随机梯度下降。第一个参数是您想要用来获得神经网络中最佳权重集合的算法。这里使用的算法是随机梯度算法。这有很多变种。一个非常有效的使用是亚当。第二个参数是随机梯度算法中的损失函数。由于我们的类别是二元的,我们使用binary_crossentropy损失函数。否则,我们会使用categorical_crossentopy。最后的论点是我们将用来评估我们的模型的标准。在这种情况下,我们使用精度。
将我们的ANN安装到训练集中classifier.fit(X_train,y_train,batch_size = 10,epochs = 100)
X_train表示我们用来训练ANN的独立变量,y_train表示我们预测的列。时期表示我们要通过人工神经网络传递完整数据集的次数。Batch_size是权重将被更新后的观测值的数量。
使用训练集进行预测y_pred = classifier.predict(X_test)
这将向我们显示索赔被欺诈的可能性。然后,我们设置了50%的阈值,将索赔分类为欺诈性索赔。这意味着任何概率为0.5或更高的索赔将被列为欺诈。
y_pred =(y_pred> 0.5)
通过这种方式,保险公司可以首先跟踪不可疑的索赔,然后花费更多时间评估被标记为欺诈的索赔。
检查混淆矩阵from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test y_pred)
混淆矩阵可以解释如下。在2000年的观测中,正确预测了1550 175个观测值,而230 45个观测值被错误预测。您可以通过将正确预测的数量除以预测的总数来计算准确度。在这种情况下(1550 175)/ 2000,这给你86%。
做一个单一的预测假设保险公司给你一个索赔。他们想知道索赔是否有欺诈行为。你会怎么做才能发现?
new_pred = classifier.predict(sc.transform(np.array([[a,b,c,d]])))
其中a,b,c,d代表您拥有的功能。
new_pred =(new_prediction> 0.5)
由于我们的分类器需要numpy数组,因此我们必须将单个观察转换为一个numpy数组,并使用标准缩放器对其进行缩放。
评估我们的ANN训练一次或两次模型后,您会注意到您持续获得不同的准确度。所以你不太确定哪一个是正确的。这引入了偏差方差的权衡。实质上,我们试图训练一个准确的模型,并且在多次训练时不会有太高的准确度差异。为了解决这个问题,我们使用K等于10的K倍交叉验证。这将把训练集分割成10倍。然后,我们将训练我们的模型9倍,并在余下的倍数上进行测试。由于我们有10个折叠,我们将通过10个组合迭代地完成此操作。每次迭代都会为我们提供准确性。然后,我们将找到所有精度的平均值,并将其用作模型精度。我们还计算方差以确保最小化。
Keras有一个scikit学习包装器(KerasClassifier),它使我们能够在我们的keras代码中包含K-fold交叉验证。
from keras.wrappers.scikit_learn import KerasClassifier
接下来我们从scikit_learn导入k-fold交叉验证函数
from sklearn.model_selection import cross_val_score
KerasClassifier期望它的一个参数是一个函数,所以我们需要构建这个函数。这个函数的目的是构建我们ANN的体系结构。
def make_classifier():
classifier = Sequential()
classiifier.add(Dense(3 kernel_initializer = ‘uniform’ activation = ‘relu’ input_dim=5))
classiifier.add(Dense(3 kernel_initializer = ‘uniform’ activation = ‘relu’))
classifier.add(Dense(1 kernel_initializer = ‘uniform’ activation = ‘sigmoid’))
classifier.compile(optimizer= ‘adam’ loss = ‘binary_crossentropy’ metrics = [‘accuracy’])
return classifier
该功能将构建分类器并将其返回以供下一步使用。我们在这里完成的唯一一件事就是将我们以前的ANN架构包装在一个函数中,并返回分类器。
然后我们使用K-fold交叉验证创建一个新的分类器,并将参数build_fn作为我们刚刚创建的函数传递。接下来,我们传递批处理大小和时代数量,就像我们在前一个分类器中所做的那样。
classiifier = KerasClassifier(build_fn = make_classifier,
batch_size = 10,nb_epoch = 100)
要应用k-fold交叉验证函数,我们可以使用scikit-learn的cross_val_score函数。估计器是我们用make_classifier创建的分类器,而n_jobs = -1将利用所有可用的CPU。cv是折叠的数量,10是典型的选择。该cross_val_score将返回在计算中使用的十个测试褶皱的十项精度。
accuracies = cross_val_score(estimator = classifier
X = X_train
y = y_train
cv = 10
n_jobs = -1)
为了获得相对精度,我们得到了精度的平均值。
mean = accuracies.mean()
方差可以如下获得:
variance = accuracies.var()
目标是在精度之间有一个小的差异。
过度拟合机器学习中的过度拟合是当模型在训练集中学习细节和噪声以致它在测试集上表现不佳时发生的。当我们在测试集和训练集的精度之间存在巨大差异时,或者在应用k-fold交叉验证时观察到高差异时,可以观察到这种情况。在人工神经网络中,我们使用称为辍学正则化的技术来抵消这种情况。辍学正规化的作用是在训练的每次迭代中随机禁用一些神经元,以防止它们彼此过度依赖。
from keras.layers import Dropout
classifier = Sequential()
classiifier.add(Dense(3 kernel_initializer = ‘uniform’ activation = ‘relu’ input_dim=5))
# Notice the dropouts
classifier.add(Dropout(rate = 0.1))
classiifier.add(Dense(6 kernel_initializer = ‘uniform’ activation = ‘relu’))
classifier.add(Dropout(rate = 0.1))
classifier.add(Dense(1 kernel_initializer = ‘uniform’ activation = ‘sigmoid’))
classifier.compile(optimizer= ‘adam’ loss = ‘binary_crossentropy’ metrics = [‘accuracy’])
在这种情况下,我们在第一个隐藏层之后和第二个隐藏层之后应用该丢失。使用0.1的比率意味着每次迭代时将有1%的神经元被禁用。建议从0.1开始。但是,你永远不能超过0.4,因为你现在开始不适合。
参数调整一旦获得准确性,您可以调整参数以获得更高的准确度。网格搜索使我们能够测试不同的参数,以获得最佳参数。
这里的第一步是从sklearn 导入GridSearchCV模块。
from sklearn.model_selection import GridSearchCV
我们还需要修改我们的make_classifier函数,如下所示。我们创建一个名为优化器的新变量,它允许我们在params变量中添加多个优化器。
def make_classifier(optimizer):
classifier = Sequential()
classiifier.add(Dense(6 kernel_initializer = ‘uniform’ activation = ‘relu’ input_dim=11))
classiifier.add(Dense(6 kernel_initializer = ‘uniform’ activation = ‘relu’))
classifier.add(Dense(1 kernel_initializer = ‘uniform’ activation = ‘sigmoid’))
classifier.compile(optimizer= optimizer loss = ‘binary_crossentropy’ metrics = [‘accuracy’])
return classifier
我们仍然会使用KerasClassifier,但是我们不会传递批处理大小和数量的时期,因为这些是我们想要调整的参数。
classifier = KerasClassifier(build_fn = make_classifier)
下一步是使用我们想要调整的参数创建一个字典 - 在这种情况下,批量大小,时期数量和优化器函数。我们仍然使用adam作为优化器并添加一个名为rmsprop的新模板。Keras文档在处理复发神经网络时建议使用rmsprop。不过,我们可以尝试一下这个ANN,看看它是否会给我们带来更好的结果。
params = {
'batch_size':[20 35],
'nb_epoch':[150500],
'Optimizer':['adam','rmsprop' ]
}
然后我们使用网格搜索来测试这些参数。网格搜索函数期望我们的估计量,我们刚才定义的参数,评分度量和k倍数。
grid_search = GridSearchCV(estimator = classifier,
param_grid = params,
scoring ='accuracy',
cv = 10)
像以前的对象一样,我们需要适合我们的训练集。
grid_search = grid_search.fit(X_train,y_train)
我们可以使用来自网格搜索对象的best_params获得最佳参数选择。同样,我们使用best_score_获得最佳分数。
best_param = grid_search.best_params_
best_accuracy = grid_search.best_score_
注意这一过程需要一段时间,因为它会搜索最佳参数。
结论人工神经网络只是一种深度神经网络。还有其他网络如递归神经网络(RNN),卷积神经网络(CNN)和玻尔兹曼机。RNN可以预测未来股票的价格是上涨还是下跌。CNN用于计算机视觉 - 识别一组图像中的猫和狗,或识别大脑图像中癌细胞的存在。玻尔兹曼机器用于编程推荐系统。也许我们可以在将来覆盖这些神经网络之一。