การจัดหมวดหมู่ R เป็นข้อความได้ดีเพียงใด [ปิด]


30

ฉันพยายามเพิ่มความเร็วให้สูงขึ้นด้วย R. ในที่สุดฉันก็ต้องการใช้ไลบรารี R สำหรับการจำแนกข้อความ ฉันแค่สงสัยว่าประสบการณ์ของผู้คนเกี่ยวข้องกับความสามารถในการปรับขนาดของ R เมื่อพูดถึงการจำแนกข้อความ

ฉันมีแนวโน้มที่จะพบข้อมูลมิติสูง (~ 300k มิติ) ฉันกำลังมองหาการใช้ SVM และ Random Forest โดยเฉพาะอย่างยิ่งเป็นอัลกอริทึมการจำแนกประเภท

ไลบรารี R จะปรับขนาดตามขนาดปัญหาของฉันหรือไม่

ขอบคุณ

แก้ไข 1: เพื่อชี้แจงชุดข้อมูลของฉันมีแนวโน้มที่จะมี 1,000-3,000 แถว (อาจเพิ่มอีกเล็กน้อย) และ 10 คลาส

แก้ไข 2: ตั้งแต่ฉันยังใหม่กับ R ฉันจะขอโปสเตอร์ให้เฉพาะเจาะจงมากที่สุดเท่าที่จะเป็นไปได้ ตัวอย่างเช่นหากคุณกำลังแนะนำเวิร์กโฟลว์ / ไปป์ไลน์โปรดตรวจสอบให้แน่ใจว่าได้ระบุถึงไลบรารี R ที่เกี่ยวข้องในแต่ละขั้นตอนถ้าเป็นไปได้ พอยน์เตอร์เพิ่มเติมบางอย่าง (สำหรับตัวอย่างโค้ดตัวอย่าง ฯลฯ ) จะเป็นไอซิ่งบนเค้ก

แก้ไข 3: ก่อนอื่นขอขอบคุณทุกคนสำหรับความคิดเห็นของคุณ และประการที่สองฉันขอโทษบางทีฉันควรจะให้บริบทมากขึ้นสำหรับปัญหา ฉันใหม่สำหรับ R แต่ไม่มากในการจัดประเภทข้อความ ฉันได้ทำการประมวลผลล่วงหน้า (การหยุดการลบคำหยุดการแปลง TF-idf และอื่น ๆ ) ในส่วนหนึ่งของข้อมูลของฉันโดยใช้แพคเกจtmเพียงเพื่อทำความเข้าใจกับสิ่งต่าง ๆ tm ช้ามากแม้จะมีเอกสารประมาณ 200 เรื่องที่ฉันกังวลเกี่ยวกับความสามารถในการขยาย จากนั้นฉันก็เริ่มเล่นกับ FSelector และมันก็ช้ามาก และนั่นคือจุดที่ฉันทำ OP ของฉัน

แก้ไข 4: มันเกิดขึ้นกับฉันว่าฉันมี 10 ชั้นเรียนและประมาณ 300 เอกสารการฝึกอบรมต่อชั้นเรียนและในความเป็นจริงฉันสร้าง termXdoc matrix จากชุดฝึกอบรมทั้งหมดส่งผลให้มีมิติที่สูงมาก แต่วิธีการเกี่ยวกับการลดปัญหาการจำแนก 1-out-of-k ทุกชุดเป็นปัญหาการจำแนกเลขฐานสอง นั่นจะลดจำนวนเอกสารการฝึกอบรมลงอย่างมาก (และด้วยเหตุนี้มิติ) ในแต่ละขั้นตอนของ k-1 อย่างมากใช่มั้ย ดังนั้นวิธีนี้เป็นวิธีที่ดีหรือไม่ มันเปรียบเทียบในแง่ของความแม่นยำกับการใช้งานหลายคลาสปกติได้อย่างไร


