ความสัมพันธ์ระหว่าง numFeatures ใน HashingTF ใน Spark MLlib และจำนวนคำศัพท์จริงในเอกสารคืออะไร

มีความสัมพันธ์ระหว่าง numFeatures ใน HashingTF ใน Spark MLlib และจำนวนคำศัพท์จริงในเอกสาร (ประโยค) หรือไม่?

List<Row> data = Arrays.asList(
  RowFactory.create(0.0, "Hi I heard about Spark"),
  RowFactory.create(0.0, "I wish Java could use case classes"),
  RowFactory.create(1.0, "Logistic regression models are neat")
);
StructType schema = new StructType(new StructField[]{
  new StructField("label", DataTypes.DoubleType, false, Metadata.empty()),
  new StructField("sentence", DataTypes.StringType, false, Metadata.empty())
});
Dataset<Row> sentenceData = spark.createDataFrame(data, schema);

Tokenizer tokenizer = new Tokenizer().setInputCol("sentence").setOutputCol("words");
Dataset<Row> wordsData = tokenizer.transform(sentenceData);

int numFeatures = 20;
HashingTF hashingTF = new HashingTF()
  .setInputCol("words")
  .setOutputCol("rawFeatures")
  .setNumFeatures(numFeatures);

Dataset<Row> featurizedData = hashingTF.transform(wordsData);

ตามที่กล่าวไว้ในเอกสารประกอบของ Spark Mllib นั้น HashingTF จะแปลงแต่ละประโยคให้เป็นเวกเตอร์คุณลักษณะที่มี numFeatures เป็นความยาว จะเกิดอะไรขึ้นหากแต่ละเอกสารในกรณีนี้ ประโยคประกอบด้วยคำศัพท์หลายพันคำ ค่า numFeatures ควรเป็นเท่าใด จะคำนวณค่านั้นได้อย่างไร?


person Rahul    schedule 07.07.2017    source แหล่งที่มา


คำตอบ (1)


HashingTF ใช้เคล็ดลับการแฮช ที่ไม่รักษาแผนที่ระหว่างคำ/โทเค็นและตำแหน่งเวกเตอร์ หม้อแปลงรับแต่ละคำ/ถ่าย ใช้ฟังก์ชันแฮช (MurmurHash3_x86_32) เพื่อสร้างค่ายาว จากนั้นดำเนินการโมดูลอย่างง่าย (% 'numFeatures') เพื่อสร้างจำนวนเต็มระหว่าง 0 ถึง numFeatures ค่าที่ได้คือดัชนีที่จะเพิ่มขึ้นในลักษณะเวกเตอร์

เมื่อพิจารณาจากลักษณะของอัลกอริทึม หาก numFeatures น้อยกว่าจำนวนจริงของคำ/โทเค็นที่แตกต่างกันใน DataFrame รับประกันได้ว่าจะมีความถี่ 'ไม่ถูกต้อง' สำหรับโทเค็นอย่างน้อย 1 อัน (เช่น โทเค็นที่แตกต่างกันจะถูกแฮชไปยังที่เก็บข้อมูลเดียวกัน) หมายเหตุ: แม้จะมี numFeatures >= คำศัพท์ขนาด การชนกัน 'อาจ' ยังคงเกิดขึ้น

ค่าที่ดีที่สุดสำหรับ numFeatures คืออะไร? ฉันจะใช้ตัวเลขที่ใหญ่กว่าขนาดของ 'คำศัพท์' ของคุณ (ไม่ต้องกังวลเรื่องพื้นที่มากเกินไปเนื่องจากคุณสมบัติต่างๆ จะถูกจัดเก็บไว้ใน ml.linalg.SparseVector) โปรดทราบว่า (ดู เอกสาร):

เนื่องจากมีการใช้โมดูโลอย่างง่ายในการแปลงฟังก์ชันแฮชเป็นดัชนีคอลัมน์ จึงแนะนำให้ใช้กำลังสองเป็นพารามิเตอร์ numFeatures มิฉะนั้นคุณลักษณะจะไม่ถูกแมปกับคอลัมน์เท่าๆ กัน

หากคุณต้องการนับความถี่ที่แน่นอน โปรดดูที่ CountVectorizer

person Marsellus Wallace    schedule 10.07.2017
comment
เพียงตรวจสอบว่าฉันเข้าใจสิ่งนี้อย่างถูกต้องหรือไม่ - หากฉันใช้ฟังก์ชันกับชุดข้อมูลใหม่ที่มีพารามิเตอร์ numfeatures เดียวกัน อัลกอริทึมที่ฉันฝึกกับชุดข้อมูลก่อนหน้าจะใช้ได้กับชุดข้อมูลใหม่หรือไม่ - person Saleem Khan; 26.12.2018
comment
การตั้งค่า numFeatures เป็นตัวเลขที่มากกว่าขนาดคำศัพท์นั้นไม่สมเหตุสมผล ในทางกลับกัน คุณต้องการตั้งค่า numFeatures ให้เป็นตัวเลขที่ต่ำกว่าขนาดคำศัพท์ เนื่องจากหนึ่งในแรงจูงใจหลักในการใช้ hashingTF คือการลดจำนวนมิติโดยเสียสละการชนกันบางส่วน ในแง่นั้น วิธีการพื้นฐานคือ CountVectorizer ซึ่งจะสร้างเวกเตอร์ขนาดคำศัพท์ วิธีหนึ่งในการค้นหา numFeatures ที่ดีที่สุดสำหรับชุดข้อมูลของคุณคือการเพิ่มและตรวจสอบความถูกต้องของงาน ML ของคุณ ฉันได้ผลลัพธ์ที่ดีกับ 512 โดยที่ขนาดคำศัพท์อยู่ที่ ~60k - person Eb Abadi; 08.11.2019