Spark.ml - -逻辑回归LogisticRegression

﹥>﹥吖頭↗ 提交于 2020-01-19 04:00:07

前言

      逻辑回归的本质是线性回归,只是在特征到结果的过程上加上了一层映射。即首先需要把特征进行求和,然后将求和后的结果应用于一个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实现

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!