sklean和pySpark实现:逻辑回归 LogisticRegression

前言

      原理部分请看另一篇博客:深入机器学习:Logistic回归

① python.sklearn API

    文档:http://scikit-learn.sourceforge.net/dev/modules/generated/sklearn.linear_model.LogisticRegression.html

sklean和pySpark实现:逻辑回归 LogisticRegression_第1张图片

参数

    ● penalty:指定(对数)似然函数中加入的正则化项,默认为L2

    ● c:指定正则化项的权重,是正则化项惩罚项系数的倒数,c越小,正则化项越大

    ● fit_intercept:选择是否计算偏置常数b,默认是True

    ● class_weight:指定各类别的权重,默认为 None,表示每个类别的权重都是1。当数据的正负样本不平衡比较明显时,可以考虑设为 balanced,表示每个类别的权重与该类别在样本集中出现的频率成反比。
    ● solver:指定求解最优化问题的算法,默认为liblinear(内部使用了坐标轴下降法),适用于数据集较小的情况。当数据集较大时,可使用 sag(随机平均梯度下降法)。另外,还可使用newton-cg(牛顿法)和lbfgs(拟牛顿法)。注意:newton-cg、lbfgs和sag这三种优化算法时都需要损失函数的一阶或者二阶连续导数,因此不能用于没有连续导数的L1正则化,只能用于L2正则化。而liblinear通吃L1正则化和L2正则化。
    ● max_iter:设定最大迭代次数。
    ● tol:设定判断迭代收敛的阈值,默认为0.0001。
    ● multi_class:指定多分类的策略,默认是ovr,表示采用one-vs-rest,即一对其他策略;还可选择multinomial,表示直接采用多项Logistic回归策略。
    ● dual:选择是否采用对偶方式求解,默认为False。注意,只有在penalty='l2'且solver='liblinear’时存在对偶形式。
    ● warm_start:设定是否使用前一次训练的结果继续训练,默认为 False,表示每次从头开始训练。
    ● n_jobs:指定计算机并行工作时的 CPU 核数,默认是1。如果选择-1,则表示使用所有可用的CPU核。

② 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)

sklean和pySpark实现:逻辑回归 LogisticRegression_第2张图片

参考

      啊ashang 原文: 逻辑回归算法原理

      李小文 原文:逻辑回归的原理及Python实现

你可能感兴趣的:(#,Spark)