Trạng thái ngẫu nhiên (số giả ngẫu nhiên) trong Scikit tìm hiểu


148

Tôi muốn triển khai thuật toán học máy trong scikit learn, nhưng tôi không hiểu tham số random_statenày làm gì? Tại sao tôi nên sử dụng nó?

Tôi cũng không thể hiểu số giả ngẫu nhiên là gì.

Câu trả lời:


220

train_test_splitchia các mảng hoặc ma trận thành các tập con ngẫu nhiên và kiểm tra. Điều đó có nghĩa là mỗi khi bạn chạy nó mà không chỉ định random_state, bạn sẽ nhận được một kết quả khác, đây là hành vi dự kiến. Ví dụ:

Chạy 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]]

Chạy 2

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

Nó thay đổi. Mặt khác, nếu bạn sử dụng random_state=some_number, thì bạn có thể đảm bảo rằng đầu ra của Run 1 sẽ bằng với đầu ra của Run 2 , tức là phần tách của bạn sẽ luôn giống nhau. Không quan trọng random_statecon số thực tế là 42, 0, 21, ... Điều quan trọng là mỗi khi bạn sử dụng 42, bạn sẽ luôn nhận được cùng một đầu ra trong lần đầu tiên bạn thực hiện phân tách. Điều này hữu ích nếu bạn muốn kết quả có thể lặp lại, ví dụ như trong tài liệu, để mọi người luôn có thể thấy các số giống nhau khi họ chạy các ví dụ. Trong thực tế tôi sẽ nói, bạn nên đặt random_statesố cố định trong khi kiểm tra công cụ, nhưng sau đó loại bỏ nó trong sản xuất nếu bạn thực sự cần một sự phân chia ngẫu nhiên (và không cố định).

Về câu hỏi thứ hai của bạn, trình tạo số giả ngẫu nhiên là trình tạo số tạo ra các số gần như thực sự ngẫu nhiên. Tại sao chúng không thực sự ngẫu nhiên nằm ngoài phạm vi của câu hỏi này và có lẽ sẽ không có vấn đề gì trong trường hợp của bạn, bạn có thể xem ở đây để biết thêm chi tiết.


7
Vì vậy, tôi nên đặt trạng thái ngẫu nhiên nào, tôi thường thấy số 42.
Elizabeth Susan Joseph

1
@ElizabethSusanJoseph, nó không quan trọng lắm, tôi luôn sử dụng 0 nếu tôi muốn tái sản xuất hoặc Không có gì khác. Có thể là những kẻ thích chơi khăm như 42.
elyase 23/1/2015

53
Điều này có lẽ giải thích số 42 đang được sử dụng rất thường xuyên: en.wikipedia.org/wiki/The_Hitchhiker%27s_Guide_to_the_Galax
denson

3
Tốt, đây là nhiều khả năng .
elyase

1
@Herbert Đó là một câu hỏi khó. Các công cụ PRNG cốt lõi dựa trên numpy phù hợp (họ đã giới thiệu nhiều kiểm tra cho vấn đề này sau một số vấn đề trong quá khứ). Nếu không có lỗi trong việc sử dụng trong sklearn, nó cũng sẽ hoạt động nhất quán. Tôi sẽ giả sử điều này (đặc biệt là đối với các chức năng ít phức tạp hơn như chia tách kiểm tra và thử nghiệm) Chỉnh sửa : rất tiếc, hơi muộn :-)
sascha

13

Nếu bạn không chỉ định random_statemã trong mã của mình, thì mỗi lần bạn chạy (thực thi) mã của mình, một giá trị ngẫu nhiên mới sẽ được tạo và các bộ dữ liệu kiểm tra và huấn luyện sẽ có các giá trị khác nhau mỗi lần.

Tuy nhiên, nếu một giá trị cố định được gán như thế random_state = 42thì cho dù bạn có thực thi mã của mình bao nhiêu lần thì kết quả sẽ giống nhau .ie, cùng các giá trị trong tập dữ liệu thử nghiệm và kiểm tra.


4

Nếu bạn không đề cập đến Random_state trong mã, thì bất cứ khi nào bạn thực thi mã của mình, một giá trị ngẫu nhiên mới sẽ được tạo và các bộ dữ liệu kiểm tra và huấn luyện sẽ có các giá trị khác nhau mỗi lần.

Tuy nhiên, nếu bạn sử dụng một giá trị cụ thể cho Random_state (Random_state = 1 hoặc bất kỳ giá trị nào khác) mỗi khi kết quả sẽ giống nhau, tức là, cùng các giá trị trong bộ dữ liệu thử nghiệm và thử nghiệm. Tham khảo mã dưới đây:

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))

Không quan trọng bạn chạy mã bao nhiêu lần, đầu ra sẽ là 70.

70

Cố gắng loại bỏ Random_state và chạy mã.

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))

Bây giờ ở đây đầu ra sẽ khác nhau mỗi khi bạn thực thi mã.


3

