1. 程式人生 > 其它 >機器學習中的random_state引數

機器學習中的random_state引數

作用:控制隨機狀態。

原因:為什麼需要用到這樣一個引數random_state(隨機狀態)?

在此先簡單羅列三種情況:
1、在構建模型時:

forest = RandomForestClassifier(n_estimators=100, random_state=0)
forest.fit(X_train, y_train)

2、在生成資料集時:

X, y = make_moons(n_samples=100, noise=0.25, random_state=3)

3、在拆分資料集為訓練集、測試集時:

X_train, X_test, y_train, y_test = train_test_split(
cancer.data, cancer.target, stratify=cancer.target, random_state=42)

如果不設定random_state的話會怎樣?
例如1中,每次構建的模型是不同的。
例如2中,每次生成的資料集是不同的。
例如3中,每次拆分出的訓練集、測試集是不同的。

之所以會這樣,是因為模型的構建、資料集的生成、資料集的拆分都是一個隨機的過程。

如果你希望結果可以重現,固定random_state是非常重要的。

對於隨機森林這個模型,它本質上是隨機的,設定不同的隨機狀態(或者不設定random_state引數)可以徹底改變構建的模型。
對於資料集的生成,它本質上也是隨機的,設定不同的隨機狀態(或者不設定random_state引數)可以徹底改變生成的資料集。
對於資料集的拆分,它本質上也是隨機的,設定不同的隨機狀態(或者不設定random_state引數)可以徹底改變拆分的結果。

固定random_state後,每次構建的模型是相同的、生成的資料集是相同的、每次的拆分結果也是相同的。

比如在sklearn KFold()中:
KFold(n_splits=’warn’, shuffle=False, random_state=None)
引數:
n_splits 表示劃分為幾塊(至少是2)

shuffle 表示是否打亂劃分,預設False,即不打亂

random_state 表示是否固定隨機起點,Used when shuffle == True.

random_state : int, RandomState instance or None, optional, default=None

If int, random_state is the seed used by the random number generator;

If RandomState instance, random_state is the random number generator;

If None, the random number generator is the RandomState instance used by `np.random`.

Only used when ``shuffle`` is True. This should be left to None if ``shuffle`` is False.

比如在sklearn的train_test_split中:
我們在使用sklearn的train_test_split函式隨機劃分資料集生成training set 於test set時,在函式train_test_split中有一個引數為random_state。

random_state:隨機數種子——其實就是該組隨機數的編號,在需要重複試驗的時候,保證得到一組一樣的隨機數。比如每次都為1,其他引數一樣的情況下你得到的隨機陣列是一樣的。當為None時,產生的隨機陣列也會是隨機的。

隨機數的產生取決於種子,隨機數和種子之間的關係遵從以下兩個規則:種子不同,產生不同的隨機數;種子相同,即使例項不同也產生相同的隨機數。

引數test_size:如果是浮點數,在0-1之間,表示test set的樣本佔比;如果是整數的話就表示test set樣本數量。

test_size只是確定training set於test set的各自所佔比例或者數量,並沒有確定資料的劃分規則。比如我們有資料集[1,2,3,4,5,6,7,8,9],我們確定test_size=3,那問題是我們應該取哪三個數作為test set呢,這時候就應該使用random_state來確定我們的劃分規則,假設我們取random_state=1,它按一定的規則去取出我們的資料,當我們random_state=2時,它又換成另一種規則去取我們的資料,random_state的取值範圍為0-2^32。當random_state=None時,可以理解為隨機分配一個整數給random_state,這樣就導致每次執行的結果都可能不同。

其他函式中的random_state引數功能是類似的。