概述
基础知识部分:
Logistic 回归是一种常用的处理二分类问题的线性模型。
Softmax回归是logistic 回归问题再多分类上的推广,对于多分类问题,类别标签lable : y可以有C个取值,给定一个样本x,softmax回归预测判断属于类别c的条件概率为:
softmax 处理文本多分类问题:
softmax = tf.exp(logits) / tf.reduce_sum(tf.exp(logits), axis)
公式:
其中,w 是第c类的权重向量
在tensorflow框架下表示为:
##在Tensorflow图中为训练数据输入x和输出y创建占位符
self.x = placeholder(tf.float32, [None, self.seq_length])
self.y = placeholder(tf.float32, [None,self.config.num_classes])
##创建学习变量、权重和偏置
w = tf.Variable(tf.zeros([self.seq_length,self.config.num_classes])
b = tf.Variable(tf.zeros([self.config.num_classes]))
y = tf.nn.softmax(tf.matnmul(selfx,w)+b)
多分类(Multi-class Classification) 问题是指分类的类别C大于2,多分类一般需要多个线性判别函数,但设计这些判别函数有很多种方式。
假如一个多分类问题的类别为{1,2,…,C},常用的方式有以下三种:
(1) “一对其余”方式:把多分类问题转换成C个“一对其余”的二分类问题,这种方式一共需要C个判别函数,其中第c个判别函数是将类别c的样本和不属于类别c的样本分开。
(2)“一对一”方式:把多分类问题转换成C(C-1)/2个“”的二分类问题。这种方式共需要C(C-1)/2个判别函数,其中第(i,j)个判别函数是把类别i和j的样本分开。
(3)“argmax”方式:一种改进的“一对其余”方式,共需要C个判别函数
f
c
(
x
;
w
c
)
=
w
c
T
+
b
c
,
c
∈
1
,
.
.
.
.
C
f_c(x;w_c) = w^T_c+b_c, c∈{1,....C}
fc(x;wc)=wcT+bc,c∈1,....C
对于样本
x
x
x,如果存在一个类别c,相对于所有的其他类别
c
i
(
c
i
!
=
c
)
c^i(c^i != c)
ci(ci!=c),有
f
c
(
x
;
w
c
)
>
f
c
i
(
x
;
w
c
i
)
f_c(x;w_c)>f_ci(x;w_ci)
fc(x;wc)>fci(x;wci),那么
x
x
x属于类别c,"argmax"方式的预测函数定义为:
y
=
a
r
g
c
=
1
C
m
a
x
f
c
(
x
;
w
c
)
y = arg^C_{c=1}maxf_c(x;w_c)
y=argc=1Cmaxfc(x;wc)
Softmax 回归的决策函数可以表示为:
在tensorflow框架下表示为:
##根据概率排名确定类别
self.y_pred_cls = tf.argmax(y,1)
"一对其余"方式和“一对一”方式都存在一个缺陷:特征空间中会存在一些难以确定类别的区域,而”argmax“方式很好地解决了这个问题。
参数学习:
给定N个训练样本
(
x
n
,
y
n
)
{(x^n,y^n)}
(xn,yn),softmax回归使用交叉熵损失函数学习最优的参数矩阵W
使用交叉熵损失函数,Softmax回归模型的风险函数为:
风险函数R(W)关于W的梯度为
tensorflow中定义损失函数及损失loss、梯度下降优化器
cross_entropy=tf.reduce_mean(-tf.reduce_sum(self.y_*tf.log(y),reduction_indices=[1]))
self.loss=tf.reduce_mean(cross_entropy)
self.train_step=tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)##选择正确的优化器
代码:
importtensorflowastf
classLrModel(object):
def__init__(self,config,seq_length):
self.config=config
self.seq_length=seq_length
self.lr()
deflr(self):
self.x=tf.placeholder(tf.float32,[None,self.seq_length])##在Tensorflow图中为训练数据输入x和输出y创建占位符
self.y_=tf.placeholder(tf.float32,[None,self.config.num_classes])
w=tf.Variable(tf.zeros([self.seq_length,self.config.num_classes]))##创建学习变量、权重和偏置
b=tf.Variable(tf.zeros([self.config.num_classes]))
y=tf.nn.softmax(tf.matmul(self.x,w)+b)##创建逻辑回归模型
self.y_pred_cls=tf.argmax(y,1)
cross_entropy=tf.reduce_mean(-tf.reduce_sum(self.y_*tf.log(y),reduction_indices=[1]))
self.loss=tf.reduce_mean(cross_entropy)
self.train_step=tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)##选择正确的优化器
correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(self.y_,1))
self.accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
Reference:神经网络与深度学习
https://github.com/duguiming111/tensorflow-logistics-regression
最后
以上就是羞涩含羞草为你收集整理的基于文本分类的机器学习-LR类处理多分类问题的全部内容,希望文章能够帮你解决基于文本分类的机器学习-LR类处理多分类问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复