【翻译自 :  Develop a Neural Network for Woods Mammography Dataset】

【说明:Jason Brownlee PhD大神的文章个人很喜欢,所以闲暇时间里会做一点翻译和学习实践的工作,这里是相应工作的实践记录,希望能帮到有需要的人!】

为新数据集开发神经网络预测模型可能具有挑战性。一种方法是首先检查数据集并为可能使用的模型开发思路,然后探索数据集上简单模型的学习动态,然后最后使用健壮的测试工具为数据集开发和调整模型。此过程可用于为分类和回归预测建模问题开发有效的神经网络模型。

在本教程中,您将发现如何为Wood的X线钼靶分类数据集开发多层Perceptron神经网络模型。完成本教程后,您将知道:

如何加载和汇总Wood的乳腺X线摄影数据集,以及如何使用结果来建议要使用的数据准备和模型配置。
如何探索数据集上简单MLP模型的学习动态。
如何开发出对模型性能的可靠估计,调整模型性能以及对新数据进行预测。

教程概述

本教程分为4个部分。他们是:

伍兹乳腺摄影数据集
神经网络学习动力学
稳健的模型评估
最终模型和做出预测

伍兹乳腺摄影数据集

第一步是定义和探索数据集。我们将使用“乳房X线照相术”标准二进制分类数据集,有时也称为“ Woods X乳房X线照相术”。该数据集归功于Kevin Woods等人。和1993年的论文标题为“在乳房X线照相术中检测微钙化的模式识别技术的比较评估”。问题的重点在于通过放射线扫描检测乳腺癌,特别是在乳房X光照片上看起来很亮的微钙化簇的存在。有两类,目标是使用给定分割对象的特征来区分微钙化和非微钙化。

  • 非微钙化:阴性或多数。
  • 微钙化:阳性病例或少数类。

乳房X射线照片数据集是一种广泛使用的标准机器学习数据集,用于探索和演示许多专为不平衡分类而设计的技术。注意:明确地说,我们不是在“解决乳腺癌”。我们正在探索标准分类数据集。

以下是数据集的前5行的示例

0.23001961,5.0725783,-0.27606055,0.83244412,-0.37786573,0.4803223,'-1'
0.15549112,-0.16939038,0.67065219,-0.85955255,-0.37786573,-0.94572324,'-1'
-0.78441482,-0.44365372,5.6747053,-0.85955255,-0.37786573,-0.94572324,'-1'
0.54608818,0.13141457,-0.45638679,-0.85955255,-0.37786573,-0.94572324,'-1'
-0.10298725,-0.3949941,-0.14081588,0.97970269,-0.37786573,1.0135658,'-1'

您可以在此处了解有关数据集的更多信息:

乳腺X射线摄影数据集(mammography.csv)
乳腺X射线摄影详细信息(mammography.names)
         我们可以直接从URL将数据集作为pandas DataFrame加载; 例如:

# load the mammography dataset and summarize the shape
from pandas import read_csv
# define the location of the dataset
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/mammography.csv'
# load the dataset
df = read_csv(url, header=None)
# summarize shape
print(df.shape)

运行示例将直接从URL加载数据集并报告数据集的形状。在这种情况下,我们可以确认该数据集具有7个变量(6个输入和一个输出),并且该数据集具有11183行数据。

这是神经网络的适度大小的数据集,并建议使用小型网络是合适的。这也表明,使用k折交叉验证是一个好主意,因为与训练/测试拆分相比,它可以提供更可靠的模型性能估算,并且因为单个模型的拟合时间为数秒而不是数小时或数天。 最大的数据集。

(11183, 7)

接下来,我们可以通过查看摘要统计信息和数据图来了解有关数据集的更多信息。

# show summary statistics and plots of the mammography dataset
from pandas import read_csv
from matplotlib import pyplot
# define the location of the dataset
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/mammography.csv'
# load the dataset
df = read_csv(url, header=None)
# show summary statistics
print(df.describe())
# plot histograms
df.hist()
pyplot.show()

运行示例之前,先加载数据,然后输出每个变量的摘要统计信息。

我们可以看到,这些值通常很小,均值接近零。

                  0             1  ...             4             5
count  1.118300e+04  1.118300e+04  ...  1.118300e+04  1.118300e+04
mean   1.096535e-10  1.297595e-09  ... -1.120680e-09  1.459483e-09
std    1.000000e+00  1.000000e+00  ...  1.000000e+00  1.000000e+00
min   -7.844148e-01 -4.701953e-01  ... -3.778657e-01 -9.457232e-01
25%   -7.844148e-01 -4.701953e-01  ... -3.778657e-01 -9.457232e-01
50%   -1.085769e-01 -3.949941e-01  ... -3.778657e-01 -9.457232e-01
75%    3.139489e-01 -7.649473e-02  ... -3.778657e-01  1.016613e+00
max    3.150844e+01  5.085849e+00  ...  2.361712e+01  1.949027e+00

