SVM โดยใช้ scikit เรียนรู้ทำงานอย่างไม่มีที่สิ้นสุดและไม่เคยดำเนินการจนเสร็จสมบูรณ์


76

ฉันพยายามเรียกใช้ SVR โดยใช้ scikit learn (python) บนชุดข้อมูลการฝึกอบรมที่มี 595605 แถวและ 5 คอลัมน์ (คุณสมบัติ) และชุดทดสอบที่มี 397070 แถว ข้อมูลได้รับการประมวลผลล่วงหน้าและทำให้เป็นมาตรฐาน

ฉันสามารถรันตัวอย่างทดสอบได้สำเร็จ แต่เมื่อใช้งานชุดข้อมูลของฉันและปล่อยให้มันทำงานนานกว่าหนึ่งชั่วโมงฉันก็ยังไม่เห็นผลลัพธ์หรือการสิ้นสุดของโปรแกรม ฉันได้ลองใช้งานด้วย IDE ที่แตกต่างกันและแม้กระทั่งจาก terminal แต่นั่นก็ไม่ได้เป็นปัญหา ฉันได้ลองเปลี่ยนค่าพารามิเตอร์ 'C' จาก 1 เป็น 1e3 แล้ว

ฉันกำลังเผชิญปัญหาที่คล้ายกันกับการใช้งาน svm ทั้งหมดโดยใช้ scikit

ฉันไม่ได้รอให้เสร็จหรือไม่ การดำเนินการนี้ควรใช้เวลาเท่าไหร่

จากประสบการณ์ของฉันไม่ควรใช้เวลาสักครู่

นี่คือการกำหนดค่าระบบของฉัน: Ubuntu 14.04, RAM 8GB, หน่วยความจำฟรีมากมาย, โปรเซสเซอร์เจนเนอเรชั่นที่ 4 รุ่นที่ 4


คุณสามารถให้รหัสได้หรือไม่ นอกจากนี้การฝึกอบรมหรือการทดสอบใช้เวลานานมากหรือไม่? ชุดข้อมูลการฝึกอบรม / การทดสอบมีขนาดเล็กลงอย่างไร
แฟนของ

ฉันแค่อ่านข้อมูลจากไฟล์ csv ไปยัง dataframe ของ pandas และส่งไปยัง scikit learn function นั่นคือทั้งหมด! การให้รหัสไม่ได้ช่วยที่นี่จริงๆ
tejaskhot

6
การนำ SVM ของ sklearn ไปใช้อย่างน้อย 3 ขั้นตอน: 1) การสร้างวัตถุ SVR, 2) การสร้างแบบจำลองที่เหมาะสม 3) การทำนายค่า ขั้นตอนแรกอธิบายถึงเคอร์เนลที่ใช้งานอยู่ซึ่งช่วยให้เข้าใจกระบวนการภายในได้ดียิ่งขึ้น ขั้นตอนที่สองและสามนั้นแตกต่างกันมากและเราจำเป็นต้องรู้ว่าอย่างน้อยขั้นตอนใดที่ต้องใช้เวลานาน ถ้าเป็นการฝึกอบรมก็อาจไม่เป็นไรเพราะบางครั้งการเรียนรู้ช้า หากเป็นการทดสอบอาจมีข้อผิดพลาดเนื่องจากการทดสอบใน SVM นั้นเร็วมาก นอกจากนี้อาจเป็นการอ่าน CSV ที่ใช้เวลานานและไม่ใช่ SVM เลย ดังนั้นรายละเอียดทั้งหมดเหล่านี้อาจมีความสำคัญ
แฟน

ฉันกำลังเผชิญปัญหาเดียวกันเช่นกันผ่าน svm แต่ทุกคนสามารถบอกฉันได้ว่าต้องใช้เวลานานเท่าไหร่หลังจากการทำให้เป็นมาตรฐาน?
kashyap kitchlu

คำตอบ:


69

Kernelized SVMs จำเป็นต้องมีการคำนวณของฟังก์ชันระยะห่างระหว่างจุดแต่ละจุดในชุดข้อมูลซึ่งเป็นค่าใช้จ่ายที่มีอำนาจเหนือของ2) การจัดเก็บระยะทางเป็นภาระในหน่วยความจำดังนั้นพวกเขาจึงคำนวณใหม่ได้ทันที โชคดีที่มีเพียงจุดที่ใกล้เคียงที่สุดกับขอบเขตการตัดสินใจเท่านั้น ระยะทางที่คำนวณบ่อยจะถูกเก็บไว้ในแคช หากแคชจะได้รับการตีแล้วเวลาทำงานพัดขึ้นไป3)O ( n คุณสมบัติ × n 3 สังเกต )O(nคุณสมบัติ×nข้อสังเกต2)O(nคุณสมบัติ×nข้อสังเกต3)

