如何使用 MLlib 运行 这个决策树?

How to run this Decision Tree with MLlib?

我从使用 Scikit-learn 到 运行 ML 算法,所以 MLlib 是相当新的。话虽这么说,但我确实在最近的一次演示中使用了 Cloudera 的 github,我还有一个问题。

假设我正在使用决策树进行二元分类。我想预测一个物体是苹果还是橙子。进入特征部分的两个参数属于列表 [x(float), y(binary)]。 X 表示物体的重量,y 表示 0 或 1(平滑或颠簸)。

然后我有一个也是二进制的列表,(0 = 苹果,1 = 橙色)。当我使用 Scikit-learn 时,我会把它们保存成这样:

features_list = [[140, 0], [150, 0], [160, 1], [170, 1]]
labels = [0, 0, 1, 1]

在此,每个标签0或1将对应于features_list中的项目。所以第一个 0 是特征 [140, 0] 等的标签

现在,当我开始训练我的模型时,我的代码如下所示:

clf = tree.DecisionTreeClassifier()
clf = clf.fit(ml_list, labels)

当我做出预测时,我会编写的代码如下所示:

print(clf.predict([180, 1])

看MLlib文档时,参数好像是'labelscol'和'featurescol'。我尝试将我的 ml_list 和标签传递给这些参数,但它抛出了一个错误。

我的问题是,有没有什么方法可以通过将这两个列表与 MLlib 一起使用来 运行 像我对 Scikit-learn 所做的那样的 ML 算法?任何帮助都会很棒!

您应该使用 ML(即基于 DataFrame 的 API)而不是 MLlib,因为后者是 deprecation

spark.version
# u'2.2.0'

from pyspark.ml.linalg import Vectors
from pyspark.ml.classification import DecisionTreeClassifier

features_list = [[140, 0], [150, 0], [160, 1], [170, 1]]
labels = [0, 0, 1, 1]

dd = [(labels[i], Vectors.dense(features_list[i])) for i in range(len(labels))]
dd
# [(0, DenseVector([140.0, 0.0])), 
#  (0, DenseVector([150.0, 0.0])), 
#  (1, DenseVector([160.0, 1.0])), 
#  (1, DenseVector([170.0, 1.0]))]

df = spark.createDataFrame(sc.parallelize(dd),schema=["label", "features"])

dt = DecisionTreeClassifier(maxDepth=2, labelCol="label")
model = dt.fit(df)

# predict on the training set
model.transform(df).show()  # 'transform' instead of 'predict' in Spark ML
# +-----+-----------+-------------+-----------+----------+
# |label|   features|rawPrediction|probability|prediction|      
# +-----+-----------+-------------+-----------+----------+
# |    0|[140.0,0.0]|    [2.0,0.0]|   [1.0,0.0]|      0.0|
# |    0|[150.0,0.0]|    [2.0,0.0]|   [1.0,0.0]|      0.0| 
# |    1|[160.0,1.0]|    [0.0,2.0]|   [0.0,1.0]|      1.0| 
# |    1|[170.0,1.0]|    [0.0,2.0]|   [0.0,1.0]|      1.0|     
# +-----+-----------+-------------+-----------+----------+

# predict on a test set:
test = spark.createDataFrame([(Vectors.dense(180, 1),)], ["features"])
model.transform(test).show() 
# +-----------+-------------+-----------+----------+
# |   features|rawPrediction|probability|prediction|
# +-----------+-------------+-----------+----------+ 
# |[180.0,1.0]|    [0.0,2.0]|  [0.0,1.0]|       1.0| 
# +-----------+-------------+-----------+----------+     

编辑:下面是初始化 Spark 的方法:

from pyspark import SparkContext, SparkConf
from pyspark.sql import SparkSession
conf = SparkConf()
sc = SparkContext(conf=conf)
spark = SparkSession.builder.config(conf=conf).getOrCreate()