声明一个损失函数需要将系数**(权重和偏置)定义为变量**,将数据集定义为占位符
设 m 是样本数量,n 是特征数量,P 是类别数量
m = 1000
n = 15
P = 2
在标准线性回归的情况下,只有一个输入变量和一个输出变量:
import tensorflow as tf
#定义占位符 用于训练数据的输入
X = tf.placeholder(tf.float32, name='X')
Y = tf.placeholder(tf.float32, name='Y')
#定义变量 用于承载和更新权重和偏置
w0 = tf.Variable(0.0)
w1 = tf.Variable(0.0)
#线性回归模型
Y_hat = X*w1 + w0
#损失函数
loss = tf.square(Y - Y_hat, name='loss') #square 平方
在多元线性回归的情况下,输入变量不止一个,而输出变量仍为一个。现在可以定义占位符X的大小为 [m,n],其中 m 是样本数量,n 是特征数量,代码如下:
import tensorflow as tf
#定义占位符 用于训练数据的输入
X = tf.placeholder(tf.float32, name='X' , shape=[m,n])
Y = tf.placeholder(tf.float32, name='Y')
#定义变量 用于承载和更新权重和偏置
w0 = tf.Variable(0.0)
w1 = tf.Variable(tf.random_normal([n,1]))
#线性回归模型
Y_hat = tf.matmul(X, w1) + w0
#多元线性回归损失函数
loss = tf.reduce_mean(tf.square(Y - Y_hat , name='loss'))
在逻辑回归的情况下,损失函数定义为交叉熵。输出 Y 的维数等于训练数据集中类别的数量,其中 P 为类别数量:
import tensorflow as tf
#定义占位符 用于训练数据的输入
X = tf.placeholder(tf.float32, name='X' , shape=[m,n])
Y = tf.placeholder(tf.float32, name='Y' , shape=[m,P])
#定义变量 用于承载和更新权重和偏置
w0 = tf.Variable(tf.zeros([1,P]), name='bias')
w1 = tf.Variable(tf.random_normal([n,1]), name='weights')
#线性回归模型
Y_hat = tf.matmul(X, w1) + w0
#损失函数
#entropy = tf.nn.softmax_cross_entropy_with_logits(Y_hat, Y)
#loss = tf.reduce_mean(entropy)
如果想把 L1 正则化加到损失上,那么代码如下:
lamda = tf.constant(0.8)
regularization_param = lamda*tf.reduce_sum(tf.abs(w1))
#New loss
loss +=regularization_param
对于 L2 正则化,代码如下:
lamda = tf.constant(0.8)
regularization_param = lamda*tf.nn.l2_loss(w1)
#New loss
loss +=regularization_param
你可以选择相应的损失函数或设计自己的损失函数。在损失项中也可以结合 L1 和 L2 正则化。
正则化:当有大量的输入特征时,需要正则化来确保预测模型不会 太复杂。正则化可以帮助防止数据过拟合。它也可以用来获得一个凸损失函数。有两种类型的正则化——L1 和 L2 正则化,其描述如下:
当数据高度共线时,L1 正则化也可以工作。在 L1 正则化中,与所有系数的绝对值的和相关的附加惩罚项被添加到损失函数中。L1 正则化的正则化惩罚项如下:
L2 正则化提供了稀疏的解决方案。当输入特征的数量非常大时,非常有用。在这种情况下,惩罚项是所有系数的平方之和:
其中,λ是正则化参数。