1
ขนาด 300k ด้วยจำนวนแถวเท่าไหร่ น่าเสียดายที่วัตถุ R ต้องอยู่ในหน่วยความจำ (อย่างน้อยถ้าคุณไม่ได้พิจารณาการปรับแต่งที่สำคัญโดยทั่วไปคุณต้องเขียนอัลกอริทึมเหล่านี้ใหม่ด้วยตัวเอง) นั่นหมายความว่าเมื่อพูดถึงแรม 8 กิ๊กฉันไม่คิดว่าคุณจะสามารถจัดเก็บได้มากกว่าสองร้อยแถวด้วยคอลัมน์ 300k
— crayola

@crayola: จำนวนแถวอาจแตกต่างกันไปตั้งแต่ 1,000-3,000
— แอนดี้

2
วัตถุ R ไม่จำเป็นต้องอยู่ในหน่วยความจำ การทำแผนที่หน่วยความจำง่ายมาก ขนาด 300k ไม่ใช่ปัญหา ฉันยังสันนิษฐานว่าข้อมูลของคุณเบาบางเพราะเป็นกรณีที่มีปัญหาข้อความเกือบทั้งหมด
— Iterator

ฉันเพิ่งสังเกตเห็นความคิดเห็นข้างต้น: เพียง 1,000-3,000 แถว? นั่นเล็กมาก คุณช่วยอธิบายว่าคลังของคุณคืออะไร? ชุดอีเมล คำอธิบายของแพคเกจใน CRAN? คุณอาจมีปัญหาทางสถิติเกี่ยวกับ P >> N มากกว่าประเด็นการจัดเก็บข้อมูลใด ๆ
— Iterator

1
@Iterator: เรามีแหล่งข้อมูลทางการศึกษา (เอกสารภาคเรียนเรียงความ ฯลฯ ) ที่เราต้องการจัดประเภท
— แอนดี้

คำตอบ:


17

ตามที่ร้องขอในความคิดเห็นต่อไปนี้เป็นตัวชี้สำหรับการประมวลผลขั้นตอน จำนวนของเครื่องมือที่อาจจะพบได้ที่CRAN งาน View สำหรับการประมวลผลภาษาธรรมชาติ นอกจากนี้คุณยังอาจต้องการที่จะมองไปที่กระดาษนี้บนtm(การทำเหมืองข้อความ) แพคเกจสำหรับ R

  1. ก่อนประมวลผลให้พิจารณาการทำให้โทเค็นคำปกติกลับสู่ปกติ openNLP(ซึ่งมีแพ็คเกจ R) เป็นเส้นทางเดียว
  2. สำหรับการประมวลผลข้อความขั้นตอนก่อนการประมวลผลทั่วไปคือการทำให้ข้อมูลเป็นปกติผ่านtf.idf- ความถี่คำศัพท์ * ความถี่เอกสารผกผัน - ดูรายการ Wikipediaสำหรับรายละเอียดเพิ่มเติม ยังมีการทำ normalization อื่น ๆ อีกมากมาย แต่นี่เป็นวิธีทำขนมปังและเนยดังนั้นมันสำคัญที่ต้องรู้ คุณสามารถนำไปใช้งานได้อย่างง่ายดายใน R: เพียงแค่เก็บ (docID, wordID, freq1, freq2) โดยที่ freq1 คือการนับจำนวนครั้งที่ดัชนีที่จัดทำดัชนีโดย wordID ปรากฏในเอกสารที่กำหนดและ freq2 เป็น # ของเอกสารที่ปรากฏ ไม่จำเป็นต้องเก็บเวกเตอร์นี้สำหรับคำที่ไม่ปรากฏในเอกสารที่กำหนด จากนั้นเพียงแค่รับ freq1 / freq2 และคุณมีค่า tf.idf ของคุณ
  3. หลังจากการคำนวณค่า tf.idf คุณสามารถทำงานกับมิติข้อมูลทั้งหมดของคุณหรือกรองคำเหล่านั้นที่ไม่เป็นทางการ ตัวอย่างเช่นคำใด ๆ ที่ปรากฏในเอกสารเพียงฉบับเดียวจะไม่ทำให้เกิดความเข้าใจมากนัก สิ่งนี้อาจลดมิติข้อมูลของคุณได้อย่างมาก เมื่อพิจารณาจำนวนน้อยของเอกสารคุณอาจพบว่าการลดขนาดเพียง 1K นั้นเหมาะสม
  4. ฉันจะไม่นำเสนอข้อมูลอีกครั้ง (เช่นสำหรับ PCA) แต่คุณสามารถจัดเก็บข้อมูลในเมทริกซ์คำศัพท์ (โดยที่รายการคือค่า tf.idf) อย่างง่ายดายโดยใช้เมทริกซ์กระจัดกระจายตามที่ได้รับการสนับสนุนโดยMatrixแพคเกจ

