【问题标题】:ConvergenceWarning when running cross validation with SVM model使用 SVM 模型运行交叉验证时出现 ConvergenceWarning
【发布时间】:2023-03-16 21:06:01
【问题描述】:

我尝试训练一个 LinearSVC 模型,并在我创建的线性可分数据集上使用 cross_val_score 对其进行评估,但出现错误。

这是一个可重现的例子:

from sklearn.model_selection import cross_val_score, train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd


# creating the dataset
x1          = 2 * np.random.rand(100, 1)
y1          = 5 + 3 * x1 + np.random.randn(100, 1)
lable1  = np.zeros((100, 1))

x2          = 2 * np.random.rand(100, 1)
y2          = 15 + 3 * x2 + np.random.randn(100, 1)
lable2  = np.ones((100, 1))

x       = np.concatenate((x1, x2))
y       = np.concatenate((y1, y2))
lable = np.concatenate((lable1, lable2))

x       = np.reshape(x, (len(x),))
y       = np.reshape(y, (len(y),))
lable = np.reshape(lable, (len(lable),))

d   = {'x':x, 'y':y, 'lable':lable}
df  = pd.DataFrame(data=d)
df.plot(kind="scatter", x="x", y="y")



# preparing data and model
train_set, test_set = train_test_split(df, test_size=0.2, random_state=42)
X = train_set.drop("lable", axis=1)
y = train_set["lable"].copy()

scaler = StandardScaler()
scaler.fit_transform(X)

linear_svc = LinearSVC(C=5, loss="hinge", random_state=42)
linear_svc.fit(X, y)



# evaluation
scores = cross_val_score(linear_svc, X, y, scoring="neg_mean_squared_error", cv=10)
rmse_scores = np.sqrt(-scores)
print("Mean:", rmse_scores.mean())

输出:

平均值:0.0

/usr/local/lib/python3.7/dist-packages/sklearn/svm/_base.py:947: ConvergenceWarning: Liblinear 收敛失败,增加迭代次数。 "迭代次数。", ConvergenceWarning)

【问题讨论】:

    标签: python machine-learning scikit-learn svm


    【解决方案1】:

    这不是错误,而是警告,并且已经包含一些建议:

    增加迭代次数

    默认为 1000 (docs)。

    此外,LinearSVC 是一个分类器,因此在cross_val_score 中使用scoring="neg_mean_squared_error"(即回归度量)是没有意义的;请参阅documentation,了解每种问题的相关指标的粗略列表。

    因此,进行以下更改:

    linear_svc = LinearSVC(C=5, loss="hinge", random_state=42, max_iter=100000)
    scores = cross_val_score(linear_svc, X, y, scoring="accuracy", cv=10)
    

    您的代码运行正常,没有任何错误或警告。

    【讨论】:

      猜你喜欢
      • 2014-04-02
      • 2016-05-24
      • 2016-09-30
      • 2016-06-23
      • 2018-10-13
      • 2020-06-01
      • 2016-01-16
      • 2012-06-10
      • 1970-01-01
      相关资源
      最近更新 更多