การจัดหมวดหมู่ 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.