「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战」
BP神经网络和集成学习
BP神经网络结构图如下:
BP神经网络包括了输入层,两个隐层,和一个输出层,实际上,根据预测正确率,可以对隐层数目进行调整,隐层的神经元数目也能进行调整,一个BP神经网络系统,往往需要多次调参,调整隐层数目,隐层的神经元,甚至偏置层数也需要调整,调整好的神经网络,功能非常强大。
BP神经网络是一种强学习器,使用集成学习中的Bagging投票可增加一点精确度,对于竞赛提升准确度有一些帮助。
集成学习的一般结构:先产生一组“个体学习器”,再用某种策略将它们结合起来,个体学习期通常由一个现有的学习算法从训练数据产生,例如C4.5决策树算法、BP神经网络算法等,此时集成中只包含同种类型的个体学习器,例如“决策树集成”中全是决策树,“神经网络集成”中全是神经网络,这样的集成是同质的。同质集成中的个体学习器也称为“基学习器”,相应的学习算法称为“基学习算法”。Bagging集成算法的示意图如下。
Bagging集成算法可看作是投票法,假设一百个学习器,50以上认为结果是1,其他的认为结果是0,那么多数获胜,最终结果为1.
代码实现
使用数据集为马疝病数据集(horseColic),该数据集各大网站都有,可自行寻找。 测试集如下
为方便集成学习进行预测,将最后一列的标签0改为-1。
from sklearn.neural_network import MLPRegressor
import pandas as pd
import numpy as np
dict = {0: -1}
dataTran = pd.read_csv('horseColicTraining.txt', sep='\t', header=None)
dataTran = dataTran.apply(lambda x: (x - np.min(x)) / (np.max(x) - np.min(x)))
dataTran[21] = dataTran[21].replace(dict)
dataTest = pd.read_csv('horseColicTest.txt', sep='\t', header=None)
dataTest = dataTest.apply(lambda x: (x - np.min(x)) / (np.max(x) - np.min(x)))
dataTest[21] = dataTest[21].replace(dict)
dataTest2 = dataTest
dataTest2 = dataTest.drop(labels=21, axis=1)
dataTest3 = dataTest.iloc[:, 21]
model2 = MLPRegressor(hidden_layer_sizes=(21, 10), random_state=10, activation='tanh', solver='adam',
learning_rate_init=0.01,
alpha=0.001, max_iter=1000)
model2.fit(dataTran.iloc[:, :21], dataTran.iloc[:, 21])
res1 = model2.predict(dataTest2)
print(res1)
for i in range(len(res1)):
if (res1[i] > -0.1):
res1[i] = 1
else:
res1[i] = -1
print(len(res1))
j = 0
for i in range(len(res1)):
if (res1[i] == dataTest3[i]):
j = j + 1
print(j / float(67))
# 投票法
n_BP = 100
res = 0
for i in range(n_BP):
sample_df = np.random.permutation(len(dataTran))
data = dataTran.take(sample_df[:210])
X = data.iloc[:, :21] # 构造X
Y = data.iloc[:, 21] # 构造Y
model = MLPRegressor(hidden_layer_sizes=(21, 10), activation='tanh', random_state=5, learning_rate_init=0.01,
solver='adam',
alpha=0.001,
max_iter=1000)
model.fit(X, Y)
M = model.predict(dataTest2)
for i in range(len(M)):
if (M[i] > -0.1):
M[i] = 1
else:
M[i] = -1
d = 0
for a in range(len(M)):
if (M[a] == dataTest3[a]):
d = d + 1
print(d / float(67))
res += M
d = 0
res = np.sign(res)
print(res)
for i in range(len(res)):
if (res[i] == dataTest3[i]):
d = d + 1
print(d / float(67))
可适当增加bagging投票数。
最后一行数据为集成后的预测正确率,其余为单个学习器得出的预测正确率。