当前位置: 首页 > 知识库问答 >
问题:

神经网络欠拟合-乳腺癌数据集

廖弘伟
2023-03-14

我正在尝试创建一个用于乳腺癌数据集二元分类的神经网络:

https://www.kaggle.com/uciml/breast-cancer-wisconsin-data

我的神经网络由3层组成(不包括输入层):

第一层:具有tanh激活的6个神经元。

第二层:6个激活tanh的神经元。

最后一层:1个乙状结肠激活的神经元。

不幸的是,我在训练示例中的准确率只有44%左右,在测试示例中的准确率只有23%左右。

这是我的python代码:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_csv("data.csv")
data = data.drop(['id'], axis = 1)
data = data.drop(data.columns[31], axis = 1)
data = data.replace({'M': 1, 'B': 0})

X = data
X = X.drop(['diagnosis'], axis = 1)
X = np.array(X)

X_mean = np.mean(X, axis = 1, keepdims = True)
X_std = np.std(X, axis = 1, keepdims = True)
X_n = (X - X_mean) / X_std
y = np.array(data['diagnosis'])
y = y.reshape(569, 1)
m = 378
y_train = y[:m, :]
y_test = y[m:, :]

X_train = X_n[:m, :]
X_test = X_n[m:, :]

def sigmoid(z):
  return 1 / (1 + np.exp(-z))

def dsigmoid(z):
  return np.multiply(z, (1 - z))

def tanh(z):
  return (np.exp(z) - np.exp(-z)) / (np.exp(z) + np.exp(-z))

def dtanh(z):
  return 1 - np.square(tanh(z))

def cost(A, Y):
  m = Y.shape[0]
  return -(1.0/m) *np.sum( np.dot(Y.T, np.log(A)) + np.dot((1 - Y).T, np.log(1-A)))

def train(X, y ,model, epocs, a):
  W1 = model['W1']
  W2 = model['W2']
  W3 = model['W3']

  b1 = model['b1']
  b2 = model['b2']
  b3 = model['b3']

  costs = []

  for i in range(epocs):

    #forward propagation

    z1 = np.dot(X, W1) + b1
    a1 = tanh(z1)

    z2 = np.dot(a1, W2) + b2
    a2 = tanh(z2)

    z3 = np.dot(a2, W3) + b3
    a3 = sigmoid(z3)

    costs.append(cost(a3, y))

    #back propagation

    dz3 = z3 - y
    d3 = np.multiply(dz3, dsigmoid(z3))
    dW3 = np.dot(a2.T, d3)
    db3 = np.sum(d3, axis = 0, keepdims=True)

    d2 = np.multiply(np.dot(d3, W3.T),  dtanh(z2))
    dW2 = np.dot(a1.T, d2)
    db2 = np.sum(d2, axis = 0, keepdims=True)

    d1 = np.multiply(np.dot(d2, W2.T), dtanh(z1))
    dW1 = np.dot(X.T, d1)
    db1 = np.sum(d1, axis = 0, keepdims=True)

    W1 -= (a / m) * dW1
    W2 -= (a / m) * dW2
    W3 -= (a / m) * dW3

    b1 -= (a / m) * db1
    b2 -= (a / m) * db2
    b3 -= (a / m) * db3

  cache = {'W1': W1, 'W2': W2, 'W3': W3, 'b1': b1, 'b2': b2, 'b3': b3}
  return cache, costs

np.random.seed(0)

model = {'W1': np.random.rand(30, 6) * 0.01, 'W2': np.random.rand(6, 6) * 0.01, 'W3': np.random.rand(6, 1) * 0.01, 'b1': np.random.rand(1, 6), 'b2': np.random.rand(1, 6), 'b3': np.random.rand(1, 1)}

model, costss = train(X_train, y_train, model, 1000, 0.1)

plt.plot([i for i in range(1000)], costss)
print(costss[999])
plt.show()



