栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

多层感知机训练pima

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

多层感知机训练pima

导入库包

from keras.models import Sequential
from keras.layers import Dense
import numpy as np
import pandas as pd
# 设定随机数种子,使得模型参数初始化结果相同
np.random.seed(7)

导入数据,并将其转换为keras指定数据类型

# 导入数据
dataset = pd.read_csv('XXXX/diabetes.csv')
#print(dataset)

# 分割输入x和输出Y
x = dataset.iloc[:,0:8]
Y = dataset.iloc[:,8]

# tensorflow仅接受训练数据为numpy形式
x = np.array(x)

#对Y进行标签编码
from sklearn.preprocessing import LabelEncoder
Y=Y.values.tolist()
label_encoder = LabelEncoder()
Y = np.array(label_encoder.fit_transform(Y))

创建模型

# 创建模型
model = Sequential()

# 第一层必须设定input_dim,即输入维度(输入变量个数);input_shape=(8,) 等价于input_dim=8
# Dense类为完全连接的层,参数1为神经元个数,activation为激活函数,可选sigmoid、relu、tanh
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
# 由于最后输出结果为“是否为糖尿病”的二分类问题,因此选取sigmoid函数,且输出神经元为1
model.add(Dense(1, activation='sigmoid'))

编译模型

# 编译模型,需要指定用于评估一组权重的损失函数loss、用于搜索网络不同权重的优化器optimizer、以及模型训练报告的评估指标metrics
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

训练模型

# 训练模型,epochs为数据集迭代训练次数,还需设定执行神经网络中的权重跟新的每个批次所用到的实例个数
model.fit(x=x, y=Y, epochs=150, batch_size=10)

评估模型(仅用训练数据进行)

# 评估训练数据模型
scores = model.evaluate(x=x, y=Y)
print('n%s : %.2f%%' % (model.metrics_names[1], scores[1]*100))

 

此外,可通过kera自动评估来对模型性能进行计算,需要使用到fit()函数中的验证分割参数validation_split,该值接受小数点形式,如validation_split=0.2,表示将数据集的20%用于评估模型,其余80%用于训练模型,而后依据这20%的数据表现来给出val_loss 和val_acc

model.fit(x=x, y=Y, epochs=150, batch_size=10,validation_split=0.2)

 手动评估有两种形式,一是手动分离数据集并评估,二是k折交叉验证。对于手动指定验证数据集,可用scikit机器学习库里的train_test_split(),而评估数据集通过元组的形式传递给fit()。如下

x_trian,x_validation,Y_train,Y_validation = train_test_split(x,Y,test_size = 0.2,random_state = seed)


model.fit(x_train, Y_train ,validation_data = (x_validation,Y_validation), epochs=150, batch_size=10)

使用k折交叉验证的方法(需要注意,此方法一般不用于深度学习,因为深度学习模型的计算开销比较大),使用scikit-Learn机器学习库中的StratifiedKFold对数据集进行划分。代码如下:

from keras.models import Sequential
from keras.layers import Dense
import numpy as np
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import StratifiedKFold

# 设定随机数种子
seed = 7
np.random.seed(seed)

# 导入数据
dataset = pd.read_csv('XXX/diabetes.csv')
# 分割输入x和输出Y
x = dataset.iloc[:,0:8]
Y = dataset.iloc[:,8]

# tensorflow仅接受训练数据为numpy形式
x = np.array(x)

#对Y进行标签编码
Y=Y.values.tolist()
label_encoder = LabelEncoder()
Y = np.array(label_encoder.fit_transform(Y))

kfold = StratifiedKFold(n_splits=10, random_state = seed, shuffle = True)
cvscores =[]
for train, validation in kfold.split(x,Y):
    # 创建模型
    model = Sequential()
    model.add(Dense(12, input_dim=8, activation='relu'))
    model.add(Dense(8, activation='relu'))
    model.add(Dense(1, activation='sigmoid'))


    # 编译模型
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

    # 训练模型,通过verbose=0来关闭模型fit()和evaluate()的详细输出,在每个模型构建完成后,进行评估并输出评估结果
    model.fit(x[train], Y[train], epochs=150, batch_size=10, verbose=0)

    # 评估模型
    scores = model.evaluate(x[validation], Y[validation], verbose=0)
    
    #输出评估结果
    print('%s : %.2f%%' % (model.metrics_names[1], scores[1]*100))
    cvscores.append(scores[1]*100)

# 输出均值和标准差
print('%.2f%% (+/- %.2f%%)'% (np.mean(cvscores),np.std(cvscores)))

该文代码源自魏贞原《深度学习:基于Keras的Python实践》

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/769029.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号