ณ จุดนี้คุณมีชุดข้อมูลที่ถูกประมวลผลล่วงหน้าอย่างดี ฉันขอแนะนำให้ดำเนินการต่อด้วยเครื่องมือที่อ้างถึงในมุมมองงาน CRAN หรือแพ็คเกจการขุดข้อความ การจัดกลุ่มข้อมูลตัวอย่างเช่นโดยการฉายลงบนส่วนประกอบหลัก 4 หรือ 6 ชิ้นแรกอาจเป็นที่น่าสนใจสำหรับกลุ่มของคุณเมื่อข้อมูลถูกพล็อต

อีกอย่างหนึ่ง: คุณอาจพบว่าการลดขนาดตามแนวเส้น PCA (*) จะมีประโยชน์เมื่อใช้วิธีการจำแนกประเภทต่างๆเนื่องจากคุณจะต้องรวบรวมคำที่เกี่ยวข้อง ส่วนประกอบหลัก 10-50 แรกอาจเป็นสิ่งที่คุณต้องการสำหรับการจัดหมวดหมู่เอกสารตามขนาดตัวอย่างของคุณ

(*) หมายเหตุ: PCA เป็นเพียงขั้นตอนแรก อาจเป็นเรื่องที่น่าสนใจสำหรับบางคนที่เพิ่งเริ่มต้นด้วย text mining และ PCA แต่ในที่สุดคุณอาจพบว่ามันเป็นเรื่องที่สร้างความรำคาญให้กับชุดข้อมูลที่กระจัดกระจาย ในฐานะที่เป็นขั้นตอนแรกให้ดูที่มันโดยเฉพาะอย่างยิ่งผ่านทางprcompและprincompฟังก์ชั่น

ปรับปรุง: ฉันไม่ได้ระบุการตั้งค่าในคำตอบนี้ - ฉันแนะนำมากกว่าprcompprincomp


+1 คำตอบที่ดี; ฉันแค่อยากรู้ว่าทำไมคุณถึงบอกว่าท่าจอดเรือจำนวนน้อยบ่งบอกถึงจำนวนตัวแปรที่สำคัญน้อยลง - มันดูไม่เหมาะสมใช่ไหม?

ฉันไม่แน่ใจว่าฉันเข้าใจสิ่งที่คุณหมายถึง เพื่อให้พวกเขามีกำลังมากเกินไปแน่นอนดังนั้นตัวแปรเหล่านี้จะถูกกำจัดในการทำให้เป็นระเบียบตามสมควร ยิ่งกว่านั้นคำศัพท์ (P) เติบโตขึ้นด้วย # ของเอกสารหรือตัวอย่าง (N) ดังนั้นครั้งแรกที่คำที่ปรากฏไม่ได้บ่งบอกอะไรมากนัก เพิ่มเอกสารต่อไปจากนั้นการทำซ้ำคำศัพท์หนึ่งในเอกสารจะกลายเป็นข้อมูล
— Iterator

