0%

Part1-支持向量机练习

Part1-支持向量机练习

支持向量机

1.1 数据可视化

1
2
3
4
from scipy.io import loadmat
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
1
2
3
4
data = loadmat('ex6data1.mat')
data = pd.DataFrame(data, columns=['x1','x2','y'])
X_0 = data[data.y==0]
X_1 = data[data.y==1]
1
2
3
plt.scatter(X_0['x1'],X_0['x2'],c='y')
plt.scatter(X_1['x1'],X_1['x2'],marker='+', c='black')
plt.show()

1.2 尝试\(C=1\)

1
2
3
4
import sklearn.svm
svc1 = sklearn.svm.LinearSVC(C=1, loss='hinge')
svc1.fit(data.iloc[:,:2], data['y'])
svc1.score(data.iloc[:,:2], data['y'])

0.9803921568627451

画出决策边界

1
2
3
4
5
6
7
8
9
plt.scatter(X_0['x1'],X_0['x2'],c='y')
plt.scatter(X_1['x1'],X_1['x2'],marker='+', c='black')
x1 = np.linspace(-0.5, 4.5, 500)
x2 = np.linspace(1.3, 5, 500)
xx1,xx2 = np.meshgrid(x1, x2)
y = svc1.predict(np.c_[xx1.ravel(), xx2.ravel()])
y = y.reshape(xx1.shape)
plt.contour(xx1, xx2, y)
plt.show()

高斯核SVM

### 2.1 数据可视化

1
2
3
4
from scipy.io import loadmat
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
1
2
3
4
data = loadmat('ex6data2.mat')
data = pd.DataFrame(np.concatenate((data['X'], data['y']), axis=1), columns=['x1','x2','y'])
X_0 = data[data['y']==0]
X_1 = data[data['y']==1]
1
2
3
plt.scatter(X_0['x1'], X_0['x2'], c='y')
plt.scatter(X_1['x1'], X_1['x2'], marker='+', c='black')
plt.show()

2.2 预测分类

1
2
3
4
import sklearn.svm
svc = sklearn.svm.SVC(C=100, kernel='rbf', gamma=10, probability=True)
svc.fit(data.iloc[:, :2], data['y'])
svc.score(data.iloc[:, :2], data['y'])
1
2
3
4
5
6
7
8
9
x1 = np.linspace(0, 1.1, 500)
x2 = np.linspace(0.4, 0.9, 500)
xx1, xx2 = np.meshgrid(x1, x2)
y = svc.predict(np.c_[xx1.ravel(), xx2.ravel()])
y = y.reshape(xx1.shape)
plt.scatter(X_0['x1'], X_0['x2'], c='y')
plt.scatter(X_1['x1'], X_1['x2'], marker='+', c='black')
plt.contour(xx1, xx2, y)
plt.show()

寻找最优参数

3.1 数据可视化

1
2
3
4
from scipy.io import loadmat
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
1
2
3
4
5
data_val = pd.DataFrame(np.concatenate((data['Xval'], data['yval']), axis=1), columns=['xval1','xval2','yval'])
data = loadmat('ex6data3.mat')
data = pd.DataFrame(np.concatenate((data['X'], data['y']), axis=1), columns=['x1','x2','y'])
X_0 = data[data['y']==0]
X_1 = data[data['y']==1]
1
2
3
plt.scatter(X_0['x1'], X_0['x2'], c='y')
plt.scatter(X_1['x1'], X_1['x2'], marker='+', c='black')
plt.show()

3.2 寻找最佳参数

1
2
candidate = [0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30, 100]
c_and_gamma = [(C, gamma) for C in candidate for gamma in candidate]
1
2
3
4
5
6
7
8
9
res = []
for C, gamma in c_and_gamma:
svc = sklearn.svm.SVC(C=C,gamma=gamma)
svc.fit(data.iloc[:, :2], data['y'])
res.append(svc.score(data_val.iloc[:, :2], data_val['yval']))
best_idx = np.argmax(res)
best_res = res[best_idx]
best_param = c_and_gamma[best_idx]
best_res, best_param

(0.965, (0.3, 100))

1
2
3
4
5
6
7
8
9
10
11
svc = sklearn.svm.SVC(C=best_param[0], kernel='rbf', gamma=best_param[1], probability=True)
svc.fit(data.iloc[:, :2], data['y'])
x1 = np.linspace(-0.6, 0.3, 500)
x2 = np.linspace(-0.7, 0.6, 500)
xx1, xx2 = np.meshgrid(x1, x2)
y = svc.predict(np.c_[xx1.ravel(), xx2.ravel()])
y = y.reshape(xx1.shape)
plt.scatter(X_0['x1'], X_0['x2'], c='y')
plt.scatter(X_1['x1'], X_1['x2'], marker='+', c='black')
plt.contour(xx1, xx2, y)
plt.show()

垃圾邮件分类

4.1 读取数据

1
2
3
4
from scipy.io import loadmat
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
1
2
3
4
data = loadmat('spamTrain.mat')
X, y= data['X'], data['y']
data_test = loadmat('spamTest.mat')
X_test, y_test = data_test['Xtest'], data_test['ytest']

4.2 预测分类

1
2
3
4
import sklearn.svm as svm
svc = svm.SVC()
svc.fit(X, y)
svc.score(X_test, y_test)

0.987

4.3 再用逻辑回归试试

1
2
3
4
from sklearn.linear_model import LogisticRegression
logit = LogisticRegression()
logit.fit(X, y)
logit.score(X_test, y_test)

0.994