def predict(X,y ,model):
  W1 = model['W1']
  W2 = model['W2']
  W3 = model['W3']

  b1 = model['b1']
  b2 = model['b2']
  b3 = model['b3']

  z1 = np.dot(X, W1) + b1
  a1 = tanh(z1)

  z2 = np.dot(a1, W2) + b2
  a2 = tanh(z2)

  z3 = np.dot(a2, W3) + b3
  a3 = sigmoid(z3)

  m = a3.shape[0]
  y_predict = np.zeros((m, 1))

  for i in range(m):
    y_predict = 1 if a3[i, 0] > 0.5 else 0
  return y_predict

感谢您的帮助:)

共有1个答案

慕高阳
2023-03-14

我认为您的反向传播有问题(我做了一个快速测试,并在Tensorflow上尝试了您的模型,它在火车和测试数据上都达到了92%左右的准确性)。

我对您的代码进行了以下修改:

dz3=a3-y

d3=np。乘法(dz3,dsigomoid(a3))

此外,您的函数预测只返回一个数字,而它应该返回与示例一样多的数字,因此而不是

<代码>y\u预测=np。范围(m)内i的零((m,1)):如果a3[i,0],则y\u predict=1

我把这部分改成了

<代码>y\U预测[a3[:,0]

我进行了2000个历次的培训,并将学习率提高到1(a=1)

 类似资料:
  • 神经网络 (Neural Network) 是机器学习的一个分支,全称人工神经网络(Artificial Neural Network,缩写 ANN),是一种模仿生物神经网络的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。 Perceptron (感知器) 一个典型的神经网络由输入层、一个或多个隐藏层以及输出层组成,其中箭头代表着数据流动的方向,而圆圈代表激活函数(最常用的激活函数为

  • 译者:bat67 最新版会在译者仓库首先同步。 可以使用torch.nn包来构建神经网络. 我们以及介绍了autograd,nn包依赖于autograd包来定义模型并对它们求导。一个nn.Module包含各个层和一个forward(input)方法,该方法返回output。 例如,下面这个神经网络可以对数字进行分类: 这是一个简单的前馈神经网络(feed-forward network)。它接受一

  • 我玩神经网络。我了解卷积层、完全连接层和许多其他东西是如何工作的。我还知道什么是梯度,以及如何训练这样的网络。 框架千层面包含一个称为InverseLayer的层。 InverseLayer类通过应用要反转的层相对于其输入的偏导数,对神经网络的单层执行反转操作。 我不知道这是什么意思,或者我应该在什么时候使用这个层。或者倒置偏导数背后的想法是什么? 非常感谢你

  • 本文向大家介绍使用 pytorch 创建神经网络拟合sin函数的实现,包括了使用 pytorch 创建神经网络拟合sin函数的实现的使用技巧和注意事项,需要的朋友参考一下 我们知道深度神经网络的本质是输入端数据和输出端数据的一种高维非线性拟合,如何更好的理解它,下面尝试拟合一个正弦函数,本文可以通过简单设置节点数,实现任意隐藏层数的拟合。 基于pytorch的深度神经网络实战,无论任务多么复杂,都

  • 我用newff在Matlab中创建了一个用于手写数字识别的神经网络。 我只是训练它只识别0 输入层有9个神经元,隐层有5个神经元,输出层有1个神经元,共有9个输入。 我的赔率是0.1 我在Matlab中进行了测试,网络运行良好。现在我想用c语言创建这个网络,我编写了代码并复制了所有的权重和偏差(总共146个权重)。但当我将相同的输入数据输入到网络时,输出值不正确。 你们谁能给我指点路吗? 这是我的

  • PyTorch包含创建和实现神经网络的特殊功能。在本章中,我们将创建一个简单的神经网络,实现一个隐藏层开发单个输出单元。 我们将使用以下步骤使用PyTorch实现第一个神经网络 - 第1步 首先,需要使用以下命令导入PyTorch库 - 第2步 定义所有图层和批量大小以开始执行神经网络,如下所示 - 第3步 由于神经网络包含输入数据的组合以获得相应的输出数据,使用以下给出的相同程序 - 第4步 借