@Iterator: ขอบคุณสำหรับคำตอบของคุณ ดังนั้นprcompและ / หรือprincompจะขยายขนาดข้อมูลประเภทนี้ที่คุณคาดไว้? นอกจากนี้ฉันเพิ่งแก้ไขคำถามของฉันและเพิ่มข้อมูลเพิ่มเติม
— Andy

ไม่แนวโน้มเหล่านี้จะไม่ขยายเมื่อคุณกดคอลัมน์ 300K :) (เพียงเพื่อชี้ให้เห็น: X'X ในกรณีนั้นจะมี 90B รายการ - ปัญหาการจัดเก็บ) แทนกรองโดย tf.idf ก่อน หากมีเพียงพูดคลาสที่แตกต่างกัน 10 คลาสดังนั้นคลาสพอยน์ขนาดเล็กจำนวน 10 ควรเพียงพอสำหรับมิติที่ใหญ่กว่าสำหรับการแยกคลาส ดังนั้น 1,000 มิติควรมากกว่าเพียงพอ ทั้งสองวิธี PCA (btw ฉันแนะนำprcomp) จะไม่เป็นไร
— Iterator

เมื่อคุณ จำกัด ขนาดไว้ที่ 1,000 มิติหรืออาจมีอีกสองสาม (เช่น 2K) และทำ PCA คุณอาจคาดประมาณ 100 มิติ (ซึ่งอาจเกินขนาด แต่มีอันตรายเล็กน้อย) จากนั้นจึงจัดหมวดหมู่ ณ จุดนี้ไม่มีอะไรน่าตื่นเต้นเกิดขึ้น
— Iterator

5

ก่อนอื่นยินดีต้อนรับ! การประมวลผลข้อความเป็นเรื่องสนุกมากและการทำใน R จะทำให้ง่ายขึ้นตลอดเวลา

คำตอบสั้น ๆ : ใช่ - เครื่องมือใน R ค่อนข้างดีสำหรับการจัดการกับข้อมูลประเภทนี้ ในความเป็นจริงไม่มีอะไรพิเศษเกี่ยวกับ R, C ++, Groovy, Scala หรือภาษาอื่น ๆ เมื่อพูดถึงการจัดเก็บข้อมูลใน RAM: ภาษาทุกภาษาเก็บ 8 byte double float ใน ... รอเลย ... รอเลย .. 8 ไบต์!

อัลกอริทึมและการใช้งานของพวกเขามีความสำคัญโดยเฉพาะอย่างยิ่งหากดำเนินการไม่ดีมากเกี่ยวกับโครงสร้างข้อมูลและความซับซ้อนของการคำนวณ หากคุณกำลังใช้อัลกอริทึมของคุณเองเพียงดูแล หากใช้รหัสอื่น ๆ ตัวเตือน caveat จะมีผลเช่นเดียวกับในสภาพแวดล้อมใด ๆ

สำหรับ R คุณจะต้องพิจารณา:

  1. การแสดงข้อมูลของคุณ (ดูการฝึกอบรมที่กระจัดกระจายโดยเฉพาะในMatrixแพ็คเกจ)
  2. การจัดเก็บข้อมูล (บางทีหน่วยความจำแมปใช้bigmemoryหรือffหรือกระจายโดยใช้ Hadoop)
  3. การแบ่งพาร์ติชั่นข้อมูลของคุณ (เท่าไหร่ที่คุณสามารถใส่ในแรมได้นั้นขึ้นอยู่กับว่าคุณมีแรมมากแค่ไหน)

จุดสุดท้ายอยู่ภายใต้การควบคุมของคุณจริงๆ

เมื่อพูดถึงมิตินี้มันไม่ได้ใหญ่เป็นพิเศษอีกต่อไป # การสังเกตจะมีผลกระทบมากกว่า แต่คุณสามารถแบ่งพาร์ติชันข้อมูลของคุณเพื่อปรับสำหรับการใช้ RAM ดังนั้นจึงไม่ค่อยมีอะไรให้กังวลมากนัก


3

ฉันเห็นด้วยกับ crayola ว่าจำนวนแถวมีความสำคัญที่นี่ สำหรับ RF คุณจะต้องมี RAM อย่างน้อย 3 เท่าของน้ำหนักชุดข้อมูลของคุณและอาจใช้เวลานาน (จำนวนคุณลักษณะดังกล่าวมักจะต้องใช้ต้นไม้จำนวนมากในป่า - และโปรดทราบว่าไม่มีการใช้ RF แบบขนานใน R)

เกี่ยวกับ SVM ฉันสงสัยว่าเป็นความคิดที่ดีที่จะต่อสู้กับขนาด 300k ในขณะที่คุณอาจพัฒนาฟังก์ชั่นเคอร์เนลที่เทียบเท่ากับข้อความอธิบายของคุณ

แก้ไข: เมทริกซ์ 3k x 30k (จริง) จะครอบครองอย่าง 7Gb ดังนั้นสิ่งที่คุณต้องทำ RF (โดยใช้ randomForest) ในข้อมูลนี้คือคอมพิวเตอร์ที่มี RAM 16GB, โชคดีและใช้เวลาเพียงเล็กน้อยหรือเพียงคอมพิวเตอร์ที่มี 24GB แรมและเวลาค่อนข้างน้อย


แน่นอนว่าฉันกำลังจะทำการเลือกคุณสมบัติ (ไคสแควร์, เอนโทรปี) แต่อีกครั้งฉันไม่สามารถหาไลบรารี่ R ที่จะปรับขนาดสำหรับงานนี้ได้เช่นกัน เมื่อคำนึงถึงสิ่งทั้งหมดนี้แล้วมันถูกต้องหรือไม่ที่จะบอกว่าบางทีฉันควรเริ่มมองหาวิธีแก้ปัญหาที่ไม่ใช่อาร์?
— แอนดี้

1
"โปรดสังเกตว่าไม่มีการนำ RF มาใช้งานแบบขนานใน R" นั่นเป็นเพียงบางส่วนที่ถูกต้องเนื่องจากforeachแพคเกจเล่นได้ดีกับrandomForestแพ็คเกจ foreachผมคิดว่ามีเป็นตัวอย่างหนึ่งเช่นในบทความสำหรับ (หรือบางทีdoMC.)
— Crayola

@Andy สิ่งคือขาดการเขียนอัลกอริทึมในภาษาการเขียนโปรแกรมระดับต่ำฉันไม่แน่ใจว่าซอฟต์แวร์จะสามารถใช้อัลกอริทึมเหล่านี้กับข้อมูลของคุณ ถ้าฉันอยู่ในสถานการณ์ของคุณฉันคิดว่าฉันจะติดกับ R และเขียนส่วนต่าง ๆ ของrandomForestมันเพื่อที่จะสืบค้นคอลัมน์ที่สุ่มเลือกจากตัวอย่างเช่นฐานข้อมูล SQL ในการทำซ้ำแต่ละครั้ง (เช่นขนาด 300k ทั้งหมดจะไม่มี อยู่ใน ram) แต่นั่นอาจเป็นเพราะฉันรู้จัก R มากกว่าตัวเลือกอื่น ๆ ที่เป็นไปได้
— crayola

คุณหมายถึงอะไรอย่างแม่นยำโดยอ้างว่าคุณไม่พบห้องสมุดที่จะปรับขนาดสำหรับสิ่งนั้น ตัวกรองเช่นนี้เป็นพีชคณิตพื้นฐานที่ควรทำงานโดยไม่มีปัญหา (หากคุณมี RAM เพียงพอ)

@crayola True แต่ส่วนที่รวมกันนั้นแย่มาก ยิ่งไปกว่านั้นมันไม่ได้เป็นแบบคู่ขนานที่ใช้ร่วมกันดังนั้นมันอาจจะเจ็บปวด (ถ้าไม่เป็นไปไม่ได้) ในการตั้งค่านี้
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.