คุณสามารถเพิ่มแคชนี้ได้โดยการเรียก SVR เป็น

model = SVR(cache_size=7000)

โดยทั่วไปสิ่งนี้จะไม่ทำงาน แต่ทั้งหมดจะไม่สูญหาย คุณสามารถตัวอย่างข้อมูลและใช้ส่วนที่เหลือเป็นชุดการตรวจสอบความถูกต้องหรือคุณสามารถเลือกรูปแบบที่แตกต่างกัน เหนือช่วงการสังเกต 200,000 ควรเลือกผู้เรียนเชิงเส้น

Kernel SVM สามารถประมาณค่าได้โดยประมาณเมทริกซ์เคอร์เนลและป้อนให้กับ SVM เชิงเส้น สิ่งนี้ช่วยให้คุณแลกเปลี่ยนระหว่างความแม่นยำและประสิทธิภาพในเวลาเชิงเส้น

วิธีที่ได้รับความนิยมในการบรรลุเป้าหมายนี้คือการใช้ศูนย์คลัสเตอร์ 100 แห่งหรือมากกว่านั้นที่ kmeans / kmeans ++ เป็นพื้นฐานของฟังก์ชันเคอร์เนลของคุณ ฟีเจอร์ที่ได้รับใหม่นั้นจะถูกป้อนเข้าสู่โมเดลเชิงเส้น วิธีนี้ใช้ได้ผลดีในทางปฏิบัติ เครื่องมือเช่นsophia-mlและvowpal wabbitเป็นวิธีที่ Google, Yahoo และ Microsoft ทำเช่นนี้ อินพุต / เอาต์พุตกลายเป็นค่าใช้จ่ายที่มีอำนาจเหนือสำหรับผู้เรียนเชิงเส้นอย่างง่าย

ในความอุดมสมบูรณ์ของข้อมูลโมเดลที่ไม่ใช่พารามิเตอร์จะทำแบบเดียวกันสำหรับปัญหาส่วนใหญ่ ข้อยกเว้นเป็นอินพุตที่มีโครงสร้างเช่นข้อความรูปภาพอนุกรมเวลาเสียง

อ่านเพิ่มเติม


16

SVM แก้ปัญหาการเพิ่มประสิทธิภาพของคำสั่งกำลังสอง

ฉันไม่มีอะไรเพิ่มที่ยังไม่ได้พูดที่นี่ ฉันแค่ต้องการโพสต์ลิงค์ในหน้า sklearn เกี่ยวกับSVCซึ่งจะอธิบายสิ่งที่เกิดขึ้น:

การใช้งานจะขึ้นอยู่กับ libsvm ความซับซ้อนของเวลาพอดีนั้นมากกว่ากำลังสองที่มีจำนวนตัวอย่างซึ่งทำให้ยากต่อการปรับขนาดไปยังชุดข้อมูลที่มีมากกว่า 10,000 ตัวอย่างสองสามตัวอย่าง

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

สิ่งที่คุณสามารถใช้คือการไล่ระดับสีแบบสุ่มเพื่อแก้ปัญหาการหาค่าเหมาะที่สุด Sklearn มีSGDRegressor คุณต้องใช้loss='epsilon_insensitive'เพื่อให้ได้ผลลัพธ์ที่คล้ายกับ linear SVM ดูเอกสารประกอบ ฉันจะใช้การไล่ระดับสีเป็นทางเลือกสุดท้ายแม้ว่าจะเป็นเพราะมันหมายถึงการปรับเปลี่ยนมากเกินไปของพารามิเตอร์เพื่อหลีกเลี่ยงการติดอยู่ในท้องถิ่นน้อยที่สุด ใช้LinearSVRถ้าคุณสามารถ


ฉันมีชุดข้อมูลที่มีหลายบรรทัด SVC เริ่มใช้เวลานานเกินไปสำหรับฉันเกี่ยวกับแถวข้อมูลประมาณ 150K ฉันใช้คำแนะนำของคุณกับ LinearSVR และล้านแถวใช้เวลาเพียงไม่กี่นาที PS ยังพบลอจิสติกส์ลอจิสติกการแยกประเภทสร้างผลลัพธ์ที่คล้ายกันเป็น LinearSVR (ในกรณีของฉัน) และเร็วยิ่งขึ้น
jeffery_the_wind

8