然后为每个变量创建一个直方图。我们可以看到,大多数变量可能具有指数分布,变量5(最后一个输入变量)可能是具有离群值/缺失值的高斯变量。我们可以在每个变量上使用幂变换来降低概率分布的偏斜,这可能会改善模型性能,这可能会带来一些好处。

了解数据集实际的不平衡程度可能会有所帮助。我们可以使用Counter对象对每个类中的示例数进行计数,然后使用这些计数来汇总分布。

下面列出了完整的示例。

# summarize the class ratio of the mammography dataset
from pandas import read_csv
from collections import Counter
# define the location of the dataset
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/mammography.csv'
# load the csv file as a data frame
dataframe = read_csv(url, header=None)
# summarize the class distribution
target = dataframe.values[:,-1]
counter = Counter(target)
for k,v in counter.items():per = v / len(target) * 100print('Class=%s, Count=%d, Percentage=%.3f%%' % (k, v, per))

通过运行示例总结了类别分布,确认了严重类别的失衡,多数类别(无癌症)的比例约为98%,少数类别(癌症)的比例约为2%。

Class='-1', Count=10923, Percentage=97.675%
Class='1', Count=260, Percentage=2.325%

这是有帮助的,因为如果我们使用分类精度,那么任何精度低于约97.7%的模型都不会具有该数据集的技能。

现在我们已经熟悉了数据集,让我们探讨如何开发神经网络模型。

神经网络学习动力学

我们将使用TensorFlow为数据集开发一个多层感知器(MLP)模型。我们不知道学习超参数的哪种模型架构对该数据集将是好的还是最好的,所以我们必须进行实验并发现什么是行之有效的。

假设数据集很小,则小批量可能是个好主意,例如16或32行。入门时,使用Adam版本的随机梯度下降法是个好主意,因为它会自动适应学习率,并且在大多数数据集上都能很好地工作。在我们认真评估模型之前,最好回顾一下学习动态并调整模型体系结构和学习配置,直到我们拥有稳定的学习动态,然后再充分利用模型。我们可以通过使用简单的训练/测试数据拆分并查看学习曲线图来做到这一点。这将帮助我们了解我们是学习过度还是学习不足;然后我们可以相应地调整配置。首先,我们必须确保所有输入变量都是浮点值,并将目标标签编码为整数值0和1。

# ensure all data are floating point values
X = X.astype('float32')
# encode strings to integer
y = LabelEncoder().fit_transform(y)

接下来,我们可以将数据集分为输入和输出变量,然后分为67/33训练和测试集。

我们必须确保按类别对拆分进行分层,以确保训练集和测试集具有与主数据集相同的类别标签分布。

# split into input and output columns
X, y = df.values[:, :-1], df.values[:, -1]
# split into train and test datasets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, stratify=y, random_state=1)

我们可以定义一个最小的MLP模型。在这种情况下,我们将使用一个包含50个节点的隐藏层和一个输出层(任意选择)。 我们将在隐藏层中使用ReLU激活功能和“ he_normal”权重初始化,因为它们在一起是一种很好的做法。该模型的输出是用于二进制分类的S型激活,我们将使二进制交叉熵损失最小化。

