逻辑回归-根据父母身高预测孩子身高是否长到1.8

生成数据参见:
生成父母平均身高和孩子身高是否1.8的测试数据

读取数据

import numpy as np

count=700

data=np.loadtxt('./父母身高和孩子身高是否超过1.8cm.csv',delimiter=',')
print(data)

查看目标值是否二分类问题

import collections
# 查看目标值是否只有两个
collections.Counter(data[:,1])

打乱顺序(重要)

因为数据是根据父母身高从小到大排列,越往后面,父母身高越高,如果不打乱顺序,无法准确预测

np.random.shuffle(data)

生成训练数据和测试数据

# 前700条记录是训练集
x=data[:count,0]
y=data[:count,-1]
print(x)
print('-'*50)
print(y)

# 后300条是测试集
x2=data[count:,0]
y2=data[count:,-1]

print(x2)
print('-'*50)
print(y2)

显示训练数据图像 (注意)

import matplotlib.pyplot as plt

plt.scatter(x,y)

显示如下图:

从图像可知,父母平均身高在1.77-1.85之间的,孩子即可能是 低于1.8,也可能 高于1.8,也就是说这个区间的数据很容易 不准确

显示训练测试数据图像(注意)

plt.scatter(x2,y2)


从图像可知,父母平均身高在1.77-1.89之间的,孩子即可能是 低于1.8,也可能 高于1.8,也就是说这个区间的数据很容易 不准确

建模

import tensorflow as tf
model=tf.keras.Sequential()
model.add(tf.keras.layers.Dense(8,input_shape=(1,)))
#model.add(tf.keras.layers.Dense(4))
model.add(tf.keras.layers.Dense(1,activation='sigmoid'))
model.summary()

编译和训练

# 获取准确率
model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['acc'])

history=model.fit(x,y,epochs=500)

查看history的属性

history.__dict__

将损失函数画成图像

import matplotlib.pyplot as plt
plt.plot(history.epoch,history.history['loss'])

将准确率画成图像

plt.plot(history.epoch,history.history['acc'])

对测试集进行预测

prd=model.predict(x2).flatten()
prd

对预测结果做0,1转换

prd[prd>0.5]=1
prd[prd<0.5]=0
prd

将预测结果和测试集的目标值做对比

error_num=0
for item in range(len(y2)):
    result=True
    if y2[item]==prd[item]:
        result=True
    else:
        result=False
        error_num+=1
    print(x2[item],'---',y2[item],'---',prd[item],'---',result)

print(error_num)

对模型优化

从损失函数图像可知,500次以后似乎还能下降,这说明:
当模型只有1个全连接层,有8个神经元时,需要更多的训练次数,或者需要更多的训练数据,才能达到更好的训练结果

1. 对原模型训练1000次

对原模型训练1000次,损失情况如下图:

从图中可知,大约训练900次以后,达到极限

2. 使用更多的神经元

使用1个全连接层,16个神经元,训练1000次,如下代码

import tensorflow as tf
model=tf.keras.Sequential()

model.add(tf.keras.layers.Dense(16,input_shape=(1,)))
model.add(tf.keras.layers.Dense(1,activation='sigmoid'))
model.summary()

损失情况如下图:

可知:使用更多的神经元后,损失下降的更快,大约在700次达到极限

3. 使用多个全连接层

使用2个全连接层,24个神经元,训练1000次,如下代码:

model=tf.keras.Sequential()
model.add(tf.keras.layers.Dense(16,input_shape=(1,)))
model.add(tf.keras.layers.Dense(8))
model.add(tf.keras.layers.Dense(1,activation='sigmoid'))
model.summary()

损失情况如下图:

从图中可知,2个全连接层,24个神经元,损失下降的更快,大约训练300次时,就达到极限了

练习

尝试使用更多或更少的全连接层、神经元,测试对训练的影响


原文出处:/show_1EF42k7w2d4d.html