支持向量机模型分数在Python的scikit-learn中的变异性/随机性

我正在测试几种机器学习分类模型,在本例中是支持向量机。我对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)

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注