คุณรวมมาตราส่วนไว้ในขั้นตอนการประมวลผลล่วงหน้าหรือไม่ ฉันมีปัญหานี้เมื่อใช้งาน SVM ชุดข้อมูลของฉันคือ ~ 780,000 ตัวอย่าง (แถว) ที่มี 20 คุณสมบัติ (สี) ชุดการฝึกอบรมของฉันคือ ~ 235k ตัวอย่าง ปรากฎว่าฉันเพิ่งลืมปรับขนาดข้อมูลของฉัน! หากเป็นกรณีนี้ลองเพิ่มบิตนี้ในรหัสของคุณ:

ปรับขนาดข้อมูลเป็น [-1,1]; เพิ่มความเร็ว SVM:

จาก sklearn.preprocessing การนำเข้า MinMaxScaler
scaling = MinMaxScaler (feature_range = (- 1,1)) พอดี (X_train)
X_train = scaling.transform (X_train)
X_test = scaling.transform (X_test)


2
ทุกคนสามารถอธิบายได้หรือไม่ว่าทำไมเรื่องนี้ถึงเร็วขึ้นขนาด SVM
lppier

1
มีเหตุผลที่คุณเลือก MinMaxScaler แทนที่จะเป็นคนอื่นหรือไม่? StandardScaler เช่น?
raspi

@Ippier: เป็นหลักคุณจะลดพื้นที่ขอบเขตที่เป็นไปได้สำหรับแต่ละตัวเลือกในแบบที่ทำให้ระดับความพยายามน้อยลงสำหรับเครื่องของคุณ
ike

7

ด้วยชุดข้อมูลขนาดใหญ่เช่นนี้ฉันคิดว่าคุณน่าจะดีกว่าด้วยการใช้โครงข่ายประสาทการเรียนรู้ลึกป่าสุ่ม (พวกมันน่าประหลาดใจมาก) เป็นต้น

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

หากคุณต้องใช้ SVM จริงๆฉันขอแนะนำให้ใช้ความเร็ว GPU หรือลดขนาดชุดข้อมูลการฝึกอบรม ลองใช้ตัวอย่าง (อาจมี 10,000 แถว) ของข้อมูลก่อนเพื่อดูว่าไม่ใช่ปัญหาของรูปแบบข้อมูลหรือการกระจาย

ตามที่กล่าวไว้ในคำตอบอื่น ๆ เมล็ดเชิงเส้นจะเร็วขึ้น


3

ฉันเพิ่งพบปัญหาที่คล้ายกันเนื่องจากลืมปรับขนาดคุณสมบัติในชุดข้อมูลของฉันซึ่งก่อนหน้านี้ใช้ในการฝึกอบรมประเภทของวงดนตรีชุด ความล้มเหลวในการขยายขนาดข้อมูลอาจเป็นสาเหตุของความเสี่ยงตามที่ Shelby Matlock ชี้ คุณอาจลองใช้เครื่องมือขูดที่มีอยู่ใน sklearn เช่นRobustScaler :

from sklearn.preprocessing import RobustScaler scaler = RobustScaler() X = scaler.fit_transfrom(X)

ตอนนี้ X จะถูกเปลี่ยน / ปรับสัดส่วนและพร้อมที่จะป้อนเข้ากับรุ่นที่คุณต้องการ


2

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


1

ปล่อยให้วิ่งข้ามคืนหรือดีกว่าเป็นเวลา 24 ชั่วโมง การใช้งาน CPU ของคุณคืออะไร หากไม่มีแกนใดทำงานอยู่ที่ 100% แสดงว่าคุณมีปัญหา อาจมีหน่วยความจำ คุณได้ตรวจสอบว่าชุดข้อมูลของคุณเหมาะกับ 8GB หรือไม่? คุณลอง SGDClassifier แล้วหรือยัง มันเป็นหนึ่งในรถที่เร็วที่สุด คุ้มค่าที่จะลองดูก่อนหวังว่าจะเสร็จในอีกประมาณหนึ่งชั่วโมง


SGDClassifierไม่รองรับข้าว หาก OP ต้องการ SVM เชิงเส้นฉันจะแนะนำให้ลองLinearSVRก่อน มันเร็วกว่ามากSVRเพราะมันแก้ปัญหาโดยใช้ไลบรารีถดถอยเชิงเส้นและรับประกันขั้นต่ำทั่วโลก (ซึ่งแตกต่างจากการไล่ระดับสีไล่ระดับ)
Ricardo Cruz

