如何在Pyspark中获得直线线性回归结果?

时间:2018-10-26 15:36:02

标签: machine-learning pyspark data-science

我正在使用Pyspark在一个非常小的数据集上运行简单的线性回归,但是却无法像scikit-learn,keras和tensorflow那样返回直线结果。我已经使用超参数搜索尝试了数百种参数和设置。 (我的代码如下)。我也尝试过使用LinearRegressionWithSGD并获得相同的结果。我所需要的只是一条直线结果。我如何在Pyspark获得此?

def plotData(xs, ys, predictions, labels, the_title):
    y_preds = list( (predictions.collect()) )
    x_labels = list( (labels.collect()) )
    print('xs = ', xs)
    print('ys = ', ys)
    print('y_predictions = ' , y_preds)

    # Plot outputs
    plt.figure(figsize=(8,5))    
    plt.axis([min(xs)-1, max(xs)+1, min(ys)-1, max(ys)+1])  
    plt.title(the_title)
    plt.scatter(x_labels, ys, color='blue')
    plt.plot(x_labels, y_preds, 'rx')
    plt.plot(x_labels, y_preds, color='black', linewidth=3)
    plt.xlabel('x values', fontsize=14)
    plt.ylabel('y values', fontsize=14)
    plt.show()

# Small contrived dataset
dataset = [(1, 1), (2, 3), (4, 3), (3, 2), (5, 5)]

dataset2 = []
xs = []
ys = []
for d in dataset:
    xs.append(d[0])
    ys.append(d[1])
    dataset2.append((d[0], Vectors.dense([d[1]])))

spark = SparkSession.builder.appName("LinearRegTest").getOrCreate()
df = spark.createDataFrame(dataset2, ["label", "features"])  

i=100 
r=0.3
e=0.8
s='auto'
f=True

# Create linear regression model
lir = LinearRegression(maxIter=i, regParam=r, elasticNetParam=e, solver=s, fitIntercept=f)

# Train the model using our training data
model = lir.fit(df) 

# Generate some predictions using our model 
fullPredictions = model.transform(df).cache()

# Extract the predictions and the "known" correct labels.
predictions = fullPredictions.select("prediction").rdd.map(lambda x: x[0])
labels = fullPredictions.select("label").rdd.map(lambda x: x[0])

print("Coefficients: " + str(model.coefficients))
print("Intercept: " + str(model.intercept))
print("Total iterations: " + str(model.summary.totalIterations))  
paramStr = "maxIter="+str(i)+", regParam="+str(r)+", elasticNetParam="+str(e) +", solver="+str(s)+", fitIntercept="+str(f)   

plotData(xs, ys, predictions, labels, "Contrived Dataset: LinearRegression CHART " + "\n" + paramStr)

这给了我这个结果。

Pyspark output

但是,在同一数据上使用scikit-learn和keras以及tensorflow,所有这些都为我提供了直线结果。 LinearRegression在Pyspark中的工作方式是否有所不同,还是我做错了什么?很感谢任何形式的帮助。

2 个答案:

答案 0 :(得分:1)

看起来像点以不幸的顺序输出。解决方案可以像排序一样简单吗?

from pyspark.sql.functions import col
fullPredictions.sort(col("features")).show()

答案 1 :(得分:0)

我怀疑问题出在您生成dataset2的方式上。您可以从一个元组列表开始,这很好,并且在for循环中,您将为y值创建一个密集数组。

但是sklearn docs仅声明稀疏数组,而Spark docs则声明需要Python列表或numpy数组。

我将数据集的生成简化为简单的数组,然后重试。