我正在测试几种机器学习分类模型,在本例中是支持向量机。我对SVM算法及其工作原理有一定的基本了解。
我使用的是scikit-learn内置的乳腺癌数据集。
from sklearn.datasets import load_breast_cancerfrom sklearn.model_selection import train_test_splitfrom sklearn.svm import LinearSVC
使用以下代码:
cancer = load_breast_cancer()X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, stratify=cancer.target, random_state=42)clf2 = LinearSVC(C=0.01).fit(X_train, y_train)clf3 = LinearSVC(C=0.1).fit(X_train, y_train)clf4 = LinearSVC(C=1).fit(X_train, y_train)clf5 = LinearSVC(C=10).fit(X_train, y_train)clf6 = LinearSVC(C=100).fit(X_train, y_train)
当打印分数时,如下所示:
print("模型训练分数,C=0.01:\n{:.3f}".format(clf2.score(X_train, y_train)))print("模型测试分数,C=0.01:\n{:.3f}".format(clf2.score(X_test, y_test)))print("------------------------------")print("模型训练分数,C=0.1:\n{:.3f}".format(clf3.score(X_train, y_train)))print("模型测试分数,C=0.1:\n{:.3f}".format(clf3.score(X_test, y_test)))print("------------------------------")print("模型训练分数,C=1:\n{:.3f}".format(clf4.score(X_train, y_train)))print("模型测试分数,C=1:\n{:.3f}".format(clf4.score(X_test, y_test)))print("------------------------------")print("模型训练分数,C=10:\n{:.3f}".format(clf5.score(X_train, y_train)))print("模型测试分数,C=10:\n{:.3f}".format(clf5.score(X_test, y_test)))print("------------------------------")print("模型训练分数,C=100:\n{:.3f}".format(clf6.score(X_train, y_train)))print("模型测试分数,C=100:\n{:.3f}".format(clf6.score(X_test, y_test)))
当我运行这段代码时,我会得到不同正则化参数C的特定分数。当我再次运行.fit行(即再次训练它们)时,这些分数完全不同。有时甚至差异很大(例如,对于相同的C值,分数可能在72%和90%之间)。
这种变异性从何而来?我原以为,如果我使用相同的random_state参数,它总是会找到相同的支持向量,从而给我相同的结果,但由于当我再次训练模型时分数会变化,显然情况并非如此。例如,在逻辑回归中,无论我是否再次运行.fit代码,分数总是保持一致的。
解释这种准确性分数的变异性将非常有帮助!
回答:
当然。你需要将random_state=None
固定为一个特定的种子,这样你才能重现结果。
否则,你使用默认的random_state=None
,因此,每次你调用命令时,都会使用一个随机种子,这就是你得到这种变异性的原因。
使用:
cancer = load_breast_cancer()X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, stratify=cancer.target, random_state=42)clf2 = LinearSVC(C=0.01,random_state=42).fit(X_train, y_train)clf3 = LinearSVC(C=0.1, random_state=42).fit(X_train, y_train)clf4 = LinearSVC(C=1, random_state=42).fit(X_train, y_train)clf5 = LinearSVC(C=10, random_state=42).fit(X_train, y_train)clf6 = LinearSVC(C=100, random_state=42).fit(X_train, y_train)