0

Bana pek bir anlam ifade etmeyen bir hatayla karşılaşıyorum ve web'de kendim yanıtlamak için yeterli bilgi bulamadım.ChiSqSelector'da NoSuchElementException fit yöntemi (sürüm 1.6.0)

(String, ArrayBuffer [String]) çiftlerinin bir listesini oluşturmak için kod yazdım ve daha sonra özellikler sütununu vektörlere dönüştürmek için HashingTF özelliğini kullanıyorum (bc, bir lotla bittiğim ayrıştırmada NLP araştırması için) benzersiz özelliklerin, uzun hikaye). Sonra StringIndexer kullanarak dize etiketlerini dönüştürüyorum. Eğitim verilerinde ChiSqSelector.fit çalıştırırken "anahtar bulunamadı" hatası alıyorum. Yığın izlemesi, etiketler için ChiSqTest'te bir hashmap aramasına işaret eder. Bu beni tuhaf olarak gösterdi, çünkü belki de yanlış kullandım ve bir şekilde görülmemiş etiketler için bir hesap vermedim.

Her neyse, işte kodumun önemli kısmı tarafından takip edilen kodumun ilginç kısmı. Herhangi bir yardım çok takdir edilecektir!

val parSdp = sc.parallelize(sdp.take(10)) // it dies on a small amount of data 
val insts: RDD[(String, ArrayBuffer[String])] = 
    parSdp.flatMap(x=> TrainTest.transformGraphSpark(x)) 

val indexer = new StringIndexer() 
    .setInputCol("labels") 
    .setOutputCol("labelIndex") 

val instDF = sqlContext.createDataFrame(insts) 
    .toDF("labels","feats") 
val hash = new HashingTF() 
    .setInputCol("feats") 
    .setOutputCol("hashedFeats") 
    .setNumFeatures(1000000) 
val readyDF = hash.transform(indexer 
    .fit(instDF) 
    .transform(instDF)) 

val selector = new ChiSqSelector() 
    .setNumTopFeatures(100) 
    .setFeaturesCol("hashedFeats") 
    .setLabelCol("labelIndex") 
    .setOutputCol("selectedFeatures") 

val Array(training, dev,test) = readyDF.randomSplit(Array(0.8,0.1,0.1), seed = 12345) 

val chisq = selector.fit(training) 

ve yığın izleme:

java.util.NoSuchElementException: key not found: 23.0       
    at scala.collection.MapLike$class.default(MapLike.scala:228) 
    at scala.collection.AbstractMap.default(Map.scala:58) 
    at scala.collection.MapLike$class.apply(MapLike.scala:141) 
    at scala.collection.AbstractMap.apply(Map.scala:58) 
    at org.apache.spark.mllib.stat.test.ChiSqTest$$anonfun$chiSquaredFeatures$4$$anonfun$apply$4.apply(ChiSqTest.scala:131) 
    at org.apache.spark.mllib.stat.test.ChiSqTest$$anonfun$chiSquaredFeatures$4$$anonfun$apply$4.apply(ChiSqTest.scala:129) 
    at scala.collection.immutable.HashSet$HashSet1.foreach(HashSet.scala:153) 
    at scala.collection.immutable.HashSet$HashTrieSet.foreach(HashSet.scala:306) 
    at org.apache.spark.mllib.stat.test.ChiSqTest$$anonfun$chiSquaredFeatures$4.apply(ChiSqTest.scala:129) 
    at org.apache.spark.mllib.stat.test.ChiSqTest$$anonfun$chiSquaredFeatures$4.apply(ChiSqTest.scala:125) 
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) 
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) 
    at scala.collection.immutable.HashMap$HashMap1.foreach(HashMap.scala:224) 
    at scala.collection.immutable.HashMap$HashTrieMap.foreach(HashMap.scala:403) 
    at scala.collection.immutable.HashMap$HashTrieMap.foreach(HashMap.scala:403) 
    at scala.collection.immutable.HashMap$HashTrieMap.foreach(HashMap.scala:403) 
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:244) 
    at scala.collection.AbstractTraversable.map(Traversable.scala:105) 
    at org.apache.spark.mllib.stat.test.ChiSqTest$.chiSquaredFeatures(ChiSqTest.scala:125) 
    at org.apache.spark.mllib.stat.Statistics$.chiSqTest(Statistics.scala:176) 
    at org.apache.spark.mllib.feature.ChiSqSelector.fit(ChiSqSelector.scala:193) 
    at org.apache.spark.ml.feature.ChiSqSelector.fit(ChiSqSelector.scala:86) 
    at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:89) 
    at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:122) 
    ... etc etc 

Ayrıca fark olduğunu (100) büyük sdp.take boyutunu değiştirerek farklı bir hata olsun yukarıda:

java.lang.IllegalArgumentException: Chi-squared statistic undefined for input matrix due to0 sum in column [4]. 
    at org.apache.spark.mllib.stat.test.ChiSqTest$.chiSquaredMatrix(ChiSqTest.scala:229) 
    at org.apache.spark.mllib.stat.test.ChiSqTest$$anonfun$chiSquaredFeatures$4.apply(ChiSqTest.scala:134) 
    at org.apache.spark.mllib.stat.test.ChiSqTest$$anonfun$chiSquaredFeatures$4.apply(ChiSqTest.scala:125) 
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) 
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) 
    at scala.collection.immutable.HashMap$HashMap1.foreach(HashMap.scala:224) 
    at scala.collection.immutable.HashMap$HashTrieMap.foreach(HashMap.scala:403) 
    at scala.collection.immutable.HashMap$HashTrieMap.foreach(HashMap.scala:403) 
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:244) 
    at scala.collection.AbstractTraversable.map(Traversable.scala:105) 
    at org.apache.spark.mllib.stat.test.ChiSqTest$.chiSquaredFeatures(ChiSqTest.scala:125) 
    at org.apache.spark.mllib.stat.Statistics$.chiSqTest(Statistics.scala:176) 
    at org.apache.spark.mllib.feature.ChiSqSelector.fit(ChiSqSelector.scala:193) 
    at org.apache.spark.ml.feature.ChiSqSelector.fit(ChiSqSelector.scala:86) 
    at $iwC$$iwC.<init>(<console>:96) 
    at $iwC.<init>(<console>:130) 
+0

ChiSqTest.scala (satır 131) için kaynak koduna bakıldığında, bu hata gerçekten imkansız görünüyor. Yorumda da görüldüğü gibi: "Etiketler etiketler arasında değişmez olduğundan, ilk sütun için yalnızca bir kez [etiket haritasını ayarlayın]". –

+0

Kısaca, verileri ilk başta 0,9, 0,1 ve 0,1 olarak böldüğümü fark ettiğimde düzeltdiğimi düşündüm. Sabitleme, yukarıdaki soruya eklediğim başka bir hatayı ortaya çıkardı. Sdp.take boyutunun değiştirilmesi, orijinal hatayı geri getirdi. –

cevap

-1

Eğitim setindeki etiket için farklı sayımlar yapmayı ve tüm etiketlerin her ikisinde de mevcut olup olmadığını görmek için test kümesini yapmayı deneyebilir misiniz?