如何使用 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()
我从使用 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()