基于文本分类的机器学习-LR类处理多分类问题

基础知识部分:

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,c1,....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

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值