số Random_state phân chia các tập dữ liệu kiểm tra và huấn luyện một cách ngẫu nhiên. Ngoài những gì được giải thích ở đây, điều quan trọng cần nhớ là giá trị Random_state có thể có ảnh hưởng đáng kể đến chất lượng mô hình của bạn (về chất lượng tôi về cơ bản có nghĩa là chính xác để dự đoán). Ví dụ: Nếu bạn lấy một tập dữ liệu nhất định và huấn luyện mô hình hồi quy với nó, mà không chỉ định giá trị Random_state, có khả năng mọi lúc, bạn sẽ nhận được kết quả chính xác khác cho mô hình được đào tạo của mình trên dữ liệu thử nghiệm. Vì vậy, điều quan trọng là tìm giá trị Random_state tốt nhất để cung cấp cho bạn mô hình chính xác nhất. Và sau đó, con số đó sẽ được sử dụng để tái tạo mô hình của bạn trong một dịp khác, chẳng hạn như một thí nghiệm nghiên cứu khác. Làm như vậy,

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

Nếu không có ngẫu nhiên được cung cấp, hệ thống sẽ sử dụng ngẫu nhiên được tạo bên trong. Vì vậy, khi bạn chạy chương trình nhiều lần, bạn có thể thấy các điểm dữ liệu kiểm tra / huấn luyện khác nhau và hành vi sẽ không thể đoán trước. Trong trường hợp, bạn gặp sự cố với mô hình của mình, bạn sẽ không thể tạo lại mô hình đó vì bạn không biết số ngẫu nhiên được tạo khi bạn chạy chương trình.

Nếu bạn thấy Trình phân loại cây - DT hoặc RF, họ sẽ cố gắng xây dựng thử bằng cách sử dụng một kế hoạch tối ưu. Mặc dù hầu hết các lần kế hoạch này có thể giống nhau, có thể có những trường hợp cây có thể khác nhau và do đó, dự đoán. Khi bạn cố gắng gỡ lỗi mô hình của mình, bạn có thể không thể tạo lại cùng một thể hiện mà Cây được tạo. Vì vậy, để tránh tất cả những rắc rối này, chúng tôi sử dụng Random_state trong khi xây dựng Quyết định phân loại hoặc RandomForestClassifier.

Tái bút: Bạn có thể đi sâu một chút về cách Cây được xây dựng trong Quyết định để hiểu rõ hơn về điều này.

Randomstate về cơ bản được sử dụng để tái tạo vấn đề của bạn giống nhau mỗi khi nó được chạy. Nếu bạn không sử dụng ngẫu nhiên trong bộ tách đơn, mỗi lần bạn thực hiện phân tách, bạn có thể nhận được một tập hợp các điểm dữ liệu kiểm tra và kiểm tra khác nhau và sẽ không giúp bạn gỡ lỗi trong trường hợp bạn gặp sự cố.

Từ Đốc:

Nếu int, Randomstate là hạt giống được sử dụng bởi trình tạo số ngẫu nhiên; Nếu đối tượng RandomState, Randomstate là trình tạo số ngẫu nhiên; Nếu Không, trình tạo số ngẫu nhiên là phiên bản RandomState được sử dụng bởi np.random.


Lời giải thích hay. Tôi chỉ nói thêm rằng, một lý do tại sao chúng ta sẽ vượt qua trạng thái ngẫu nhiên là, ví dụ nếu chúng ta cố gắng tối ưu hóa siêu âm, chúng ta không muốn có sự thay đổi về điểm số do các khởi tạo khác nhau dựa trên các số ngẫu nhiên, có thể bao gồm hoặc ẩn hiệu quả của việc tối ưu hóa thực tế và do đó chúng tôi không thể xác định phần nào của thay đổi điểm là do thay đổi tham số và điều gì là do trạng thái bắt đầu khác nhau của RNG.
jottbe

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

Tách các mảng hoặc ma trận thành các tập con ngẫu nhiên và kiểm tra

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

Nếu int, Random_state là hạt giống được sử dụng bởi trình tạo số ngẫu nhiên; Nếu đối tượng RandomState, Random_state là trình tạo số ngẫu nhiên; Nếu Không, trình tạo số ngẫu nhiên là đối tượng RandomState được sử dụng bởi np.random. nguồn: http://scikit-learn.org/urdy/modules/generated/sklearn.model_selection.train_test_split.html

'' 'Về trạng thái ngẫu nhiên, nó được sử dụng trong nhiều thuật toán ngẫu nhiên trong sklearn để xác định hạt ngẫu nhiên được truyền cho bộ tạo số giả ngẫu nhiên. Do đó, nó không chi phối bất kỳ khía cạnh nào trong hành vi của thuật toán. Kết quả là, các giá trị trạng thái ngẫu nhiên thực hiện tốt trong bộ xác thực không tương ứng với các giá trị trạng thái sẽ hoạt động tốt trong một bộ thử nghiệm mới, chưa thấy. Thật vậy, tùy thuộc vào thuật toán, bạn có thể thấy các kết quả hoàn toàn khác nhau bằng cách thay đổi thứ tự các mẫu đào tạo. '' 'Nguồn: /stats/263999/is-random-state-a-parameter -để điều chỉnh

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.