Machine learning 我可以使用带有稀疏向量的数据帧进行交叉验证调优吗?

Machine learning 我可以使用带有稀疏向量的数据帧进行交叉验证调优吗?,machine-learning,scikit-learn,pyspark,cross-validation,apache-spark-ml,Machine Learning,Scikit Learn,Pyspark,Cross Validation,Apache Spark Ml,我正在训练我的多层感知器分类器。这是我的训练集。这些特征是稀疏向量格式的 df_列车。显示10,错误 +---+--------------+ |目标|特征| +---+--------------+ |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

我正在训练我的多层感知器分类器。这是我的训练集。这些特征是稀疏向量格式的

df_列车。显示10,错误 +---+--------------+ |目标|特征| +---+--------------+ |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] | +---+--------------+ 首先,我想用暂缓法评估我的估计器,下面是我的代码:

从pyspark.ml.classification导入MultilayerPerceptronClassifier 从pyspark.ml.evaluation导入MultiClassificationEvaluator 层=[4,5,4,3] trainer=MultilayerPerceptronClassifiermaxIter=100,layers=layers,blockSize=128,seed=1234 param=trainer.setParamsfeaturesCol=features,labelCol=target 列车,测试=df_列车随机分离[0.8,0.2] model=trainer.fittrain 结果=模型试验 评估器=多类别评估器 labelCol=目标,predictionCol=预测,metricName=精度 打印测试集精度=+strevaluator.evaluateresult 但结果是错误:未能执行用户定义的函数$anonfun$1:vector=>double。这是因为我的特征中有稀疏向量吗?我能做什么

对于交叉验证部分,我编码如下:

X=df_train.selectfeatures.collect y=df_train.selecttarget.collect 从sklearn.model_选择导入交叉值,KFold k_fold=KFoldn_splits=10,random_state=None,shuffle=False printcross_val_Score Trainer,X,y,cv=k_fold,n_jobs=1,评分=准确度 我得到:它似乎不是一个scikit学习估计器,因为它没有实现“get_params”方法。
但是当我查找文档时,我没有找到get_params方法。有人能帮我吗?

您的问题有很多问题

关注第二部分实际上是一个单独的问题,错误消息声明,即

它似乎不是一个scikit学习估计器

确实是正确的,因为您在scikit学习方法cross_val_分数中使用PySpark ML的MultilayerPerceptronClassifier作为培训师,所以它们不兼容

此外,您的第二个代码段与PySpark完全不同,但与scikit learn类似:当您在第一个代码段中正确使用输入时,使用一个2列数据帧,其中一列中包含特性,另一列中包含标签/目标,您似乎忘记了第二个代码段中的这一课,在这里,您构建单独的数据帧X和y,用于输入分类器,这在scikit learn中应该是这样的,但在PySpark中不是这样的。有关正确用法的简单示例,请参见

从更一般的角度来看:如果您的数据适合于主存,即您可以像收集简历一样收集数据,那么绝对没有理由为Spark ML费心,使用scikit learn会更好

-

关于第一部分:您显示的数据似乎只有两个标签0.0/1.0;我不能确定,因为您只显示了10条记录,但如果您确实只有2个标签,则不应使用MultiClassificationEvaluator,但它没有metricName=Accurance选项。。。[编辑:尽管如此,似乎MultiClassificationEvaluator确实也可以用于二进制分类,这是一种获得精度的简便方法,而二进制对应项没有提供这种方法!]

但这并不是为什么会出现这个错误,顺便说一句,这个错误与评估器无关-您是通过result.show或result.collect得到的;错误的原因是第一层[0]中的节点数为4,而输入向量显然是5维的。从:

输入的数量必须等于特征向量的大小


将图层[0]更改为5可以解决未显示的问题。类似地,如果您确实只有2个类,那么您也应该将层[-1]更改为2。如果您没有,则不会出现错误,但从分类的角度来看,这没有多大意义。

非常感谢您,这表明第1部分和第2部分的问题正是您提到的。现在我已经解决了所有的问题,非常感谢。