一、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