สถานะสุ่ม (ตัวเลขสุ่มหลอก) ใน Scikit เรียนรู้


148

ฉันต้องการใช้อัลกอริทึมการเรียนรู้ของเครื่องใน Scikit เรียนรู้ แต่ฉันไม่เข้าใจว่าพารามิเตอร์นี้random_stateทำอะไร? เหตุใดฉันจึงควรใช้

ฉันยังไม่เข้าใจว่าตัวเลขสุ่มหลอกคืออะไร

คำตอบ:


220

train_test_splitแบ่งอาร์เรย์หรือเมทริกซ์เป็นส่วนย่อยของรถไฟแบบสุ่มและชุดทดสอบ นั่นหมายความว่าทุกครั้งที่คุณเรียกใช้โดยไม่ได้ระบุrandom_stateคุณจะได้รับผลลัพธ์ที่แตกต่างซึ่งเป็นพฤติกรรมที่คาดหวัง ตัวอย่างเช่น:

เรียกใช้ 1:

>>> a, b = np.arange(10).reshape((5, 2)), range(5)
>>> train_test_split(a, b)
[array([[6, 7],
        [8, 9],
        [4, 5]]),
 array([[2, 3],
        [0, 1]]), [3, 4, 2], [1, 0]]

เรียกใช้ 2

>>> train_test_split(a, b)
[array([[8, 9],
        [4, 5],
        [0, 1]]),
 array([[6, 7],
        [2, 3]]), [4, 2, 0], [3, 1]]

มันเปลี่ยน. ในทางตรงกันข้ามถ้าคุณใช้random_state=some_numberจากนั้นคุณสามารถรับประกันได้ว่าผลลัพธ์ของRun 1จะเท่ากับเอาท์พุทของRun 2นั่นคือการแบ่งของคุณจะเหมือนกันเสมอ ไม่สำคัญว่าrandom_stateจำนวนจริงคือ 42, 0, 21, ... สิ่งสำคัญคือทุกครั้งที่คุณใช้ 42 คุณจะได้ผลลัพธ์เหมือนเดิมทุกครั้งที่คุณแยก สิ่งนี้มีประโยชน์หากคุณต้องการผลลัพธ์ที่ทำซ้ำได้เช่นในเอกสารประกอบเพื่อให้ทุกคนสามารถเห็นตัวเลขที่เหมือนกันเมื่อพวกเขาเรียกใช้ตัวอย่าง ในทางปฏิบัติฉันจะบอกว่าคุณควรตั้งค่าเป็นrandom_stateจำนวนคงที่ในขณะที่คุณทดสอบเนื้อหา แต่ก็ลบออกในการผลิตถ้าคุณต้องการแยกแบบสุ่ม (และไม่คงที่) จริงๆ

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


7
ดังนั้นสิ่งที่ฉันควรตั้งค่าแบบสุ่มฉันมักจะเห็นหมายเลข 42
Elizabeth Susan Joseph

1
@ElizabethSusanJoseph มันไม่สำคัญมากฉันใช้ 0 เสมอหากฉันต้องการให้มีการทำซ้ำหรือไม่มีอย่างอื่น อาจเป็นคนที่ชอบ scikit เช่น 42
elyase

53
นี้น่าจะอธิบายหมายเลข 42 ถูกนำมาใช้จึงมักจะ: en.wikipedia.org/wiki/The_Hitchhiker%27s_Guide_to_the_Galaxy
denson

3
หนึ่งที่ดีที่นี่มีความเป็นไปได้มากขึ้น
elyase

1
@ Herbert นั่นเป็นคำถามที่ยากลำบาก แกน PRNG-stuff นั้นใช้ numpy ซึ่งสอดคล้องกัน (พวกเขาแนะนำการตรวจสอบจำนวนมากสำหรับเรื่องนี้หลังจากปัญหาบางอย่างในอดีต) หากไม่มีข้อผิดพลาดในการใช้งานภายในความผิดพลาดมันจะทำงานสอดคล้องกัน ฉันจะสมมติว่านี้ (โดยเฉพาะอย่างยิ่งสำหรับฟังก์ชั่นที่ซับซ้อนน้อยกว่าเช่นการทดสอบแยกและร่วม) แก้ไข : อ๊ะ, สายไปหน่อย :-)
sascha

13

หากคุณไม่ได้ระบุrandom_stateในรหัสของคุณทุกครั้งที่คุณเรียกใช้ (ดำเนินการ) รหัสของคุณจะมีการสร้างค่าสุ่มใหม่และชุดข้อมูลรถไฟและชุดทดสอบจะมีค่าแตกต่างกันในแต่ละครั้ง

อย่างไรก็ตามหากมีการกำหนดค่าคงที่เช่นrandom_state = 42นั้นไม่ว่าคุณจะรันโค้ดของคุณกี่ครั้งก็ตามผลลัพธ์จะเป็น. iie เดียวกันค่าเดียวกันในชุดข้อมูลรถไฟและชุดทดสอบ


4

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

อย่างไรก็ตามหากคุณใช้ค่าเฉพาะสำหรับ random_state (random_state = 1 หรือค่าอื่น ๆ ) ทุกครั้งผลลัพธ์จะเหมือนกันนั่นคือค่าเดียวกันในชุดรถไฟและชุดทดสอบ ดูรหัสด้านล่าง:

import pandas as pd 
from sklearn.model_selection import train_test_split
test_series = pd.Series(range(100))
size30split = train_test_split(test_series,random_state = 1,test_size = .3)
size25split = train_test_split(test_series,random_state = 1,test_size = .25)
common = [element for element in size25split[0] if element in size30split[0]]
print(len(common))

ไม่ว่าคุณจะเรียกใช้รหัสกี่ครั้งผลลัพธ์จะเป็น 70