# define model
model = Sequential()
model.add(Dense(50, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(Dense(1, activation='sigmoid'))
# compile the model
model.compile(optimizer='adam', loss='binary_crossentropy')

由于模型大小适中,我们将使模型适合于300个训练时期(任意选择),批处理大小为32。

我们正在原始数据上拟合模型,我们认为这可能是个好主意,但这是一个重要的起点。

history = model.fit(X_train, y_train, epochs=300, batch_size=32, verbose=0, validation_data=(X_test,y_test))

训练结束时,我们将在测试数据集上评估模型的性能,并将性能报告为分类准确性。

# predict test set
yhat = model.predict_classes(X_test)
# evaluate predictions
score = accuracy_score(y_test, yhat)
print('Accuracy: %.3f' % score)

最后,我们将在训练过程中在训练和测试集上绘制交叉熵损失的学习曲线。

# plot learning curves
pyplot.title('Learning Curves')
pyplot.xlabel('Epoch')
pyplot.ylabel('Cross Entropy')
pyplot.plot(history.history['loss'], label='train')
pyplot.plot(history.history['val_loss'], label='val')
pyplot.legend()
pyplot.show()

完整实例如下:

# fit a simple mlp model on the mammography and review learning curves
from pandas import read_csv
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import accuracy_score
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
from matplotlib import pyplot
# load the dataset
path = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/mammography.csv'
df = read_csv(path, header=None)
# split into input and output columns
X, y = df.values[:, :-1], df.values[:, -1]
# ensure all data are floating point values
X = X.astype('float32')
# encode strings to integer
y = LabelEncoder().fit_transform(y)
# split into train and test datasets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, stratify=y, random_state=1)
# determine the number of input features
n_features = X.shape[1]
# define model
model = Sequential()
model.add(Dense(50, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(Dense(1, activation='sigmoid'))
# compile the model
model.compile(optimizer='adam', loss='binary_crossentropy')
# fit the model
history = model.fit(X_train, y_train, epochs=300, batch_size=32, verbose=0, validation_data=(X_test,y_test))
# predict test set
yhat = model.predict_classes(X_test)
# evaluate predictions
score = accuracy_score(y_test, yhat)
print('Accuracy: %.3f' % score)
# plot learning curves
pyplot.title('Learning Curves')
pyplot.xlabel('Epoch')
pyplot.ylabel('Cross Entropy')
pyplot.plot(history.history['loss'], label='train')
pyplot.plot(history.history['val_loss'], label='val')
pyplot.legend()
pyplot.show()

运行示例首先使模型适合训练数据集,然后报告测试数据集的分类准确性。

注意:由于算法或评估程序的随机性,或者数值精度的差异,您的结果可能会有所不同。 考虑运行该示例几次并比较平均结果。

在这种情况下,我们可以看到该模型的性能要优于无技能模型,因为该模型的准确度高于大约97.7%,在这种情况下,其准确度约为98.8%。

Accuracy: 0.988

然后创建训练和测试装置上的损耗线图。我们可以看到,该模型可以快速找到适合数据集的模型,并且看起来不会过度拟合或拟合不足。

现在,我们对数据集上的简单MLP模型的学习动力学有了一些了解,我们可以着眼于对数据集上的模型性能进行更健壮的评估。

稳健的模型评估

k折交叉验证过程可以提供更可靠的MLP性能估计,尽管它可能非常慢。这是因为必须拟合和评估k个模型。 当数据集大小较小时(例如癌症生存数据集),这不是问题。我们可以使用StratifiedKFold类并手动枚举每个折叠,对模型进行拟合,评估,然后在过程结束时报告评估得分的平均值。

# prepare cross validation
kfold = KFold(10)
# enumerate splits
scores = list()
for train_ix, test_ix in kfold.split(X, y):# fit and evaluate the model......
...
# summarize all scores
print('Mean Accuracy: %.3f (%.3f)' % (mean(scores), std(scores)))

我们可以使用此框架通过我们的基本配置,甚至使用各种不同的数据准备,模型架构和学习配置,来开发对MLP模型性能的可靠估计。

重要的是,在使用k-fold交叉验证来评估性能之前,我们首先需要对上一部分中的数据集模型的学习动态有一个了解。 如果我们开始直接调整模型,我们可能会获得良好的结果,但是如果没有, 我们可能不知道为什么,例如 模型超出或不足。

如果我们再次对模型进行较大更改,则最好返回并确认模型在适当收敛。下面列出了用于评估上一节中的基本MLP模型的此框架的完整示例。

# k-fold cross-validation of base model for the mammography dataset
from numpy import mean
from numpy import std
from pandas import read_csv
from sklearn.model_selection import StratifiedKFold
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import accuracy_score
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
from matplotlib import pyplot
# load the dataset
path = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/mammography.csv'
df = read_csv(path, header=None)
# split into input and output columns
X, y = df.values[:, :-1], df.values[:, -1]
# ensure all data are floating point values
X = X.astype('float32')
# encode strings to integer
y = LabelEncoder().fit_transform(y)
# prepare cross validation
kfold = StratifiedKFold(10, random_state=1)
# enumerate splits
scores = list()
for train_ix, test_ix in kfold.split(X, y):# split dataX_train, X_test, y_train, y_test = X[train_ix], X[test_ix], y[train_ix], y[test_ix]# determine the number of input featuresn_features = X.shape[1]# define modelmodel = Sequential()model.add(Dense(50, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))model.add(Dense(1, activation='sigmoid'))# compile the modelmodel.compile(optimizer='adam', loss='binary_crossentropy')# fit the modelmodel.fit(X_train, y_train, epochs=300, batch_size=32, verbose=0)# predict test setyhat = model.predict_classes(X_test)# evaluate predictionsscore = accuracy_score(y_test, yhat)print('>%.3f' % score)scores.append(score)
# summarize all scores
print('Mean Accuracy: %.3f (%.3f)' % (mean(scores), std(scores)))

运行示例将在评估过程的每次迭代中报告模型性能,并在运行结束时报告分类精度的平均值和标准偏差。

注意:由于算法或评估程序的随机性,或者数值精度的差异,您的结果可能会有所不同。 考虑运行该示例几次并比较平均结果。

在这种情况下,我们可以看到MLP模型的平均准确度约为98.7%,这与我们在上一节中的粗略估计非常接近。

这证实了我们的期望,即对于此数据集,基本模型配置可能比纯朴的模型更有效

> 0.987
> 0.986
> 0.989
> 0.987
> 0.986
> 0.988
> 0.989
> 0.989
> 0.983
> 0.988
平均准确度:0.987(0.002)

接下来,让我们看看如何拟合最终模型并使用它进行预测。

最终模型和做出预测

选择模型配置后,我们可以在所有可用数据上训练最终模型,并使用它对新数据进行预测。在这种情况下,我们将使用具有辍学和小批量的模型作为最终模型。尽管可以在整个数据集而不是数据集的训练子集上,但我们仍可以像以前一样准备数据并拟合模型。

# split into input and output columns
X, y = df.values[:, :-1], df.values[:, -1]
# ensure all data are floating point values
X = X.astype('float32')
# encode strings to integer
le = LabelEncoder()
y = le.fit_transform(y)
# determine the number of input features
n_features = X.shape[1]
# define model
model = Sequential()
model.add(Dense(50, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(Dense(1, activation='sigmoid'))
# compile the model
model.compile(optimizer='adam', loss='binary_crossentropy')

然后,我们可以使用此模型对新数据进行预测。首先,我们可以定义一行新数据。

# define a row of new data
row = [0.23001961,5.0725783,-0.27606055,0.83244412,-0.37786573,0.4803223]

注意:我从数据集的第一行中提取了这一行,期望的标签是“ -1”。然后我们可以做出预测。

# make prediction
yhat = model.predict_classes([row])

然后对预测进行转换,这样我们就可以在正确的标签中使用或解释结果(对于该数据集而言,这只是一个整数)。

# invert transform to get label for class
yhat = le.inverse_transform(yhat)

在这种情况下,我们将仅报告预测。

# report prediction
print('Predicted: %s' % (yhat[0]))

完整实例如下:

# fit a final model and make predictions on new data for the mammography dataset
from pandas import read_csv
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import accuracy_score
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Dropout
# load the dataset
path = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/mammography.csv'
df = read_csv(path, header=None)
# split into input and output columns
X, y = df.values[:, :-1], df.values[:, -1]
# ensure all data are floating point values
X = X.astype('float32')
# encode strings to integer
le = LabelEncoder()
y = le.fit_transform(y)
# determine the number of input features
n_features = X.shape[1]
# define model
model = Sequential()
model.add(Dense(50, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(Dense(1, activation='sigmoid'))
# compile the model
model.compile(optimizer='adam', loss='binary_crossentropy')
# fit the model
model.fit(X, y, epochs=300, batch_size=32, verbose=0)
# define a row of new data
row = [0.23001961,5.0725783,-0.27606055,0.83244412,-0.37786573,0.4803223]
# make prediction
yhat = model.predict_classes([row])
# invert transform to get label for class
yhat = le.inverse_transform(yhat)
# report prediction
print('Predicted: %s' % (yhat[0]))

运行示例可以使模型适合整个数据集,并为单行新数据做出预测。

注意:由于算法或评估程序的随机性,或者数值精度的差异,您的结果可能会有所不同。 考虑运行该示例几次并比较平均结果。

在这种情况下,我们可以看到模型为输入行预测了“ -1”标签。

Predicted: '-1'

为伍兹乳腺X线摄影数据集开发神经网络相关推荐

  1. 多视图CAD检测系统乳腺X线摄影基于案例的检测性能优化

    多视图CAD检测系统乳腺X线摄影基于案例的检测性能优化 介绍 通常乳腺肿块的检测基于双视图乳腺摄影,医生在阅片是会将所有可用视图的信息组合在一起,他们比较MLO和CC视图,寻找不对称性并评估相对于先前 ...

  2. 数字化X线摄影系统(DR)发展及技术现状

    直接数字化放射摄影(Digital Radiography,简称DR),是上世纪九十年代发展起来的X线摄影新技术,具有更快的成像速度.更便捷的操作.更高的成像分辨率等显著优点,成为数字X线摄影技术的主 ...

  3. 计算机x线影像ppt,计算机X线摄影ppt课件

    计算机X线摄影ComputedRadiography,CR,计算机X线摄影,传统的X线成像是经X射线曝光,将影像信息记录在胶片上,在显.定影处理后,在照片上显示影像计算机X线成像是将影像信息记录在影像 ...

  4. 计算机在摄影应用,计算机X线摄影在临床中的应用

    计算机X线摄影在临床中的应用 金卫东 [期刊名称]<吉林医学> [年(卷),期]2009(030)024 [摘要]目前交通事故及意外伤害较多,在处理伤害评定过程中,普通X线摄影在医疗鉴定中 ...

  5. 计算机x线影像ppt,计算机X线摄影课件

    <计算机X线摄影课件>由会员分享,可在线阅读,更多相关<计算机X线摄影课件(35页珍藏版)>请在人人文库网上搜索. 1.计算机X线摄影 Computed Radiography ...

  6. 质量基础设施一站式服务平台建设,NQI线上系统开发方案

    质量基础设施一站式服务平台建设,NQI线上系统开发方案 质量基础设施一站式服务,即通过有机融合计量.标准.认证认可.检验检测等要素资源,面向产业.区域.企业特别是中小微企业和民营企业提供的全链条.全方 ...

  7. opencv3和qt5计算机视觉应用开发在线阅览_摄影系统开发多少钱

    摄影系统开发多少钱2.The AppBuilderTheAppBuilder 提供了一套应用程序整体解决方案,以满足你制作面向员工.客户.活动的App.提供两种不同的思路.,可以使用在线工具包自己构建 ...

  8. 计算机X线摄影的英文表达是( ),计算机X线摄影(国外英文资料).doc

    计算机X线摄影(国外英文资料) 计算机X线摄影(国外英文资料) Online free consultation telephone complaints online registration on ...

  9. 手写汉字数字识别详细过程(构建数据集+CNN神经网络+Tensorflow)

    手写汉字数字识别(构建数据集+CNN神经网络) 期末,P老师布置了一个大作业,自己构建数据集实现手写汉字数字的识别.太捞了,记录一下过程.大概花了一个下午加半个晚上,主要是做数据集花时间. 一.构建数 ...

  10. 神经网络训练数据集下载,神经网络训练集数量

    200组数据可以训练神经网络吗 谷歌人工智能写作项目:神经网络伪原创 BP神经网络的训练集需要大样本吗?一般样本个数为多少? BP神经网络的训练集需要大样本吗?一般样本个数为多少? BP神经网络样本数 ...

最新文章

  1. 参加完Python培训后可以找什么工作
  2. 规模化敏捷中的“三要”和“三不要”
  3. 自注意力真的是Transformer的必杀技吗?MSRA否认三连,并反手给你扔来一个sMLPNet
  4. Python----socket编程
  5. 关于Linux C multiple definition of‘XXX’的问题
  6. CV Code | 计算机视觉开源周报 20190602期
  7. python做软件测试需要那些条件_做软件测试需要学什么
  8. 通向财务自由之路06_适应大环境的交易策略
  9. bzoj 2599: [IOI2011]Race(树的点分治)
  10. 程序员的SQL金典-杨中科
  11. IOT | 物联网入门
  12. DB2数据库HANG住的时候应该收集什么数据以及如何处理
  13. 17位企业老总及行业大腕联袂推荐——《数据化管理:洞悉零售及电子商务运营》...
  14. OC load 和 initialize 方法
  15. 合天网安实验室CTF练习赛之RE300
  16. 模型基础——模型与材质
  17. 【人工智能】Fisher 线性分类器的设计与实现(QDU)
  18. Java 方式实现词云显示
  19. HIVE Parquet格式+snappy压缩及ORC格式+snappy压缩文件的方式
  20. uniapp h5集成百度地图

热门文章

  1. 凸优化有关的数值线性代数知识二:求解已经因式分解的矩阵的线性方程组
  2. webpack打包非模块化js
  3. 解决12c安装过程中的各种报错
  4. Create directory命令
  5. Spring-day02
  6. 百度地图InfoWindow弹窗圆角
  7. Git最基本入门,只是个感想总结啊啊啊不要搜到我0.0
  8. VS2013 update4+Cocos2d-x 3.7 Win8下安装方法及配置
  9. IOS之xib计算cell的高度
  10. CRM 2013 中业务流程的