พารามิเตอร์“ แบ่งชั้น” จากเมธอด“ train_test_split” (scikit Learn)


94

ฉันกำลังพยายามที่จะใช้train_test_splitจากแพคเกจ scikit เรียนรู้ stratifyแต่ฉันกำลังมีปัญหากับพารามิเตอร์ ต่อจากนี้คือรหัส:

from sklearn import cross_validation, datasets 

X = iris.data[:,:2]
y = iris.target

cross_validation.train_test_split(X,y,stratify=y)

อย่างไรก็ตามฉันได้รับปัญหาต่อไปนี้:

raise TypeError("Invalid parameters passed: %s" % str(options))
TypeError: Invalid parameters passed: {'stratify': array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])}

ใครบางคนมีความคิดว่าเกิดอะไรขึ้น? ด้านล่างนี้เป็นเอกสารเกี่ยวกับฟังก์ชัน

[... ]

แบ่งชั้น : อาร์เรย์เหมือนหรือไม่มี (ค่าเริ่มต้นคือไม่มี)

หากไม่ใช่ไม่มีข้อมูลจะถูกแบ่งออกเป็นชั้น ๆ โดยใช้สิ่งนี้เป็นอาร์เรย์ป้ายกำกับ

ใหม่ในรุ่น 0.17: การแบ่งเป็นชั้นแยก

[... ]


ไม่แก้ไขทั้งหมด
Daneel Olivaw

คำตอบ:


58

Scikit-Learn กำลังบอกคุณว่ามันไม่รู้จักอาร์กิวเมนต์ "stratify" ไม่ใช่ว่าคุณใช้มันอย่างไม่ถูกต้อง นี่เป็นเพราะพารามิเตอร์ถูกเพิ่มในเวอร์ชัน 0.17 ตามที่ระบุไว้ในเอกสารที่คุณยกมา

ดังนั้นคุณต้องอัปเดต Scikit-Learn


ฉันได้รับข้อผิดพลาดเดียวกันแม้ว่าฉันจะมี scikit-learn เวอร์ชัน 0.21.2 scikit-learn 0.21.2 py37h2a6a0b8_0 conda-forge
Kareem Jeiroudi

326

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

ตัวอย่างเช่นหากตัวแปรyเป็นตัวแปรจัดหมวดหมู่ไบนารีที่มีค่า0และ1มี 25% ของศูนย์และ 75% ของตัวแปรstratify=yจะทำให้แน่ใจว่าการแบ่งแบบสุ่มของคุณมี 25% 0และ 75% ของ1's


117
นี่ไม่ได้ตอบคำถามจริงๆ แต่มีประโยชน์อย่างยิ่งสำหรับการทำความเข้าใจวิธีการทำงาน ขอบคุณมาก
Reed Jessen

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

14
@HolgerBrandl มันจะถูกเก็บไว้โดยเฉลี่ย; ด้วยการแบ่งชั้นจะถูกเก็บรักษาไว้อย่างแน่นอน
Yonatan

7
@HolgerBrandl ที่มีชุดข้อมูลขนาดเล็กมากหรือไม่สมดุลมากมีความเป็นไปได้ค่อนข้างมากที่การแบ่งแบบสุ่มสามารถกำจัดคลาสออกจากการแยกส่วนใดส่วนหนึ่งได้อย่างสมบูรณ์
cddt

1
@HolgerBrandl คำถามที่ดี! stratifyบางทีเราอาจจะเพิ่มว่าครั้งแรกที่คุณจะต้องแยกออกเป็นชุดการฝึกอบรมและการทดสอบการใช้ จากนั้นอย่างที่สองเพื่อแก้ไขความไม่สมดุลในที่สุดคุณต้องเรียกใช้การสุ่มตัวอย่างมากเกินไปหรือการสุ่มตัวอย่างต่ำบนชุดการฝึกอบรม ลักษณนาม Sklearn จำนวนมากมีพารามิเตอร์ที่เรียกว่า class-weight ซึ่งคุณสามารถตั้งค่าให้สมดุลได้ ในที่สุดคุณก็สามารถใช้เมตริกที่เหมาะสมมากกว่าความแม่นยำสำหรับชุดข้อมูลที่ไม่สมดุล ลอง F1 หรือพื้นที่ภายใต้ ROC
Claude COULOMBE

62

สำหรับตัวฉันในอนาคตที่มาที่นี่ผ่าน Google:

train_test_splitอยู่ในขณะนี้model_selectionดังนั้น:

from sklearn.model_selection import train_test_split

# given:
# features: xs
# ground truth: ys

x_train, x_test, y_train, y_test = train_test_split(xs, ys,
                                                    test_size=0.33,
                                                    random_state=0,
                                                    stratify=ys)

เป็นวิธีการใช้งาน การตั้งค่าrandom_stateเป็นที่พึงปรารถนาสำหรับการทำซ้ำ


นี่น่าจะเป็นคำตอบ :) ขอบคุณ
SwimBikeRun

15

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


3

ลองเรียกใช้รหัสนี้มัน "ใช้งานได้":

from sklearn import cross_validation, datasets 

iris = datasets.load_iris()

X = iris.data[:,:2]
y = iris.target

x_train, x_test, y_train, y_test = cross_validation.train_test_split(X,y,train_size=.8, stratify=y)

y_test

array([0, 0, 0, 0, 2, 2, 1, 0, 1, 2, 2, 0, 0, 1, 0, 1, 1, 2, 1, 2, 0, 2, 2,
       1, 2, 1, 1, 0, 2, 1])

@ user5767535 อย่างที่คุณเห็นว่ามันใช้งานได้กับเครื่อง Ubuntu ของฉันด้วยsklearnเวอร์ชัน '0.17' การแจกจ่าย Anaconda สำหรับ Python 3,5 ฉันสามารถแนะนำให้ตรวจสอบอีกครั้งหากคุณป้อนรหัสถูกต้องและอัปเดตซอฟต์แวร์ของคุณ
Sergey Bushmanov

2
@ user5767535 BTW "ใหม่ในเวอร์ชัน 0.17: แบ่งชั้น" ทำให้ฉันเกือบแน่ใจว่าคุณต้องอัปเดตsklearn...
Sergey Bushmanov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.