我来自使用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一起使用来学习?任何帮助都会很棒!
答案 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()