почему моя модель линейной регрессии pyspark всегда выбирает самые маленькие параметры как лучшую модель? - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь использовать pyspark для запуска линейной регрессии с перекрестной проверкой.Но есть кое-что, чего я не понимаю: моя модель всегда выбирает модель с наименьшими параметрами как лучшую модель.

Я загружаю данные из https://vincentarelbundock.github.io/Rdatasets/datasets.html. Существует набор данных, называемый SLID.

enter image description here

Это выглядит так:

enter image description here

Я удаляюпервая колонка, колонка пол и язык.Затем я удаляю строки с NA.Затем я изменил имена столбцов.В итоге данные выглядят так:

enter image description here

Тогда вот мой код:

import findspark
findspark.init()
import pyspark
from pyspark.sql import SparkSession
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from pyspark.ml.linalg import Vectors
from pyspark.ml.feature import VectorAssembler
from pyspark.ml.classification import LogisticRegression
from pyspark.ml.regression import LinearRegression
from pyspark.sql.functions import col
from pyspark.ml.evaluation import RegressionEvaluator
from pyspark.ml.tuning import CrossValidator, ParamGridBuilder

spark=SparkSession.builder.getOrCreate()
#please change it to your own path
df = spark.read.csv("/home/feng/Downloads/SLID.csv",header=True)
df1=df

df1=df1.select(*(col(c).cast("float").alias(c) for c in df1.columns))
df1=df1.withColumnRenamed('x2','label')
assembler = VectorAssembler(
    inputCols=['x1','y1'],
    outputCol="features")
output = assembler.transform(df1)
output1=output.select(output.label,output.features)

output2=output1.randomSplit([0.3,0.7])
training=output2[0]
testing=output2[1]

lr = LinearRegression(maxIter=10, regParam=0.01)

paramGrid = ParamGridBuilder() \
    .addGrid(lr.maxIter, [1,2,5,10,20]) \
    .addGrid(lr.regParam, [0.05,0.1, 0.3,0.5,0.7]) \
    .addGrid(lr.elasticNetParam, [0, 0.5, 1])\
    .build()

crossval = CrossValidator(estimator=lr,
                          estimatorParamMaps=paramGrid,                                 
  evaluator=RegressionEvaluator(predictionCol="prediction",labelCol="label",
                               metricName="rmse"),
                      numFolds=5)  # use 3+ folds in practice


# Run cross-validation, and choose the best set of parameters.
cvModel = crossval.fit(training)

a=cvModel.bestModel.extractParamMap()
for keys,values in a.items():
    print(keys)
    print(values)

Тогда у меня естьрезультат, подобный этому:

LinearRegression_a0560f768ad8__labelCol
label
LinearRegression_a0560f768ad8__aggregationDepth
2
LinearRegression_a0560f768ad8__epsilon
1.35
LinearRegression_a0560f768ad8__standardization
True
LinearRegression_a0560f768ad8__maxIter
1
LinearRegression_a0560f768ad8__regParam
0.1
LinearRegression_a0560f768ad8__loss
squaredError
LinearRegression_a0560f768ad8__predictionCol
prediction
LinearRegression_a0560f768ad8__solver
auto
LinearRegression_a0560f768ad8__tol
1e-06
LinearRegression_a0560f768ad8__featuresCol
features
LinearRegression_a0560f768ad8__elasticNetParam
0.0
LinearRegression_a0560f768ad8__fitIntercept
True

Этот результат является примером.Я на самом деле изменил много разных наборов параметров.Вы можете видеть в paramGrid, у меня есть три параметра, которые имеют разные значения: maxIter, regParam ,asticNetPParam.Независимо от того, какие значения я выберу, алгоритм просто дал мне лучшую модель с наименьшими используемыми параметрами.Я не думаю, что это правильно.Но я не могу понять, почему.

Может ли кто-нибудь объяснить мне это, объяснив, где я делаю ошибку и как пересмотреть?

...