对同一数据源使用LinearSVC和SGDClassifier训练

其实就是为了查看不同分类算法在相同数据源中的应用是否会产生不同的决策边界。以及不同的决策边界是否有收敛值。
使用sklearn自带的数据包iris。
在线性可分离数据集上训练“LinearSVC”。然后在同一个数据集上训练一个“SVC”和一个“sgdclassizer”。
导入数据:

from sklearn import datasets

iris = datasets.load_iris()
X = iris["data"][:, (2, 3)]  # 使用花瓣长、宽属性
y = iris["target"]
setosa_or_versicolor = (y == 0) | (y == 1)
X = X[setosa_or_versicolor]
y = y[setosa_or_versicolor]
#建立模型
from sklearn.svm import SVC, LinearSVC
from sklearn.linear_model import SGDClassifier
from sklearn.preprocessing import StandardScaler
C = 5
alpha = 1 / (C * len(X))
lin_clf = LinearSVC(loss="hinge", C=C, random_state=42)#线性svc模型
svm_clf = SVC(kernel="linear", C=C)#svc模型选取内核为线性的线性Svc模型
sgd_clf = SGDClassifier(loss="hinge", learning_rate="constant", eta0=0.001, alpha=alpha,
                        max_iter=100000, tol=-np.infty, random_state=42)#随机梯度下降分类模型。
     
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)#将X数据集标准差标准化
lin_clf.fit(X_scaled, y)
svm_clf.fit(X_scaled, y)
sgd_clf.fit(X_scaled, y)#分别用三个模型训练标准化的数据集
print("LinearSVC:                   ", lin_clf.intercept_, lin_clf.coef_)
print("SVC:                         ", svm_clf.intercept_, svm_clf.coef_)
print("SGDClassifier(alpha={:.5f}):".format(sgd_clf.alpha), sgd_clf.intercept_, sgd_clf.coef_)
#打印截距和线性参数

将数据处理为可以被三种分类方法接受的数据集,然后训练数据,打印数据的参数以及截距。
现在来画出他们的决策边界。

# 计算每个决策边界的斜率和偏差
w1 = -lin_clf.coef_[0, 0]/lin_clf.coef_[0, 1]
b1 = -lin_clf.intercept_[0]/lin_clf.coef_[0, 1]
w2 = -svm_clf.coef_[0, 0]/svm_clf.coef_[0, 1]
b2 = -svm_clf.intercept_[0]/svm_clf.coef_[0, 1]
w3 = -sgd_clf.coef_[0, 0]/sgd_clf.coef_[0, 1]
b3 = -sgd_clf.intercept_[0]/sgd_clf.coef_[0, 1]

# 将决策边界线转换回原始比例
line1 = scaler.inverse_transform([[-10, -10 * w1 + b1], [10, 10 * w1 + b1]])
line2 = scaler.inverse_transform([[-10, -10 * w2 + b2], [10, 10 * w2 + b2]])
line3 = scaler.inverse_transform([[-10, -10 * w3 + b3], [10, 10 * w3 + b3]])

# 画出决策边界
plt.figure(figsize=(11, 4))
plt.plot(line1[:, 0], line1[:, 1], "k:", label="LinearSVC")
plt.plot(line2[:, 0], line2[:, 1], "b--", linewidth=2, label="SVC")
plt.plot(line3[:, 0], line3[:, 1], "r-", label="SGDClassifier")
plt.plot(X[:, 0][y==1], X[:, 1][y==1], "bs") # label="Iris-Versicolor"
plt.plot(X[:, 0][y==0], X[:, 1][y==0], "yo") # label="Iris-Setosa"
plt.xlabel("Petal length", fontsize=14)
plt.ylabel("Petal width", fontsize=14)
plt.legend(loc="upper center", fontsize=14)
plt.axis([0, 5.5, 0, 2])
plt.show()

在这里插入图片描述
画出的图形对于三种算法的分类边界足够接近。
如果只是单纯的线性分类,使用LinearSVC模型的运算速度会远大于Svc模型。

猜你喜欢

转载自blog.csdn.net/lisenby/article/details/108579624