spark评估模型-考虑事项

背景

使用spark ml构建好模型后,还有一个很重要的指标是如何评估模型,怎么证明构建好的模型是好的还是差的?都有哪些点需要考虑?本文就来谈一谈这个问题

评估模型注意点

我们以评估线性模型评估作为例子,我们想看下评估线性模型的常用的两个评估指标:
一.均方根误差
假设我们训练好了一个线性模型,通过模型预测出来的结果是’y-预测值’,实际的标签值是’y-真实值’,那么均方误差=(1/N)*(求和([‘y-预测值’ - ‘y-真实值’])^2),均方根误差=均方误差开根号
这个可以代表真实值和预测值的误差程度的一个指标,一般情况下,模型预测出来的一个这个指标值是看不出好和坏的,比如这个指标是=100,那这个模型是好还是坏呢?我们并不知道,所以我们需要一个基线版本来比较,那么使用什么基线版本呢?我们一般就是以直接预测为均值来算出均方根误差,然后使用模型计算的均方根误差和预测为均值得到的均方根误差作为对比,这样我们才可以知道模型的效果相对于直接预测为均值的好坏,我们可以直接使用spark先算出直接预测为均值的均方根误差:代码如下:

from pyspark import SparkConf
from pyspark.sql import SparkSession
import traceback
from pyspark.sql.types import *
from pyspark.sql.functions import *
from pyspark.ml.regression import IsotonicRegression


appname = "test"  # 任务名称
master = "local"  # 单机模式设置
'''
local: 所有计算都运行在一个线程当中,没有任何并行计算,通常我们在本机执行一些测试代码,或者练手,就用这种模式。
local[K]: 指定使用几个线程来运行计算,比如local[4]就是运行4个worker线程。通常我们的cpu有几个core,就指定几个线程,最大化利用cpu的计算能力
local[*]: 这种模式直接帮你按照cpu最多cores来设置线程数了。
'''
# spark_driver_host = "10.0.0.248"

try:
    # conf = SparkConf().setAppName(appname).setMaster(master).set("spark.driver.host", spark_driver_host) # 集群
    conf = SparkConf().setAppName(appname).setMaster(master)  # 本地
    spark = SparkSession.builder.config(conf=conf).getOrCreate()

    from pyspark.sql import SparkSession
    from pyspark.sql import functions as F
    from pyspark.sql.functions import udf
    from pyspark.sql.types import *

    spark = SparkSession.builder.appName('basemodel').master('local').getOrCreate()

    from pyspark.sql.functions import avg, lit
    datapath = '''D://spark/spark/spark-2.3.0-bin-hadoop2.7/data/mllib/''';
    filePath = datapath + "databricks-datasets/learning-spark-v2/sf-airbnb/sf-airbnb-clean.parquet"
    airbnbDF = spark.read.parquet(filePath)
    (trainDF, testDF) = airbnbDF.randomSplit([.8, .2], seed=42)

    avgPrice = float(trainDF.select(avg("price")).first()[0])
    predDF = testDF.withColumn("avgPrediction", lit(avgPrice))
    predDF.show(5, False)

    from pyspark.ml.evaluation import RegressionEvaluator

    regressionMeanEvaluator = RegressionEvaluator(predictionCol="avgPrediction", labelCol="price", metricName="rmse")

    print(f"The RMSE for predicting the average price is: {regressionMeanEvaluator.evaluate(predDF):.2f}")
    spark.stop()
    print('计算成功!')
except:
    traceback.print_exc()  # 返回出错信息
    print('连接出错!')

二.R方
R方这个指标可以直接表示模型的效果和预测为均值的预测效果之间的好坏程度,公式为R方=1-(SS1/SS2),其中SS1表示模型的预测出来的误差平方和,SS2表示假设都是预测为均值时的误差平方和,由公式可知,如果模型预测的效果完全和实际值一样,那么R方的值就是1,表示此时模型是完美的(当然先排除掉过拟合导致的情况),如果模型的预测结果和预测为均值的预测结果是一样的情况的话,R方的值=0,此时相当于模型的预测效果和直接取均值时一样了,最糟糕的情况是R方为负数,这表示模型预测的效果甚至都没有直接预测为均值来得好,使用这个指标的好处是通过指标值就可以知道模型的预测效果和预测为均值的基线版本的差距

PS: 有人就问了,如果是分类问题要如何确定基线呢,我们可以直接把预测值预测为最常见的分类类型作为基线,这样这个直接预测为最常见的分类类型的模型也会得到一个预测的准确率,这个预测的准确率再和模型预测准确率进行对比即可,不过对于分类问题,我们还有另一个ROC指标来评估模型

总结

对训练好的模型进行评估时,我们总是要和某个基线作为对比,这个基线可以直接是用均值作为预测值来计算出来的指标,也可以类似R方这种隐藏在了评估指标中的,但是无论哪种情况,我们都需要对比基线和我们模型预测值,只有对比才能知道我们的模型效果到底如何.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值