【问题标题】:Lossing randomness in sklearn model在 sklearn 模型中丢失随机性
【发布时间】:2021-05-22 07:38:00
【问题描述】:

我遇到了一个非常奇怪的情况。

我正在尝试在 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)

如您所见,这是一个非常简单的模型,其中x_train 是训练数据的输入,x_test 是测试数据的输入,y_train 是训练数据的标签。

我的问题是,既然我没有设置任何种子,为什么这段代码总是重现相同的结果?在我的理解中,随机性应该存在于我的模型中,并且应该至少有一些变体结果。


让我稍微清楚一点,我并不是在抱怨我的模型只为所有测试数据预测同一个类别。我抱怨即使我设置了不同的种子,我的模型仍然会产生一致的结果。

例如,假设我有 3 个测试数据。当我将种子设置为 1 或 2 或其他时,测试数据的预测总是 [1,0,1]。


我尝试设置不同的种子,改变模型中的 random_state。没有任何效果。 我的训练数据很小,只有几百个。测试数据更大,有数千条数据。

【问题讨论】:

    标签: python machine-learning scikit-learn svm


    【解决方案1】:

    下面的代码将为 SVC 中 random_state 的不同值返回不同的类概率。预测的类在不同的运行中是相同的这一事实仅仅意味着数据点所属的类没有太多的歧义。换句话说,如果您的数据点看起来像 this,它们很容易分离,并且具有不同种子的模型会将相同的类分配给相同的点。

    在实践中,例如,如果第一个模型将概率 {A: 0.942, B: 0.042, C: 0.016} 分配给数据点,另一个具有不同种子的模型分配概率 {A: 0.917, B: 0.048 , C: 0.035},那么两个模型都将针对这一点预测相同的 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)
    

    此外,您的大部分数据都应该用于训练,而不是测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-02
      • 2021-05-04
      • 2012-09-11
      • 2019-11-08
      • 2017-05-14
      • 2016-08-29
      • 1970-01-01
      • 2018-10-09
      相关资源
      最近更新 更多