我不确定我是否正确掌握了如何检查ML模型是否过拟合:我在线性回归模型上使用交叉验证(3倍)。
没有交叉验证,我在训练测试分组中的 r2 是r2 = 0.9896363826463499
,而我的 RMSE 是rmse = 379.5375558287131
交叉验证:r2 = 0.9896363815481128
和rmse = 379.5375759385925
我的数据集每1.17亿行有136列,因此我希望获得很好的 r2 得分,但是我不确定我是否真的过度拟合了模型...如何评估是过度拟合还是非常精确?
PS。我有136列,因为我必须为其中一个具有128个唯一值的列创建虚拟特征,因此我认为所有这些列都是非常必要的...
这是我的数据框架构(使用pySpark): PPS。只是作为含义的简要背景,我试图预测标签,这是公共汽车在公交车站的到达时间( STOPPOINTID )。 rhum 之后的所有列都是虚拟特征(每条总线对应一个)。
root
|-- MONTHOFSERVICE: integer (nullable = true)
|-- STOPPOINTID: integer (nullable = true)
|-- label: integer (nullable = true)
|-- WEEKDAY: integer (nullable = true)
|-- rain: float (nullable = true)
|-- temp: float (nullable = true)
|-- wetb: float (nullable = true)
|-- rhum: float (nullable = true)
|-- .....
...
这就是我训练和拟合模型的方式:
train_data,test_data = final_data.randomSplit([0.7,0.3])
lr = LinearRegression()
lr_model = lr.fit(train_data)
交叉验证:
lr = LinearRegression(maxIter=3)
modelEvaluator=RegressionEvaluator()
pipeline = Pipeline(stages=[lr])
paramGrid = ParamGridBuilder().addGrid(lr.regParam, [0.1, 0.01]).addGrid(lr.elasticNetParam, [0, 1]).build()
crossval = CrossValidator(estimator=pipeline,
estimatorParamMaps=paramGrid,
evaluator=modelEvaluator,
numFolds=3)
cvModel = crossval.fit(train_data)