我之前使用Scikit-learn来运行机器学习算法,所以MLlib对我来说是比较新的。尽管如此,我确实尝试了Cloudera最近一次演讲中的github项目,并留下了疑问。
假设我使用决策树进行二元分类。我想预测一个物体是苹果还是橙子。特征部分的两个参数是一个列表[x(浮点数), y(二元)]。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和labels传递给这些参数,但抛出了错误。
我的问题是,有没有办法像我在Scikit-learn中那样,使用这两个列表在MLlib中运行机器学习算法?任何帮助都将不胜感激!
回答:
你应该使用ML(即基于DataFrame的API)而不是MLlib,因为后者即将被弃用。
spark.version# u'2.2.0'from pyspark.ml.linalg import Vectorsfrom pyspark.ml.classification import DecisionTreeClassifierfeatures_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)# 在训练集上进行预测model.transform(df).show() # 在Spark ML中使用'transform'而不是'predict'# +-----+-----------+-------------+-----------+----------+# |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| # +-----+-----------+-------------+-----------+----------+# 在测试集上进行预测: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, SparkConffrom pyspark.sql import SparkSessionconf = SparkConf()sc = SparkContext(conf=conf)spark = SparkSession.builder.config(conf=conf).getOrCreate()