ฉันต้องการใช้อัลกอริทึมการเรียนรู้ของเครื่องใน Scikit เรียนรู้ แต่ฉันไม่เข้าใจว่าพารามิเตอร์นี้random_state
ทำอะไร? เหตุใดฉันจึงควรใช้
ฉันยังไม่เข้าใจว่าตัวเลขสุ่มหลอกคืออะไร
ฉันต้องการใช้อัลกอริทึมการเรียนรู้ของเครื่องใน Scikit เรียนรู้ แต่ฉันไม่เข้าใจว่าพารามิเตอร์นี้random_state
ทำอะไร? เหตุใดฉันจึงควรใช้
ฉันยังไม่เข้าใจว่าตัวเลขสุ่มหลอกคืออะไร
คำตอบ:
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
จำนวนคงที่ในขณะที่คุณทดสอบเนื้อหา แต่ก็ลบออกในการผลิตถ้าคุณต้องการแยกแบบสุ่ม (และไม่คงที่) จริงๆ
เกี่ยวกับคำถามที่สองของคุณตัวสร้างตัวเลขแบบหลอกเทียมเป็นตัวสร้างตัวเลขที่สร้างตัวเลขสุ่มเกือบทั้งหมด ทำไมพวกเขาไม่ได้สุ่มอย่างแท้จริงอยู่นอกขอบเขตของคำถามนี้และอาจจะไม่สำคัญในกรณีของคุณคุณสามารถใช้เวลาดูที่นี่ในรูปแบบรายละเอียดเพิ่มเติม
หากคุณไม่ได้ระบุrandom_state
ในรหัสของคุณทุกครั้งที่คุณเรียกใช้ (ดำเนินการ) รหัสของคุณจะมีการสร้างค่าสุ่มใหม่และชุดข้อมูลรถไฟและชุดทดสอบจะมีค่าแตกต่างกันในแต่ละครั้ง
อย่างไรก็ตามหากมีการกำหนดค่าคงที่เช่นrandom_state = 42
นั้นไม่ว่าคุณจะรันโค้ดของคุณกี่ครั้งก็ตามผลลัพธ์จะเป็น. iie เดียวกันค่าเดียวกันในชุดข้อมูลรถไฟและชุดทดสอบ
หากคุณไม่พูดถึง 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))
เอาท์พุทที่นี่ตอนนี้จะแตกต่างกันทุกครั้งที่คุณรันโค้ด
หมายเลข 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)`
หากไม่มีการสุ่มให้ระบบจะใช้การสุ่มสถานะที่สร้างขึ้นภายใน ดังนั้นเมื่อคุณรันโปรแกรมหลายครั้งคุณอาจเห็นจุดข้อมูลรถไฟ / ทดสอบที่แตกต่างกันและพฤติกรรมจะไม่สามารถคาดเดาได้ ในกรณีที่คุณมีปัญหากับแบบจำลองของคุณคุณจะไม่สามารถสร้างมันขึ้นมาใหม่ได้เนื่องจากคุณไม่ทราบหมายเลขสุ่มที่สร้างขึ้นเมื่อคุณรันโปรแกรม
หากคุณเห็น Tree Classifiers - DT หรือ RF พวกเขาพยายามสร้างลองโดยใช้แผนที่เหมาะสมที่สุด แม้ว่าส่วนใหญ่เวลาแผนนี้อาจเหมือนกันอาจมีกรณีที่ต้นไม้อาจแตกต่างกันและการคาดการณ์ดังนั้น เมื่อคุณพยายามที่จะดีบักแบบจำลองของคุณคุณอาจไม่สามารถสร้างอินสแตนซ์เดียวกันกับที่มีการสร้างทรีได้ ดังนั้นเพื่อหลีกเลี่ยงความยุ่งยากทั้งหมดนี้เราใช้ random_state ในขณะที่สร้าง DecisionTreeClassifier หรือ RandomForestClassifier
PS: คุณสามารถไปในเชิงลึกเล็กน้อยเกี่ยวกับวิธีการสร้างต้นไม้ใน DecisionTree เพื่อทำความเข้าใจเรื่องนี้ให้ดีขึ้น
โดยทั่วไปจะใช้ randomstate ในการสร้างปัญหาของคุณเหมือนกันทุกครั้งที่มีการเรียกใช้ หากคุณไม่ได้ใช้การสุ่มใน traintests ทุกครั้งที่คุณทำการแยกคุณอาจได้รับชุดของรถไฟและจุดทดสอบที่แตกต่างกันและจะไม่ช่วยคุณในการดีบักในกรณีที่คุณมีปัญหา
จาก Doc:
ถ้า int, randomstate เป็นเมล็ดพันธุ์ที่ใช้โดยตัวสร้างตัวเลขสุ่ม ถ้าอินสแตนซ์ RandomState Randomstate เป็นตัวสร้างตัวเลขสุ่ม ถ้าไม่มีตัวสร้างตัวเลขสุ่มคืออินสแตนซ์ RandomState ที่ใช้โดย np.random
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- ปรับแต่ง