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

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

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

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

编号 肿块密度 大小均匀性 形状均匀性 边缘粘附性 单一细胞大小 裸核 乏味染色体 正常核 有丝分裂 分类
1000025 5 1 1 1 2 1 3 1 1 2
1002945 5 4 4 5 7 10 3 2 1 2
1015425 3 1 1 1 2 2 3 1 1 2
⋮ \vdots ⋮ \vdots ⋮ \vdots ⋮ \vdots ⋮ \vdots ⋮ \vdots ⋮ \vdots ⋮ \vdots ⋮ \vdots ⋮ \vdots ⋮ \vdots
897471 4 8 6 4 3 4 10 6 1 4
897471 4 8 8 5 4 5 10 4 1 4

表中每一行表示一位患者的数据。第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%

效果不错!

你可能感兴趣的:(最优化方法,python,神经网络,分类,最优化方法,机器学习)