教育行业A股IPO第一股(股票代码003032)
全国咨询/投诉热线:400-618-4000
In[1]:
In[2]:
#生成数据集并用plot画出np.random.seed(0)X,y=sklearn.datasets.make_moons(200,noise=0.20)plt.scatter(X[:,0],X[:,1],s=40,c=y,cmap=plt.cm.Spectral)
Out[2]:
这里为了演示,我们使用逻辑回归行分类。输入是数据集里的x,y坐标,输出是预测的类别(0或者1)。为了方便我们直接使用scikit-learn中的逻辑回归。
In[3]:
#训练逻辑回归分类器clf=sklearn.linear_model.LogisticRegressionCV(cv=5)clf.fit(X,y)
Out[3]:
In[4]:
#这是个帮助函数,这个函数的作用是用来画决策边界的,如果看不懂函数内容不用介意。defplot_decision_boundary(pred_func):#设置边界最大最小值x_min,x_max=X[:,0].min()-.5,X[:,0].max()+.5y_min,y_max=X[:,1].min()-.5,X[:,1].max()+.5h=0.01#生成一个点间网格,它们之间的距离为hxx,yy=np.meshgrid(np.arange(x_min,x_max,h),np.arange(y_min,y_max,h))#预测Z=pred_func(np.c_[xx.ravel(),yy.ravel()])Z=Z.reshape(xx.shape)#绘制轮廓和训练示例plt.contourf(xx,yy,Z,cmap=plt.cm.Spectral)plt.scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.Spectral)
In[5]:
plot_decision_boundary(lambdax:clf.predict(x))plt.title("LogisticRegression")
这个图显示了通过逻辑回归学习到的决策边界。这里的直线已经尽可能的把数据集分成两部分,但是分的效果还是不理想,还是有些分错类别的。
现在我们构建一个3层神经网络,其中包含一个输入层,一个隐藏层和一个输出层。输入层中的节点数由我们的数据的维数确定的,这里是2。输出层中的节点数由我们拥有的类别数量决定,这里也是2。因为我们只有两个类实际上只用一个输出节点可以预测0或1,但是有两个可以让网络更容易扩展到更多的类。网络的输入将是x和y坐标,其输出将是两个概率,一个用于类别0,一个用于类别1。神经网络如图所示:
我们可以选择隐藏层的维度也就是节点数。隐藏层的节点越多,得到的神经网络功能就越复杂。但更高的维度需要付出代价。首先,学习网络参数和预测就需要更多的计算量。同时更多参数也意味着我们得到的模型更容易过拟合。如何选择隐藏层的大小?虽然有一些指导方针,但实际上具体问题需要具体分析,稍后我们将改变隐藏层中的节点数量来查看它如何影响我们的输出。
现在我们把具体代码实现来,这里先定义一些后面求梯度会用到的参数:
In[6]:
num_examples=len(X)#训练集大小nn_input_dim=2#输入层维度nn_output_dim=2#输出层维度#梯度下降参数,这两个参数是为设定的超参数epsilon=0.01#梯度下降的学习率reg_lambda=0.01#正则化强度首先我们实现上面定义的损失函数,这里用它来评估我们的模型的好坏:
In[7]:
In[8]:
In[9]:
下面来看看如果我们训练隐藏层大小为3的网络会发生什么。
In[10]:
#隐藏层大小为3model=build_model(3,print_loss=True)#绘制决策边界plot_decision_boundary(lambdax:predict(model,x))plt.title("DecisionBoundaryforhiddenlayersize3")
Lossafteriteration0:0.432387Lossafteriteration1000:0.068947Lossafteriteration2000:0.068901Lossafteriteration3000:0.071218Lossafteriteration4000:0.071253Lossafteriteration5000:0.071278Lossafteriteration6000:0.071293Lossafteriteration7000:0.071303Lossafteriteration8000:0.071308Lossafteriteration9000:0.071312Lossafteriteration10000:0.071314Lossafteriteration11000:0.071315Lossafteriteration12000:0.071315Lossafteriteration13000:0.071316Lossafteriteration14000:0.071316Lossafteriteration15000:0.071316Lossafteriteration16000:0.071316Lossafteriteration17000:0.071316Lossafteriteration18000:0.071316Lossafteriteration19000:0.071316
这看起来很不错。我们的神经网络能够找到一个成功分离两个类别的决策边界。
在上面的示例中,我们设置了隐藏层大小3,接着看看改变隐藏层大小对结果的影响。
In[11]:
我们可以看到,隐藏层在低维度时可以很好地拟合数据的总体趋势,更高的维度容易过拟合。当隐藏层维度过大时,模型尝试着去“记住”数据的形状而不是拟合他们的一般形状。通常情况我们还需要一个单独的测试集来评估我们的模型,隐藏层维度较小的模型在这个测试集上的表现应该更好,因为这个模型更加通用。我们也可以通过更强的正则化来抵消过度拟合,但是选择一个合适的隐藏层大小是一个比较划算的解决方案。