LR、SVM、softmax对比分析

2 篇文章 0 订阅
1 篇文章 0 订阅

一、LR

1、原理解释

既是逻辑回归,所谓逻辑回归,即是将wx+b传入sigmoid函数,计算交叉熵,然后向交叉熵小的方向调整w。
以交叉熵为损失函数,交叉熵使用计算值和真实值的差来调整参数矩阵W,当误差越大,梯度就越大,参数w调整得越快,训练速度也就越快。
损失L(即是交叉熵)计算:

2、公式解释

其中h(x)即是sigmoid(x)的意思,是一个 0-1 之间的数,可以表示样本x的概率
y(i)是标签概率,只能为0,1,所以LR只能处理二分类问题

3、最终优化目标

4、怎么求解LR模型的参数:


1)、梯度下降:即是找到一组w和b,使损失最小,可以用梯度下降来做
2)、最大似然:调整w,b,使模型似然度最大,似然度最大即是残差度最小,即是越接近真实值
3)、正则化项:加在最优化目标后面,L1或者L2正则

5、LR使用实例

from pyspark.ml.linalg import Vectors
from pyspark.ml.classification import LogisticRegression
from pyspark.sql import HiveContext
from pyspark import SparkContext, SparkConf

#================vector,一种定义矩阵的方法======================================================================
#Spark的机器学习处理过程中,经常需要把标签数据(一般是字符串)转化成整数索引,而在计算结束又需要把整数索引还原为标签。
#这就涉及到几个转换器:StringIndexer、 IndexToString,OneHotEncoder
#以及针对类别特征的索引VectorIndexer。
#vector是一种索引是0开始的整数、内容为double类型,存储在单机上的向量。
# MLlib支持两种矩阵,dense密集型和sparse稀疏型。
# 一个dense类型的向量背后其实就是一个数组,而sparse向量背后则是两个并行数组——索引数组和值数组。
# 比如向量(1.0, 0.0, 3.0)既可以用密集型向量表示为[1.0, 0.0, 3.0],也可以用稀疏型向量表示为(3, [0,2],[1.0,3.0])
# 其中3是数组的大小,[0,2]表示索引的序列,[1.0,3.0]表示值的序列
sc = SparkContext.getOrCreate()
spark = HiveContext(sc)
training = spark.createDataFrame([
    (1.0, Vectors.dense([0.0, 1.1, 0.1])),
    (0.0, Vectors.dense([2.0, 1.0, -1.0])),
    (2.0, Vectors.dense([3.0, 2.1, -0.2])),
    (1.0, Vectors.dense([0.0, 1.2, -0.5]))], ["label", "features"])
training.show()
print(Vectors.dense([0.0, 1.1, 0.1]))
print(Vectors.sparse(3, [0,2],[1.0,3.0]))
#=====================vector end==========================================================

#=====================逻辑回归使用实例=====================================================
lr = LogisticRegression(maxIter=10, regParam=0.01)
#入参解释
#   maxIter:迭代的最大次数,默认是100
#   regParam:正则化系数,默认是0;既是那个正则项的系数入
print ("逻辑回归所有参数的解释:\n" + lr.explainParams() + "\n")
#创建训练模型
model1 = lr.fit(training)
print("Model 1 was fit using parameters: ")
print(model1.extractParamMap())
#==================逻辑回归模型创建 end=====================================================

#==================调整参数的方法===========================================================
# 选择使用python字典来为paramMap指定参数
paramMap = {lr.maxIter: 20}
paramMap[lr.maxIter] = 30
# 既是要为maxIter指定参数时,KEY必须是 lr.maxIter
paramMap.update({lr.regParam: 0.1, lr.threshold: 0.55})
# 或者使用update方法更新
# 还可以结合使用paramMap和python字典
paramMap2 = {lr.probabilityCol: "myProbability"}
paramMapCombined = paramMap.copy()
paramMapCombined.update(paramMap2)
#==================参数调整 end================================================================

#==================利用调整后的参数,更新模型===================================================
model2 = lr.fit(training, paramMapCombined)
#估计器才有fit方法,所以逻辑回归就是一个估计器
print("Model 2 was fit using parameters: ")
print(model2.extractParamMap())
#==================模型更新 end================================================================

#=================准备测试数据=================================================================
test = spark.createDataFrame([
    (1.0, Vectors.dense([-1.0, 1.5, 1.3])),
    (0.0, Vectors.dense([3.0, 2.0, -0.1])),
    (1.0, Vectors.dense([0.0, 2.2, -1.5]))], ["label", "features"])
#================测试数据准备完毕==============================================================

#================进行预测======================================================================
# Make predictions on test data using the Transformer.transform() method.
# LogisticRegression.transform will only use the 'features' column.
# Note that model2.transform() outputs a "myProbability" column instead of the usual
# 'probability' column since we renamed the lr.probabilityCol parameter previously.
prediction = model2.transform(test)
#转换器是将一个数据框变为另一个数据框的算法。比如,一个机器学习模型就是一个转换器
#它将带有特征数据框转为预测值数据框,比如这里的逻辑回归模型,就把test数据框转换为了prediction数据框。
selected = prediction.select("features", "label", "myProbability", "prediction")
#其中myProbability=DenseVector([0.0571, 0.9429]),分别是label是0的概率,label是1的概率
for row in selected.collect():
    print(row)
#=============预测完成=========================================================================


二、怎么处理多分类问题--使用softmax

1、原理解释

即是用softmax函数代替sigmoid函数,这样可以计算每一种分类的概率,而不是只计算两个分类的概率

2、softmax分类器公式

softmax(i)=e^h_yi / (∑(C <- j=1) * e^h_j)

softmax(i)表示的是第i个类别的概率,h_yi是i类别中正确分类得分,h_j是i类别中每一个错误分类得分。

3、与LR的不同

LR的h(x)是sigmoid(wx+b),而softmax中h(x) 就是wx+b,最终的softmax才是处理wx+b的

三、SVM和LR的关系

1、SVM是分类边界问题

其主体公式是yi(wx+b) - 1=0 ,利用优化1/||w||^2来找到最优分类边界,并不是一个单纯的参数优化问题,因此对异常值也不敏感

2、LR对异常值很敏感

训练样本的参与度也不一样,LR几乎是全部参与,SVM只由和分类边界相关的一部分样本才参与

3、损失函数不同

LR是交叉熵损失,SVM是hinge-loss

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值