前言
逻辑回归的本质是线性回归,只是在特征到结果的过程上加上了一层映射。即首先需要把特征进行求和,然后将求和后的结果应用于一个g(z)函数。g(z)可以将值映射到0或者是1上面。
逻辑函数又称Sigmoid函数,函数形式如下所示:
逻辑回归可以是二分类的,也可以是多分类的。
特点
优点:
1.便于理解和实现,可以观测样本的概率分数
2.训练速度快
3.由于经过了sigmoid函数的映射,对数据中小噪声的鲁棒性较好
4.不受多重共线性的影响(可通过正则化进行消除)
缺点:
1.容易欠拟合
2.特征空间很大时效果不好
3.由于sigmoid函数的特性,接近0/1的两侧概率变化较平缓,中间概率敏感,波动较大;导致很多区间特征变量的变化对目标概率的影响没有区分度,无法确定临界值。
原理
根据之前线性回归的经验,用MSE作为损失函数,但这个函数是非凸的,不可以用梯度下降来优化,因此极大似然估计闪亮登场,得到损失函数:交叉熵损失函数(cross-entropy loss)。更多损失函数详情请参阅:https://www.imooc.com/article/69668
pySpark API
class pyspark.ml.classification.
LogisticRegression
(featuresCol='features', labelCol='label', predictionCol='prediction', maxIter=100, regParam=0.0, elasticNetParam=0.0, tol=1e-06, fitIntercept=True, threshold=0.5, thresholds=None, probabilityCol='probability', rawPredictionCol='rawPrediction', standardization=True, weightCol=None, aggregationDepth=2, family='auto', lowerBoundsOnCoefficients=None, upperBoundsOnCoefficients=None, lowerBoundsOnIntercepts=None, upperBoundsOnIntercepts=None) Pyspark Documentation
- elasticNetParam:取值范围[0,1]。取 0时,采用L2。取 1时,采用L1正则化。
- thresholds:阈值在多类分类中调整预测每一类的概率。
- probabilityCol:预测类条件概率的列名。
- family:模型中使用的标签分布的描述。可选 auto | binomial | multinomial
- lowerBoundsOnCoefficients:在约束优化条件下拟合系数的下界
- upperBoundsOnCoefficients:在约束优化条件下拟合系数的上界
- lowerBoundsOnIntercepts:有界约束优化下截获的下界
- upperBoundsOnIntercepts:有界约束优化下截获的上界
案例
'''
内容:pyspark实现逻辑回归二元分类
版本:spark 2.4.4
数据:垃圾邮件数据
数据源:http://archive.ics.uci.edu/ml/datasets/Spambase
'''
from pyspark.sql import SparkSession
from pyspark.sql.functions import col
from pyspark.sql import functions
from pyspark.ml.feature import VectorAssembler
from pyspark.ml.classification import LogisticRegression
from pyspark.ml.evaluation import BinaryClassificationEvaluator,MulticlassClassificationEvaluator
from pyspark.ml import Pipeline
from pyspark.ml.tuning import ParamGridBuilder,CrossValidator
spark = SparkSession.builder.master("local").appName("LogisticRegression").getOrCreate()
data = spark.read.format("csv").option("header",True).load(u"D:\Data\Spam-Dataset\spambase.csv")
for i in data.columns:
data = data.withColumn(i, col(i).cast("Double")) # 将列类型转为数值类型
if i == "spam":
data = data.withColumnRenamed(i, "label") # 更改列名
trainingData, testData = data.randomSplit([0.8, 0.2])
featuresArray = data.columns[:-1]
assembler = VectorAssembler().setInputCols(featuresArray).setOutputCol("features")
# 创建逻辑回归模型
lr = LogisticRegression().setLabelCol("label").setFeaturesCol("features")
# 逻辑回归的流水线
lrPipeline = Pipeline().setStages([assembler,lr])
ParamGrid = ParamGridBuilder().addGrid(lr.maxIter,[8, 12, 15,18]).addGrid(lr.regParam,[0.001,0.005]).build()
# 二元分类评估
evaluator = BinaryClassificationEvaluator().setMetricName("areaUnderROC").setRawPredictionCol("rawPrediction").setLabelCol("label")
CV = CrossValidator().setEstimator(lrPipeline).setEvaluator(evaluator).setEstimatorParamMaps(ParamGrid).setNumFolds(3)
# 训练逻辑回归模型
model = CV.fit(trainingData)
# 预测逻辑回归的值
predictions = model.transform(testData)
# 输出目标值,预测值,预测概率
pre = predictions.select("label","prediction","probability").collect()
for item in pre:
print(item["label"],item["prediction"],item["probability"])
''' 最佳模型参数 '''
bestModel= model.bestModel
lrModel = bestModel.stages[1]
print("best regParam : ", lrModel.explainParam(lrModel.regParam))
print("best maxIter : ", lrModel.explainParam(lrModel.maxIter))
''' 评估模型之AUC '''
# 逻辑回归模型评估指标
AUC = evaluator.evaluate(predictions)
print("The Area Under ROC of LogisticRegression:",AUC)
''' 评估模型之准确率 '''
evaluatorX = MulticlassClassificationEvaluator().setMetricName("accuracy").setLabelCol("label")
ACC = evaluatorX.evaluate(predictions)
print("The Accuracy of LogisticRegression:",ACC)
参考
啊ashang 原文: 逻辑回归算法原理
李小文 原文:逻辑回归的原理及Python实现
来源:CSDN
作者:Yolkwwww
链接:https://blog.csdn.net/sinat_36226553/article/details/103994296