最优化方法Python计算:无约束优化应用——神经网络分类模型

本文介绍了如何使用MLPClassifier类构建神经网络模型,以乳腺癌数据集为例进行训练和测试。通过数据预处理,构建了一个包含两个隐藏层的神经网络,用于分类良性与恶性乳腺癌,测试结果显示模型在剩余数据上的正确率较高。
摘要由CSDN通过智能技术生成

Hello, 2024.
用MLPModel类(详见博文《最优化方法Python计算:无约束优化应用——神经网络回归模型》)和Classification类(详见博文《最优化方法Python计算:无约束优化应用——逻辑分类模型》)可以构建用于分类的神经网络。

class MLPClassifier(Classification, MLPModel):
    '''神经网络分类模型'''        

用MLPClassifier解决下列案例。
综合案例
乳腺癌是困扰女性的一种疾病。随着医学科学的长足发展,许多病人通过手术可解除病痛,延续生命。然而,根据检查数据对患者的正确诊断是有效治疗的前提。文件breast-cancer-wisconsin.csv(来自UC Irvine Machine Learning Repository)记录了699例病人的记录。

编号肿块密度大小均匀性形状均匀性边缘粘附性单一细胞大小裸核乏味染色体正常核有丝分裂分类
10000255111213112
100294554457103212
10154253111223112
⋮ \vdots ⋮ \vdots ⋮ \vdots ⋮ \vdots ⋮ \vdots ⋮ \vdots ⋮ \vdots ⋮ \vdots ⋮ \vdots ⋮ \vdots ⋮ \vdots
89747148643410614
89747148854510414

表中每一行表示一位患者的数据。第1个是患者编号,紧接着的9个是检验数据,最后一个是诊断结果(2表示良性,4表示恶性)。表示患者编号的第1个数据显然与诊断结果无关,接着的9个数据视为患者的特征数据,均为数值数据。其中,第7个“裸核”数据有16个记录是缺失的(表示为“?”),简便起见,我们可以直接删掉这16条记录。

import numpy as np															#导入numpy
data = np.loadtxt('breast-cancer-wisconsin.csv', delimiter=',', dtype=str)	#读取数据文件
X = np.array(data)															#转换为数组
X = X[1:, :]																#去掉表头
Y = X[:, 10].astype(int)													#读取标签数据
X = X[:, 1:10]																#去掉编号列及标签列
print('原数据集共有%d条记录。'%X.shape[0])
a = np.where(X[:, 5]=='?')													#找出裸核缺失记录
X = np.delete(X, a, axis = 0).astype(float)									#删除缺损记录
Y = np.delete(Y, a)
Y = Y // 2																	#转换标签数据值
print('有效记录共有%d条'%X.shape[0])

程序的第2~3行读取文件数据data并将其转换为Numpy二维数组X。第4行去掉表头信息,第5行读取X中最后一列作为标签数Y。第6行去掉X中患者编号列(第0列)及标签列(第10列,已转存Y)。第8行用Numpy的where函数找到“裸核”数据列中值为’?'的行下标,赋予a。第9、10行将下标在a中的记录删除,包括X中特征数据和Y中标签数据。第11行将Y中的值2转换为1,4转换为2,以适应我们为分类模型配置的阈值函数对标签值为连续整数的要求(详见博文《最优化方法Python计算:无约束优化应用——逻辑分类模型》)。运行程序,输出

原数据集共有699条记录。
有效记录共有683

接下来,我们在数据集中随机选取一半数据作为训练集合,来训练一个具有2个隐藏层,分别具有4,3个神经元的网络分类模型,并用剩下的数据作为测试数据来检验模型的训练效果。

……
m = X.shape[0]											#记录数
np.random.seed(2002)
a = np.arange(m)										#下标集
print('随机抽取%d个样本作为训练数据'%(m//2))
index = np.random.choice(a,m//2, replace = False)		#随机取得一半作为训练集下标
index1 = np.setdiff1d(a, index)							#测试集下标
Xtrain = X[index]										#训练集特征数据
Ytrain = Y[index]										#训练集标签数据
Xtest = X[index1]										#测试集特征数据
Ytest = Y[index1]										#测试集标签数据
bcw = MLPClassifier()									#建立模型
bcw.fit(Xtrain, Ytrain, hidden_layer_sizes = (4, 3))	#训练模型
_, acc = bcw.test(Xtest, Ytest)							#测试模型
print('对其余%d个数据进行测试,正确率为%.1f'%(m-m//2,acc)+'%'

本程序代码紧接前程序之后,第1行的省略号即表示前面的程序代码。第2行设记录数为m。第4行将所有记录的下标记为a。第6行在a中随机抽取一般数据为index。第7行将a中除去index的值记为index1。第8~11行分别用index和index1设置训练数据集Xtrain,Ytrain和测试数据集Xtest,Ytest。第12行创建MLPClassifier类神经网络分类模型bcw。第13行用Xtrain,Ytrain将bcw训练成一个含有2个隐藏层,分别含有4、3个神经元的神经网络。第14行用Xtest,Ytest对bcw进行测试。运行程序,输出

……
随机抽取341个样本作为训练数据
训练中...,稍候
61次迭代后完成训练。
对其余342个数据进行测试,正确率为97.7%

效果不错!
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!

  • 17
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值