70

ลองลบ random_state และเรียกใช้รหัส

import pandas as pd 
from sklearn.model_selection import train_test_split
test_series = pd.Series(range(100))
size30split = train_test_split(test_series,test_size = .3)
size25split = train_test_split(test_series,test_size = .25)
common = [element for element in size25split[0] if element in size30split[0]]
print(len(common))

เอาท์พุทที่นี่ตอนนี้จะแตกต่างกันทุกครั้งที่คุณรันโค้ด


3

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

for j in range(1000):

            X_train, X_test, y_train, y_test = train_test_split(X, y , random_state =j,     test_size=0.35)
            lr = LarsCV().fit(X_train, y_train)

            tr_score.append(lr.score(X_train, y_train))
            ts_score.append(lr.score(X_test, y_test))

        J = ts_score.index(np.max(ts_score))

        X_train, X_test, y_train, y_test = train_test_split(X, y , random_state =J, test_size=0.35)
        M = LarsCV().fit(X_train, y_train)
        y_pred = M.predict(X_test)`

1

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

หากคุณเห็น Tree Classifiers - DT หรือ RF พวกเขาพยายามสร้างลองโดยใช้แผนที่เหมาะสมที่สุด แม้ว่าส่วนใหญ่เวลาแผนนี้อาจเหมือนกันอาจมีกรณีที่ต้นไม้อาจแตกต่างกันและการคาดการณ์ดังนั้น เมื่อคุณพยายามที่จะดีบักแบบจำลองของคุณคุณอาจไม่สามารถสร้างอินสแตนซ์เดียวกันกับที่มีการสร้างทรีได้ ดังนั้นเพื่อหลีกเลี่ยงความยุ่งยากทั้งหมดนี้เราใช้ random_state ในขณะที่สร้าง DecisionTreeClassifier หรือ RandomForestClassifier

PS: คุณสามารถไปในเชิงลึกเล็กน้อยเกี่ยวกับวิธีการสร้างต้นไม้ใน DecisionTree เพื่อทำความเข้าใจเรื่องนี้ให้ดีขึ้น

โดยทั่วไปจะใช้ randomstate ในการสร้างปัญหาของคุณเหมือนกันทุกครั้งที่มีการเรียกใช้ หากคุณไม่ได้ใช้การสุ่มใน traintests ทุกครั้งที่คุณทำการแยกคุณอาจได้รับชุดของรถไฟและจุดทดสอบที่แตกต่างกันและจะไม่ช่วยคุณในการดีบักในกรณีที่คุณมีปัญหา

จาก Doc:

ถ้า int, randomstate เป็นเมล็ดพันธุ์ที่ใช้โดยตัวสร้างตัวเลขสุ่ม ถ้าอินสแตนซ์ RandomState Randomstate เป็นตัวสร้างตัวเลขสุ่ม ถ้าไม่มีตัวสร้างตัวเลขสุ่มคืออินสแตนซ์ RandomState ที่ใช้โดย np.random


คำอธิบายที่ดี ฉันจะเพิ่มเพียงอย่างเดียวนั่นคือเหตุผลที่เราจะผ่านสถานะการสุ่มนั่นคือถ้าเราพยายามเพิ่มประสิทธิภาพพารามิเตอร์ไฮเปอร์พารามิเตอร์เราไม่ต้องการให้ flucutations ในคะแนนเนื่องจากการกำหนดค่าเริ่มต้นที่แตกต่างกันตามตัวเลขสุ่มซึ่งอาจครอบคลุม หรือซ่อนผลของการปรับให้เหมาะสมจริงและทำให้เราไม่สามารถระบุได้ว่าส่วนใดของการเปลี่ยนแปลงคะแนนเนื่องจากการเปลี่ยนแปลงพารามิเตอร์และสิ่งที่เกิดจากสถานะเริ่มต้นที่แตกต่างกันของ RNG
jottbe

-1
sklearn.model_selection.train_test_split(*arrays, **options)[source]

แบ่งอาร์เรย์หรือเมทริกซ์เป็นส่วนย่อยของรถไฟแบบสุ่มและทดสอบ

Parameters: ... 
    random_state : int, RandomState instance or None, optional (default=None)

ถ้า int, random_state เป็นเมล็ดพันธุ์ที่ใช้โดยเครื่องสร้างตัวเลขสุ่ม ถ้าอินสแตนซ์ RandomState, random_state เป็นตัวสร้างตัวเลขสุ่ม ถ้าไม่มีตัวสร้างตัวเลขสุ่มคืออินสแตนซ์ RandomState ที่ใช้โดย np.random แหล่งที่มา: http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

'' 'เกี่ยวกับสถานะการสุ่มมันถูกใช้ในอัลกอริทึมแบบสุ่มจำนวนมากใน sklearn เพื่อกำหนดเมล็ดสุ่มที่ส่งผ่านไปยังเครื่องกำเนิดตัวเลขแบบหลอกเทียม ดังนั้นจึงไม่ได้ควบคุมลักษณะของการทำงานของอัลกอริทึม เป็นผลให้ค่าสถานะแบบสุ่มซึ่งทำงานได้ดีในชุดการตรวจสอบไม่ตรงกับค่าที่จะทำงานได้ดีในชุดทดสอบที่ไม่สามารถมองเห็นได้ใหม่ แน่นอนขึ้นอยู่กับอัลกอริทึมคุณอาจเห็นผลลัพธ์ที่แตกต่างกันโดยสิ้นเชิงเพียงแค่เปลี่ยนลำดับของตัวอย่างการฝึกอบรมแหล่งที่มา '' ': /stats/263999/is-random-state-a-parameter -to- ปรับแต่ง

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