逻辑回归算法(二)-----SparkMLlib实现

本文深入探讨逻辑回归算法,首先介绍了基础理论,接着通过SparkMLlib提供的Logistic Regression实例进行详细讲解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.1 逻辑回归算法

1.1.1 基础理论


logistic回归本质上是线性回归,只是在特征到结果的映射中加入了一层函数映射,即先把特征线性求和,然后使用函数g(z)将最为假设函数来预测。g(z)可以将连续值映射到0和1上。
它与线性回归的不同点在于:为了将线性回归输出的很大范围的数,例如从负无穷到正无穷,压缩到0和1之间,这样的输出值表达为“可能性”才能说服广大民众。当然了,把大值压缩到这个范围还有个很好的好处,就是可以消除特别冒尖的变量的影响。

Logistic函数(或称为Sigmoid函数),函数形式为:


Sigmoid 函数在有个很漂亮的“S”形,如下图所示:

给定n个特征x=(x1,x2,…,xn),设条件概率P(y=1|x)为观测样本y相对于事件因素x发生的概率,用sigmoid函数表示为:

那么在x条件下y不发生的概率为:

假设现在有m个相互独立的观测事件y=(y1,y2,…,ym),则一个事件yi发生的概率为(yi= 1)

当y=1的时候,后面那一项是不是没有了,那就只剩下x属于1类的概率,当y=0的时候,第一项是不是没有了,那就只剩下后面那个x属于0的概率(1减去x属于1的概率)。所以不管y是0还是1,上面得到的数,都是(x, y)出现的概率。那我们的整个样本集,也就是n个独立的样本出现的似然函数为(因为每个样本都是独立的,所以n个样本出现的概率就是他们各自出现的概率相乘):

然后我们的目标是求出使这一似然函数的值最大的参数估计,最大似然估计就是求出参数,使得

取得最大值,对函数取对数得到
 

这时候,用L(θ)对θ求导,得到:

1.1.2 梯度下降算法


θ更新过程: 
 

θ更新过程可以写成:
 

向量化Vectorization
Vectorization是使用矩阵计算来代替for循环,以简化计算过程,提高效率。
如上式,Σ(...)是一个求和的过程,显然需要一个for语句循环m次,所以根本没有完全的实现vectorization。
下面介绍向量化的过程:
约定训练数据的矩阵形式如下,x的每一行为一条训练样本,而每一列为不同的特称取值:

g(A)的参数A为一列向量,所以实现g函数时要支持列向量作为参数,并返回列向量。由上式可知
Spark MLlib中的逻辑回归算法是一种有监督的分类算法,它可以用于元分类和多元分类。下面是一个简单的演示例子: ```python from pyspark.ml.classification import LogisticRegression from pyspark.ml.evaluation import MulticlassClassificationEvaluator from pyspark.ml.feature import VectorAssembler from pyspark.sql import SparkSession # 创建SparkSession spark = SparkSession.builder.appName("LogisticRegressionExample").getOrCreate() # 加载数据 data = spark.read.format("libsvm").load("data/mllib/sample_libsvm_data.txt") # 将特征向量组装成一个向量 assembler = VectorAssembler(inputCols=data.columns[1:-1], outputCol="features") data = assembler.transform(data).select("features", "label") # 将数据集分为训练集和测试集 (trainingData, testData) = data.randomSplit([0.7, 0.3], seed=1234) # 创建逻辑回归模型 lr = LogisticRegression(maxIter=10, regParam=0.3, elasticNetParam=0.8) # 训练模型 model = lr.fit(trainingData) # 预测测试集 predictions = model.transform(testData) # 评估模型 evaluator = MulticlassClassificationEvaluator(predictionCol="prediction") accuracy = evaluator.evaluate(predictions) print("Test Error = %g" % (1.0 - accuracy)) # 关闭SparkSession spark.stop() ``` 在这个例子中,我们首先使用`VectorAssembler`将特征向量组装成一个向量,然后将数据集分为训练集和测试集。接着,我们创建一个逻辑回归模型,并使用训练训练模型。最后,我们使用测试集对模型进行评估,并输出测试误差。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值