Как получить линейный результат линейной регрессии в Pyspark? - PullRequest
0 голосов
/ 26 октября 2018

Я запускаю простую линейную регрессию на очень маленьком наборе данных с использованием Pyspark, но не могу заставить его вернуть прямолинейный результат, как это происходит в scikit-learn, keras и tenorflow.Я пробовал сотни параметров и настроек с помощью поиска гиперпараметров.(Мой код ниже).Я также пытался использовать 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

Тем не менее, используя scikit-learn и keras и tenorflow для одних и тех же данных,все дают мне прямой результат.LinearRegression работает по-другому в Pyspark, или я делаю что-то не так?Любая помощь очень ценится.

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Я подозреваю, что проблема связана с тем, что вы генерируете dataset2. Вы начинаете со списка кортежей, что нормально, а в цикле for вы создаете плотный массив для значений y.

Но sklearn docs , состояние только разреженных массивов, и Spark docs заявляют, что он ожидает списки Python или массивы numpy.

Я бы упростил генерацию набора данных в простые массивы и повторил бы попытку.

0 голосов
/ 26 октября 2018

Похоже, что точки выводятся в неудачном порядке.Может ли решение быть простым, как сортировка?

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