逻辑回归-根据父母身高预测孩子身高是否长到1.8 作者:马育民 • 2019-09-10 21:06 • 阅读:10207 生成数据参见: [生成父母平均身高和孩子身高是否1.8的测试数据](https://www.malaoshi.top/show_1EF4IF3reQsr.html "生成父母平均身高和孩子身高是否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) ``` 显示如下图: [![](https://www.malaoshi.top/upload/0/0/1EF4IEea3hxH.png)](https://www.malaoshi.top/upload/0/0/1EF4IEea3hxH.png) 从图像可知,父母平均身高在1.77-1.85之间的,孩子即可能是 **低于1.8**,也可能 **高于1.8**,也就是说这个区间的数据很容易 **不准确** ### 显示训练测试数据图像(注意) ``` plt.scatter(x2,y2) ``` [![](https://www.malaoshi.top/upload/0/0/1EF4IEk5x2cN.png)](https://www.malaoshi.top/upload/0/0/1EF4IEk5x2cN.png) 从图像可知,父母平均身高在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']) ``` [![](https://www.malaoshi.top/upload/0/0/1EF4IEng5m1R.png)](https://www.malaoshi.top/upload/0/0/1EF4IEng5m1R.png) ### 将准确率画成图像 ``` plt.plot(history.epoch,history.history['acc']) ``` [![](https://www.malaoshi.top/upload/0/0/1EF4IEoOd8CW.png)](https://www.malaoshi.top/upload/0/0/1EF4IEoOd8CW.png) ### 对测试集进行预测 ``` 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个神经元时,需要更多的训练次数,或者需要更多的训练数据,才能达到更好的训练结果 [![](https://www.malaoshi.top/upload/0/0/1EF4IEng5m1R.png)](https://www.malaoshi.top/upload/0/0/1EF4IEng5m1R.png) ### 1. 对原模型训练1000次 对原模型训练1000次,损失情况如下图: [![](https://www.malaoshi.top/upload/0/0/1EF4Ia3Gm2vv.png)](https://www.malaoshi.top/upload/0/0/1EF4Ia3Gm2vv.png) 从图中可知,大约训练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() ``` 损失情况如下图: [![](https://www.malaoshi.top/upload/0/0/1EF4Ia83M2y1.png)](https://www.malaoshi.top/upload/0/0/1EF4Ia83M2y1.png) 可知:使用更多的神经元后,损失下降的更快,大约在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() ``` 损失情况如下图: [![](https://www.malaoshi.top/upload/0/0/1EF4IaCdXEY4.png)](https://www.malaoshi.top/upload/0/0/1EF4IaCdXEY4.png) 从图中可知,2个全连接层,24个神经元,损失下降的更快,大约训练300次时,就达到极限了 # 练习 尝试使用更多或更少的全连接层、神经元,测试对训练的影响 原文出处:http://malaoshi.top/show_1EF42k7w2d4d.html