如何在DataFrame中跨组使用LinearRegression?

时间:2017-05-03 21:18:55

标签: dataframe pyspark apache-spark-sql apache-spark-mllib

让我们说我的spark DataFrame(DF)看起来像

id | age | earnings| health 
----------------------------
1  | 34  | 65      | 8
2  | 65  | 12      | 4
2  | 20  | 7       | 10
1  | 40  | 75      | 7
.  | ..  | ..      | ..

我想将DF分组,应用一个函数(比如线性的) 回归取决于​​多列 - 在这种情况下是两列 - 对每个聚合DF进行聚合DF),得到输出

id | intercept| slope 
----------------------
1  |   ?      |  ? 
2  |   ?      |  ? 
from sklearn.linear_model import LinearRegression
lr_object = LinearRegression()

def linear_regression(ith_DF):
    # Note: for me it is necessary that ith_DF should contain all 
    # data within this function scope, so that I can apply any 
    # function that needs all data in ith_DF

    X = [i.earnings for i in ith_DF.select("earnings").rdd.collect()]
    y = [i.health for i in ith_DF.select("health").rdd.collect()]

    lr_object.fit(X, y)
    return lr_object.intercept_, lr_object.coef_[0]

coefficient_collector = []

# following iteration is not possible in spark as 'GroupedData' 
# object is not iterable, please consider it as pseudo code

for ith_df in df.groupby("id"): 
    c, m = linear_regression(ith_df)
    coefficient_collector.append((float(c), float(m)))

model_df = spark.createDataFrame(coefficient_collector, ["intercept", "slope"])
model_df.show()

2 个答案:

答案 0 :(得分:0)

我要做的是filter主DataFrame创建较小的DataFrame并进行处理,比如线性回归。

然后,您可以并行执行线性回归(在使用相同SparkSession线程安全的单独线程上)并缓存主DataFrame。

这应该会给你Spark的全部力量。

P.S。我对Spark部分的有限理解使我认为Spark MLlib中的grid search-based model selectionTensorFrames使用了非常相似的方法,即“Scala和Apache Spark的实验性TensorFlow绑定”。

答案 1 :(得分:0)

我认为这可以使用pandas_UDF从Spark 2.3开始。事实上,有一个例子可以在pandas_UDFs的公告中拟合分组回归:

Introducing Pandas UDF for Python