【问题标题】:random forest with spark: get predicted values and R²带火花的随机森林:获取预测值和 R²
【发布时间】:2016-01-15 08:39:47
【问题描述】:

我正在使用MLlibspark 来执行regression random forest

我在这里使用python 代码: https://spark.apache.org/docs/1.2.0/mllib-ensembles.html#tab_python_1

它有效,但现在我想获得预测模型的 predicted values 以及 R。 如何获得?

【问题讨论】:

  • 你要预测模型的决定系数吗?
  • 决定系数 () 或相关系数 (R),两者中的任何一个。事实上,如果我得到predicted values 的列表,我可以用公式计算它
  • 没有直接的方法可以直接从 spark 中获取,你必须计算它
  • 好的。 predicted values 呢?如何得到它们?我想将realpredicted values存储在一个csv文件中。
  • 将您的训练数据 RDD 映射/减少为(真实,预测值)的 RDD,然后您可以保存 RDD。这是一个非常基本的操作。

标签: python-3.x apache-spark random-forest prediction


【解决方案1】:

以下是如何将csv 文件保存为RDD(spark 数据格式):

# Imports
import csv
try:
    from StringIO import StringIO
except ImportError:
    from io import StringIO
from collections import namedtuple
from operator import add, itemgetter
from pyspark import SparkConf, SparkContext
from pyspark.mllib.tree import RandomForest, RandomForestModel
from pyspark.mllib.util import MLUtils
from pyspark.mllib.linalg import SparseVector
from pyspark.mllib.regression import LabeledPoint
import shutil
import numpy

def parse(row):
    """
    Parses a row and returns a named tuple.
    """
    row[0]  = str(row[0])
    row[1]  = float(row[1])
    row[2]  = float(row[2])
    row[3]  = float(row[3])
    row[4]  = float(row[4])
    return LabeledPoint(row[4], row[:4])    


def split(line):
    """
    Operator function for splitting a line with csv module
    """
    reader = csv.reader(StringIO(line), delimiter=';')
    return next(reader)

#save csv file on a spark cluster (RDD format)
data = sc.textFile("datafile").map(split).map(parse)

这里是如何执行随机森林算法以及如何获得预测值:

def random_forest_regression(data):
    """
    Run the random forest (regression) algorithm on the data to perform the prediction
    """
    # Split the data into training and test sets (30% held out for testing)
    (trainingData, testData) = data.randomSplit([0.7, 0.3])

    model = RandomForest.trainRegressor(trainingData, categoricalFeaturesInfo={}, numTrees=100, featureSubsetStrategy="auto", impurity='variance', maxDepth=10, maxBins=32)
    #increase number of trees to have a better prediction

    # Evaluate model on TEST instances and compute test error
    predictions_test = model.predict(testData.map(lambda x: x.features))
    real_and_predicted_test = testData.map(lambda lp: lp.label).zip(predictions_test)

    #get the list of real and predicted values FOR ALL THE POINTS
    predictions = model.predict(data.map(lambda x: x.features))
    real_and_predicted = data.map(lambda lp: lp.label).zip(predictions)
    real_and_predicted=real_and_predicted.collect()
    print("real and predicted values")
    for value in real_and_predicted:
        print(value)

    return model, real_and_predicted

为了获得correlation coefficientR 值),我使用了numpy

def compute_correlation_coefficient(real_and_predicted):
    """
    compute and display the correlation coefficient from a list of real and predicted values
    """
    list1=[]
    list2=[]
    for tuple in real_and_predicted:
        list1.append(tuple[0])
        list2.append(tuple[1])
    print("correlation coefficient")
    print(numpy.corrcoef(list1, list2)[0, 1])

要获得,请取correlation coefficient 的平方值。

瞧!

【讨论】:

    猜你喜欢
    • 2019-05-04
    • 2016-10-26
    • 2021-03-21
    • 2014-08-07
    • 2019-07-22
    • 2019-01-22
    • 2014-08-17
    • 2021-07-12
    相关资源
    最近更新 更多