我正在使用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)
这给了我这个结果。
但是,在同一数据上使用scikit-learn和keras以及tensorflow,所有这些都为我提供了直线结果。 LinearRegression在Pyspark中的工作方式是否有所不同,还是我做错了什么?很感谢任何形式的帮助。
答案 0 :(得分:1)
看起来像点以不幸的顺序输出。解决方案可以像排序一样简单吗?
from pyspark.sql.functions import col
fullPredictions.sort(col("features")).show()
答案 1 :(得分:0)
我怀疑问题出在您生成dataset2
的方式上。您可以从一个元组列表开始,这很好,并且在for
循环中,您将为y值创建一个密集数组。
但是sklearn docs仅声明稀疏数组,而Spark docs则声明需要Python列表或numpy数组。
我将数据集的生成简化为简单的数组,然后重试。