如何使用MLlib运行此决策树?

时间:2017-07-30 20:34:26

标签: python apache-spark machine-learning pyspark apache-spark-mllib

我来自使用Scikit - 学习运行ML算法,因此MLlib相当新。话虽如此,我在最近的一次演讲中确实和Cloudera的github一起玩,我留下了一个问题。

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

然后我有一个二进制列表,(0 = apple,1 = orange)。当我使用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和标签传递给这些参数,但它引发了一个错误。

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

1 个答案:

答案 0 :(得分:1)

你应该使用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()