簡體   English   中英

在 sklearn model 中丟失隨機性

[英]Lossing randomness in sklearn model

我遇到了一個非常奇怪的情況。

我正在嘗試在 sklearn 中使用 SVM 進行二進制分類任務。 這是我的代碼:

  scaler = StandardScaler()
  x_train = scaler.fit_transform(x_train)
  x_test = scaler.transform(x_test)

  svc = SVC(kernel='rbf', class_weight='balanced', gamma='auto',probability=True)
  
  c_range = np.logspace(-5, 15, 11, base=2)
  gamma_range = np.logspace(-9, 3, 13, base=2)
  param_grid = [{'kernel': ['rbf'], 'C': c_range, 'gamma': gamma_range}]
  grid = GridSearchCV(svc, param_grid, cv=5, n_jobs=-1)
  clf = grid.fit(x_train, y_train)
  predictions = grid.predict(x_test)

如您所見,這是一個非常簡單的 model,其中x_train是訓練數據的輸入, x_test是測試數據的輸入, y_train是訓練數據的 label。

我的問題是,既然我沒有設置任何種子,為什么這段代碼總是重現相同的結果? 據我了解,隨機性應該存在於我的 model 中,並且至少應該有一些變體結果。


讓我稍微清楚一點,我並不是在抱怨我的 model 只預測所有測試數據的相同 class。 我抱怨即使我設置了不同的種子,我的 model 仍然產生一致的結果。

例如,假設我有 3 個測試數據。 當我將種子設置為 1 或 2 或其他時,測試數據的預測總是 [1,0,1]。


我嘗試設置不同的種子,更改 model 中的 random_state。 沒有任何效果。 我的訓練數據很小,只有幾百個。 測試數據更大,有數千條數據。

下面的代碼將為 SVC 中不同的random_state值返回不同的 class 概率。 預測的類在不同的運行中是相同的這一事實僅僅意味着數據點所屬的類沒有太多的歧義。 換句話說,如果您的數據點看起來像這樣,它們很容易分離,並且具有不同種子的模型會將相同的類分配給相同的點。

In practice, if a first model assigns for instance to a data point the probabilities {A: 0.942, B: 0.042, C: 0.016} and another model with a different seed assigns the probabilities {A: 0.917, B: 0.048, C: 0.035},那么這兩個模型將在這一點上預測相同的 class A。

import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split, GridSearchCV

data = load_wine()
X = data.data
y = data.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

scaler = StandardScaler()
x_train = scaler.fit_transform(X_train)
x_test = scaler.transform(X_test)

svc = SVC(kernel='rbf', class_weight='balanced', gamma='auto', probability=True, random_state=50)

c_range = np.logspace(-5, 15, 11, base=2)
gamma_range = np.logspace(-9, 3, 13, base=2)
param_grid = [{'kernel': ['rbf'], 'C': c_range, 'gamma': gamma_range}]
grid = GridSearchCV(svc, param_grid, cv=5, n_jobs=-1)
clf = grid.fit(x_train, y_train)

predictions = grid.predict_proba(x_test)
print(predictions)

此外,您的大部分數據應該用於訓練,而不是用於測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM