我可以使用带有稀疏向量的数据帧来进行交叉验证调整吗?
Can i use dataframe with sparse vector to do cross-validation tuning?
我正在训练我的多层感知器分类器。这是我的训练 set.The 特征采用稀疏向量格式。
df_train.show(10,False)
+------+---------------------------+
|target|features |
+------+---------------------------+
|1.0 |(5,[0,1],[164.0,520.0]) |
|1.0 |[519.0,2723.0,0.0,3.0,4.0] |
|1.0 |(5,[0,1],[2868.0,928.0]) |
|0.0 |(5,[0,1],[57.0,2715.0]) |
|1.0 |[1241.0,2104.0,0.0,0.0,2.0]|
|1.0 |[3365.0,217.0,0.0,0.0,2.0] |
|1.0 |[60.0,1528.0,4.0,8.0,7.0] |
|1.0 |[396.0,3810.0,0.0,0.0,2.0] |
|1.0 |(5,[0,1],[905.0,2476.0]) |
|1.0 |(5,[0,1],[905.0,1246.0]) |
+------+---------------------------+
首先,我想在保留方法上评估我的估算器,这是我的代码:
from pyspark.ml.classification import MultilayerPerceptronClassifier
from pyspark.ml.evaluation import MulticlassClassificationEvaluator
layers = [4, 5, 4, 3]
trainer = MultilayerPerceptronClassifier(maxIter=100, layers=layers, blockSize=128, seed=1234)
param = trainer.setParams(featuresCol = "features",labelCol="target")
train,test = df_train.randomSplit([0.8, 0.2])
model = trainer.fit(train)
result = model.transform(test)
evaluator = MulticlassClassificationEvaluator(
labelCol="target", predictionCol="prediction", metricName="accuracy")
print("Test set accuracy = " + str(evaluator.evaluate(result)))
但结果是错误:无法执行用户定义的函数($anonfun$1: (vector) => double)。这是因为我的向量中有稀疏向量吗功能?我能做什么?
对于交叉验证部分,我编码如下:
X=df_train.select("features").collect()
y=df_train.select("target").collect()
from sklearn.model_selection import cross_val_score,KFold
k_fold = KFold(n_splits=10, random_state=None, shuffle=False)
print(cross_val_score(trainer, X, y, cv=k_fold, n_jobs=1,scoring="accuracy"))
我得到:它似乎不是一个 scikit-learn 估计器,因为它没有实现 'get_params' 方法。
但是当我查找文档时,我没有找到 get_params method.Can 有人帮助我吗?
你的问题有很多问题...
关注第二部分(实际上是一个单独的问题),错误消息声明,即
it does not seem to be a scikit-learn estimator
确实是正确的,因为您在 scikit-learn 方法 cross_val_score
中将 PySpark ML 中的 MultilayerPerceptronClassifier
用作 trainer
(它们是 而不是 兼容)。
此外,您的第二个代码片段根本不像 PySpark,而是类似于 scikit-learn:当您正确使用第一个代码片段中的输入时(single 2 -column dataframe,一列中有特征,另一列中有 labels/targets),你似乎忘记了第二个片段中的这一课,在那里你构建了单独的数据框 X
和 y
用于分类器的输入(在 scikit-learn 中应该是这种情况,但在 PySpark 中不是)。有关正确用法的简单示例,请参阅 CrossValidator
docs。
从更一般的角度来看:如果你的数据适合主内存(即你可以 collect
它们就像你的简历一样),绝对没有理由去打扰Spark ML,如果使用 scikit-learn,你会好得多。
--
关于第一部分:您显示的数据似乎只有 2 个标签 0.0/1.0
;我不能确定(因为你只显示 10 条记录),但如果你确实只有 2 个标签,你不应该使用 MulticlassClassificationEvaluator
但 BinaryClassificationEvaluator
- 但是,没有 metricName="accuracy"
选项... [编辑:排除万难,似乎 MulticlassClassificationEvaluator
确实也可以用于二进制分类,并且它是获得准确性的便捷方法,而二进制对应物没有提供!]
但这不是你得到这个错误的原因(顺便说一句,这与 evaluator
无关 - 你用 result.show()
或 result.collect()
得到它);错误的原因是您的第一层(layers[0]
)中的节点数为 4,而您的输入向量显然是 5 维的。来自 docs:
Number of inputs has to be equal to the size of feature vectors
将 layers[0]
更改为 5 可解决问题(未显示)。同样,如果你确实只有 2 类,你也应该将 layers[-1]
更改为 2(如果你不这样做,你不会得到错误,但它从分类中没有多大意义观点)。
我正在训练我的多层感知器分类器。这是我的训练 set.The 特征采用稀疏向量格式。
df_train.show(10,False)
+------+---------------------------+
|target|features |
+------+---------------------------+
|1.0 |(5,[0,1],[164.0,520.0]) |
|1.0 |[519.0,2723.0,0.0,3.0,4.0] |
|1.0 |(5,[0,1],[2868.0,928.0]) |
|0.0 |(5,[0,1],[57.0,2715.0]) |
|1.0 |[1241.0,2104.0,0.0,0.0,2.0]|
|1.0 |[3365.0,217.0,0.0,0.0,2.0] |
|1.0 |[60.0,1528.0,4.0,8.0,7.0] |
|1.0 |[396.0,3810.0,0.0,0.0,2.0] |
|1.0 |(5,[0,1],[905.0,2476.0]) |
|1.0 |(5,[0,1],[905.0,1246.0]) |
+------+---------------------------+
首先,我想在保留方法上评估我的估算器,这是我的代码:
from pyspark.ml.classification import MultilayerPerceptronClassifier
from pyspark.ml.evaluation import MulticlassClassificationEvaluator
layers = [4, 5, 4, 3]
trainer = MultilayerPerceptronClassifier(maxIter=100, layers=layers, blockSize=128, seed=1234)
param = trainer.setParams(featuresCol = "features",labelCol="target")
train,test = df_train.randomSplit([0.8, 0.2])
model = trainer.fit(train)
result = model.transform(test)
evaluator = MulticlassClassificationEvaluator(
labelCol="target", predictionCol="prediction", metricName="accuracy")
print("Test set accuracy = " + str(evaluator.evaluate(result)))
但结果是错误:无法执行用户定义的函数($anonfun$1: (vector) => double)。这是因为我的向量中有稀疏向量吗功能?我能做什么?
对于交叉验证部分,我编码如下:
X=df_train.select("features").collect()
y=df_train.select("target").collect()
from sklearn.model_selection import cross_val_score,KFold
k_fold = KFold(n_splits=10, random_state=None, shuffle=False)
print(cross_val_score(trainer, X, y, cv=k_fold, n_jobs=1,scoring="accuracy"))
我得到:它似乎不是一个 scikit-learn 估计器,因为它没有实现 'get_params' 方法。 但是当我查找文档时,我没有找到 get_params method.Can 有人帮助我吗?
你的问题有很多问题...
关注第二部分(实际上是一个单独的问题),错误消息声明,即
it does not seem to be a scikit-learn estimator
确实是正确的,因为您在 scikit-learn 方法 cross_val_score
中将 PySpark ML 中的 MultilayerPerceptronClassifier
用作 trainer
(它们是 而不是 兼容)。
此外,您的第二个代码片段根本不像 PySpark,而是类似于 scikit-learn:当您正确使用第一个代码片段中的输入时(single 2 -column dataframe,一列中有特征,另一列中有 labels/targets),你似乎忘记了第二个片段中的这一课,在那里你构建了单独的数据框 X
和 y
用于分类器的输入(在 scikit-learn 中应该是这种情况,但在 PySpark 中不是)。有关正确用法的简单示例,请参阅 CrossValidator
docs。
从更一般的角度来看:如果你的数据适合主内存(即你可以 collect
它们就像你的简历一样),绝对没有理由去打扰Spark ML,如果使用 scikit-learn,你会好得多。
--
关于第一部分:您显示的数据似乎只有 2 个标签 0.0/1.0
;我不能确定(因为你只显示 10 条记录),但如果你确实只有 2 个标签,你不应该使用 MulticlassClassificationEvaluator
但 BinaryClassificationEvaluator
- 但是,没有 metricName="accuracy"
选项... [编辑:排除万难,似乎 MulticlassClassificationEvaluator
确实也可以用于二进制分类,并且它是获得准确性的便捷方法,而二进制对应物没有提供!]
但这不是你得到这个错误的原因(顺便说一句,这与 evaluator
无关 - 你用 result.show()
或 result.collect()
得到它);错误的原因是您的第一层(layers[0]
)中的节点数为 4,而您的输入向量显然是 5 维的。来自 docs:
Number of inputs has to be equal to the size of feature vectors
将 layers[0]
更改为 5 可解决问题(未显示)。同样,如果你确实只有 2 类,你也应该将 layers[-1]
更改为 2(如果你不这样做,你不会得到错误,但它从分类中没有多大意义观点)。