SVM sklearn 上的随机种子产生不同的结果

Posted

技术标签:

【中文标题】SVM sklearn 上的随机种子产生不同的结果【英文标题】:Random seed on SVM sklearn produces different results 【发布时间】:2018-06-04 00:43:44 【问题描述】:

当我运行 SVM 时,即使使用固定的random_state=42,我也会得到不同的结果。

我有 10 个类和一个包含 200 个示例的数据集。我的数据集的维度dim_dataset=(200,2048)

这是我的代码:

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.svm import LinearSVC
from sklearn import svm
import random
random.seed(42)

def shuffle_data(x,y):
    idx = np.random.permutation(len(x))
    x_data= x[idx]
    y_labels=y[idx]
    return x_data,y_labels

d,l=shuffle_data(dataset,true_labels) # dim_d=(200,2048) , dim_l=(200,)

X_train, X_test, y_train, y_test = train_test_split(d, l, test_size=0.30, random_state=42)

# hist intersection kernel
gramMatrix = histogramIntersection(X_train, X_train)
clf_gram = svm.SVC(kernel='precomputed', random_state=42).fit(gramMatrix, y_train)
predictMatrix = histogramIntersection(X_test, X_train)
SVMResults = clf_gram.predict(predictMatrix)
correct = sum(1.0 * (SVMResults == y_test))
accuracy = correct / len(y_test)
print("SVM (Histogram Intersection): " + str(accuracy) + " (" + str(int(correct)) + "/" + str(len(y_test)) + ")")


# libsvm linear kernel
clf_linear_kernel = svm.SVC(kernel='linear', random_state=42).fit(X_train, y_train)
predicted_linear = clf_linear_kernel.predict(X_test)
correct_linear_libsvm = sum(1.0 * (predicted_linear == y_test))
accuracy_linear_libsvm = correct_linear_libsvm / len(y_test)
print("SVM (linear kernel libsvm): " + str(accuracy_linear_libsvm) + " (" + str(int(correct_linear_libsvm)) + "/" + str(len(y_test)) + ")")

# liblinear linear kernel

clf_linear_kernel_liblinear = LinearSVC(random_state=42).fit(X_train, y_train)
predicted_linear_liblinear = clf_linear_kernel_liblinear.predict(X_test)
correct_linear_liblinear = sum(1.0 * (predicted_linear_liblinear == y_test))
accuracy_linear_liblinear = correct_linear_liblinear / len(y_test)
print("SVM (linear kernel liblinear): " + str(accuracy_linear_liblinear) + " (" + str(
        int(correct_linear_liblinear)) + "/" + str(len(y_test)) + ")")

我的代码有什么问题?

【问题讨论】:

【参考方案1】:

像这样使用numpy.random.seed() 而不是简单的random.seed

np.random.seed(42)

Scikit 在内部使用 numpy 生成随机数,因此仅执行 random.seed 不会影响仍然是随机的 numpy 的行为。

请查看以下链接以获得更好的理解:

Should I use `random.seed` or `numpy.random.seed` to control random number generation in `scikit-learn`? http://scikit-learn.org/stable/developers/utilities.html#validation-tools

【讨论】:

以上是关于SVM sklearn 上的随机种子产生不同的结果的主要内容,如果未能解决你的问题,请参考以下文章

两个不同的种子产生相同的“随机”序列

sklearn 的 train_test_split 中的 random_state 参数

SylixOS下获取随机数方法

如何获得sklearn的当前随机种子? [复制]

sqlserver 中rand()是产生随机数,为啥还要设置种子?

参数变化:固定,但运行的种子不同