什么是逻辑回归
线性回归预测的是一个连续值,逻辑回归给出的“是”和“否”的回答。
Sigmoid函数是一个概率分布函数,给定某个输入,它将输出为一个概率值。
逻辑回归损失函数
- 平方差所惩罚的是与损失为同一数量级的情形。
- 对于分类问题,我们最好的使用交叉熵损失函数会更有效。
- 交叉熵会输出一个更大的“损失”。
交叉熵损失函数
交叉熵刻画的是实际输出(概率)与期望输出(概率)的距离,也就是交叉熵的值越小,两个概率分布就越接近。假设概率分布p为期望输出,概率分布q为实际输出,H(p,q)为交叉熵,则:
由图可知,靠近0时交叉熵损失会非常大,而L2损失只能到1。
Keras交叉熵
在keras里,我们使用binary_crossentropy来计算二元交叉熵
查看数据
0-14列是特征,15列是目标值。
标记1的有357个数据,标记-1的有296个数据。
x = data.iloc[:,:-1]
y = data.iloc[:,-1].replace(-1,0)
把-1替换成0,取出特征数据和目标数据
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(4,input_shape=(15,),activation='relu'))
model.add(tf.keras.layers.Dense(4,activation='relu'))
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=100)
正确率由0.35提升到0.79。
loss值下降趋势:
正确率的变换:
softmax分类
神经网络的原始输出不是一个概率值,实质上只是输入的数值做了复杂的加权和与非线性处理之后的一个值而已,那么如何将这个输出变为概率分布呢?这就是Softmax层的作用。
- softmax要求每个样本必须属于某个类别,且所有可能的样本均被覆盖。
- softmax个样本分量之和为1。
- 当只有两个类别时,与对数几率回归完全相同。
tf.keras交叉熵
在tf.keras里,对于多分类问题我们使用categorical_crossentropy和sparse_categorical_crossentropy来计算softmax交叉熵。
Fashion MNIST 数据集
是成为MNIST数据集的简单替换,更具有挑战性。包含70000张灰度图像,涵盖10个类别。我们将使用60000张图像训练网络,并使用10000张图像评估经过学习的网络分类图像的准确率。
先在我的电脑的c盘的这个地方放入下载好的数据集fashion-mnist。
输出他们的shape:
(train_image,train_label),(test_image,test_label) = tf.keras.datasets.fashion_mnist.load_data()
输出第一张图:
label的取值:
数字代表第几个分类,用0代表T恤,用9代表鞋子。
编译和训练
train_image = train_image/255
test_image = test_image/255
model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape=(28,28))) # 28*28
model.add(tf.keras.layers.Dense(128,activation='relu'))
model.add(tf.keras.layers.Dense(10,activation='softmax')) #把输出变成概率分布
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['acc']
)
history = model.fit(train_image,train_label,epochs=5)
结果如下:
模型评价:
model.evaluate(test_image,test_label)
独热编码
train_label独热编码
train_label_onehot = tf.keras.utils.to_categorical(train_label)
第一个标签9,变成独热编码后是0,0,0,0,0,0,0,0,0,1。
独热编码训练:
model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape=(28,28))) # 28*28
model.add(tf.keras.layers.Dense(128,activation='relu'))
model.add(tf.keras.layers.Dense(10,activation='softmax')) #把输出变成概率分布
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['acc']
)
model.fit(train_image,train_label_onehot,epochs=5)
结果如下: