内容介绍
该项目需要实现一个分类问题,输入数据X有两个属性,标签d包含两类,用整形数字0、1表示。
- 读取数据 homework.npz
- 请分析点(0.2, 0.2)所属类别
- 尽可能的提升精度与速度,在精度大于95%时,速度因素更加需要考虑
- 可以使用多层神经网络
- 可以进行特征工程
- 使用TensorBoard绘制所搭建的网络模型
- 尝试使用numpy完成预测
读取数据
import numpy as np
files = np.load("homework.npz")
X = files['X']
label = files['d']
绘制不同特征与对应标签的散点图,以及特征分
参考博客:从np.random.normal()到正态分布的拟合
import matplotlib.pyplot as plt
import scipy.stats as st
plt.figure(figsize=(16,8))
for i in range(2):
plt.subplot(2,2,i+1)
plt.scatter(X[:,i], label, alpha= 0.3)
plt.title('特征 {}'.format(i+1))
for i in range(2):
plt.subplot(2,2,i+3)
plt.hist(X[:,i],bins=50,density=True)
x_mean = np.mean(X[:,i])
x_std = np.std(X[:,i])
x = np.linspace(-2, 2, 50)
plt.plot(x, st.norm(x_mean, x_std).pdf(x), lw=2, c='r')
plt.annotate('均值为:{:.2f} \n方差为:{:.2f}'.format(x_mean, x_std),xy=(1.5,0.6),weight='heavy')
plt.title('特征 {}'.format(i+1))
观察上述四幅图像可以发现两特征属于正态分布,与标签分布也比较均衡。因此不需要对数据进行特征归一化和标签均衡
标签处理
- 这里使用了独热编码
将编码0转换为 [1 0]
将编码1转换为 [0 1]
from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder(sparse=False)
# enc.fit(label.reshape(-1,1))
label_onehot = enc.fit_transform(label.reshape(-1,1))
for i in range(10):
print(f'原始标签:{label[i]}, 处理后的标签:{label_onehot[i]}')
原始标签:1, 处理后的标签:[0. 1.]
原始标签:1, 处理后的标签:[0. 1.]
原始标签:1, 处理后的标签:[0. 1.]
原始标签:0, 处理后的标签:[1. 0.]
原始标签:0, 处理后的标签:[1. 0.]
原始标签:1, 处理后的标签:[0. 1.]
原始标签:1, 处理后的标签:[0. 1.]
原始标签:0, 处理后的标签:[1. 0.]
原始标签:0, 处理后的标签:[1. 0.]
原始标签:1, 处理后的标签:[0. 1.]
搭建神经网络
时间计算参考博客python计算时间的两种方式:time与datetime
- 隐藏层个数:2 ; 隐藏层元素个数:[6, 6] ;隐藏层激活函数:ReLu函数 ; 训练次数:2001 ; 特征工程:无
import tensorflow as tf
import datetime
x = tf.placeholder(tf.float32, [None, 2], name="input_x")
d = tf.placeholder(tf.float32, [None, 2], name="input_y")
# 对于sigmoid激活函数而言,效果可能并不理想
net = tf.layers.dense(x, 6, activation=tf.nn.relu)
net = tf.layers.dense(net, 6, activation=tf.nn.relu)
y = tf.layers.dense(net, 2, activation=None)
loss =