ขอบคุณสำหรับความคิดเห็นของคุณ คุณช่วยอธิบายได้ไหมว่าทำไมการสนับสนุนเคอร์เนลจึงเป็นปัญหา
Diego

จากเอกสาร , สิ่งเดียวกันสำหรับThe loss function to be used. Defaults to ‘hinge’, which gives a linear SVM. เทียบเท่ากับการใช้ ถ้านั่นคือสิ่งที่ OP ต้องการนั่นยอดเยี่ยม ฉันรู้สึกว่าเขาต้องการใช้ SVM กับเคอร์เนล หากไม่เป็นเช่นนั้นฉันจะแนะนำให้เขาลองก่อน SGDRegressorSGDRegressorSVR(kernel='linear')LinearSVR
Ricardo Cruz

1

ลองปรับมาตรฐานข้อมูลเป็น [-1,1] ฉันประสบปัญหาคล้ายกันและเมื่อทุกอย่างทำงานปกติได้ดี คุณสามารถทำให้ข้อมูลกลับสู่ปกติได้อย่างง่ายดายโดยใช้:

from sklearn import preprocessing X_train = preprocessing.scale(X_train) X_test = preprocessing.scale(X_test)


@Archie นี่คือคำตอบสำหรับคำถามไม่ใช่คำถาม
timleathart

1

ฉันพบปัญหานี้แล้วและcache_sizeในขณะที่คนอื่นแนะนำไม่ช่วยอะไรเลย คุณสามารถดูโพสต์นี้และโพสต์นี้ในฐานะผู้สนับสนุนหลักแนะนำว่าคุณควรเปลี่ยนรหัสด้วยตนเอง

อย่างที่คุณทราบSVCและSVRเป็นปัญหาการปรับให้เหมาะสมและจะหยุดเมื่อระยะขอบของข้อผิดพลาดน้อยมาก ดังนั้นจึงมีพารามิเตอร์อื่นในสิ่งเหล่านี้max_iterซึ่งคุณสามารถกำหนดจำนวนการวนซ้ำที่ควรทำ

ฉันใช้sklearnใน python และe1071ใน R และ R นั้นเร็วขึ้นมากโดยไม่ต้องตั้งค่าmax_iterและsklearnใช้เวลานานกว่า 2-4 เท่า max_iterวิธีเดียวที่ฉันจะได้นำมาลงเวลาในการคำนวณสำหรับหลามใช้ มันเป็นญาติกับความซับซ้อนของรูปแบบของคุณจำนวนของคุณสมบัติและเมล็ด hyperparameters แต่สำหรับชุดข้อมูลขนาดเล็กผมใช้ประมาณ 4000 DataPoint และmax_iterเป็น10000ผลที่ได้ก็ไม่ได้แตกต่างกันเลยและมันก็เป็นที่ยอมรับ


0

ฉันเพิ่งมีปัญหาที่คล้ายกันกับชุดข้อมูลซึ่งมีองค์ประกอบเพียง 115 และคุณลักษณะเดียวเท่านั้น (ข้อมูลสายการบินระหว่างประเทศ) ทางออกคือการปรับขนาดข้อมูล สิ่งที่ฉันไม่ได้รับคำตอบในตอนนี้คือการใช้งาน Pipeline:

from sklearn.svm import SVR
from sklearn.preprocessing import StandardScaler, MinMaxScaler

model = Pipeline([('scaler', StandardScaler()),
                  ('svr', SVR(kernel='linear'))])

คุณสามารถฝึกได้modelเหมือนการจำแนก / ถดถอยแบบปกติและประเมินแบบเดียวกัน ไม่มีการเปลี่ยนแปลงอะไรเลยมีเพียงความหมายของแบบจำลอง


คือPipelineอะไร คุณไม่ได้นำเข้า
Bram Vanroy

0

คุณต้องปรับขนาดข้อมูลของคุณ การปรับสเกลจะทำให้มาตรฐานข้อมูลของคุณอยู่ในช่วง -1 ถึง 1 ซึ่งจะช่วยให้เกิดการลู่เข้าที่เร็วขึ้น

ลองใช้รหัสต่อไปนี้:

# X is your numpy data array.

from sklearn import preprocessing

X = preprocessing.scale(X)

ยินดีต้อนรับสู่ Data Science SE! คุณช่วยอธิบายว่าคำแนะนำของคุณจะช่วย OP ได้อย่างไร สิ่งที่คุณแนะนำคือการปรับขนาดของอาเรย์ ยังไม่ชัดเจนว่ามันจะส่งผลกระทบต่ออัลกอริทึม SVR ใน scikit เรียนรู้ได้อย่างไร
สเตอริโอ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.