#### Загрузим датасет из библиотеки sklearn
```python=3.9
iris = datasets.load_iris()
X = iris.data
print("Dataset shape -", X.shape)
print("Dataset sample example -", *X[:1])
```
```protobuf=1
Dataset shape - (150, 4)
Dataset sample example - [5.1 3.5 1.4 0.2]
```
#### Разбиение выборки на тестовую и обу
```python=3.9
Y = iris.target
# Train size default = .25
X_train, X_test, Y_train, Y_test = model_selection.train_test_split(X, Y, random_state=222)
print(f'Train sample shape (source), (result) - {X_train.shape}, {Y_train.shape}')
print(f'Test sample shape (source), (result) - {X_test.shape}, {Y_test.shape}')
```
```protobuf=1
Train sample shape (source), (result) - (112, 4), (112,)
Test sample shape (source), (result) - (38, 4), (38,)
```
#### RBF
```python=3.9
C_array = np.logspace(-3, 3, num=7)
gamma_array = np.logspace(-5, 2, num=8)
svc = SVC(kernel='rbf')
grid = model_selection.GridSearchCV(svc, param_grid={'C': C_array, 'gamma': gamma_array})
grid.fit(X_train, Y_train)
info(name='radial', grid_search_cv=grid, gamma=True)
svc = SVC(kernel='rbf', C=grid.best_estimator_.C, gamma=grid.best_estimator_.gamma)
svc.fit(X_train, Y_train)
pfm(Y_test, svc.predict(X_test))
```
```protobuf=1
best radial
C = 1.0
CV error = 0.009090909090909038
gamma = 1.0
accuracy_score: 0.9210526315789473
confusion_matrix:
[[15 0 0]
[ 0 9 1]
[ 0 2 11]]
classification_report:
precision recall f1-score support
0 1.00 1.00 1.00 15
1 0.82 0.90 0.86 10
2 0.92 0.85 0.88 13
accuracy 0.92 38
macro avg 0.91 0.92 0.91 38
weighted avg 0.92 0.92 0.92 38
```
#### Линейное
```python=3.9
# Linear
C_array = np.logspace(-3, 3, num=7)
svc = SVC(kernel='linear')
grid = model_selection.GridSearchCV(svc, param_grid={'C': C_array})
grid.fit(X_train, Y_train)
info(name='linear', grid_search_cv=grid)
svc = SVC(kernel='linear', C=grid.best_estimator_.C)
svc.fit(X_train, Y_train)
pfm(Y_test, svc.predict(X_test))
# Linear ^===
```
```protobuf=1
best linear
C = 1.0
CV error = 0.009090909090909038
accuracy_score: 0.9473684210526315
confusion_matrix:
[[15 0 0]
[ 0 9 1]
[ 0 1 12]]
classification_report:
precision recall f1-score support
0 1.00 1.00 1.00 15
1 0.90 0.90 0.90 10
2 0.92 0.92 0.92 13
accuracy 0.95 38
macro avg 0.94 0.94 0.94 38
weighted avg 0.95 0.95 0.95 38
```
#### Полиномиальное
```python=3.9
# Poly
C_array = np.logspace(-5, 2, num=8)
gamma_array = np.logspace(-5, 2, num=8)
degree_array = [2, 3, 4]
svc = SVC(kernel='poly')
grid = model_selection.GridSearchCV(svc, param_grid={'C': C_array, 'gamma': gamma_array, 'degree': degree_array})
grid.fit(X_train, Y_train)
info(name='poly', grid_search_cv=grid, gamma=True, degree=True)
svc = SVC(kernel='poly', C=grid.best_estimator_.C,
gamma=grid.best_estimator_.gamma, degree=grid.best_estimator_.degree)
svc.fit(X_train, Y_train)
pfm(Y_test, svc.predict(X_test))
# Poly ^===
```
```protobuf=1
best poly
C = 1e-05
CV error = 0.009090909090909038
gamma = 100.0
degree = 2
accuracy_score: 0.9210526315789473
confusion_matrix:
[[15 0 0]
[ 0 9 1]
[ 0 2 11]]
classification_report:
precision recall f1-score support
0 1.00 1.00 1.00 15
1 0.82 0.90 0.86 10
2 0.92 0.85 0.88 13
accuracy 0.92 38
macro avg 0.91 0.92 0.91 38
weighted avg 0.92 0.92 0.92 38
```
#### Cигмоидное
```python=3.9
# Sigmoid
C_array = np.logspace(-3, 3, num=7)
gamma_array = np.logspace(-5, 2, num=8)
svc = SVC(kernel='sigmoid')
grid = model_selection.GridSearchCV(svc, param_grid={'C': C_array, 'gamma': gamma_array})
grid.fit(X_train, Y_train)
print('best sigmoid')
print(f'C = {grid.best_estimator_.C}')
print(f'CV error = {1 - grid.best_score_}')
print(f'gamma = {grid.best_estimator_.gamma}')
info(name='sigmoid', grid_search_cv=grid, gamma=True)
svc = SVC(kernel='sigmoid', C=grid.best_estimator_.C, gamma=grid.best_estimator_.gamma)
svc.fit(X_train, Y_train)
pfm(Y_test, svc.predict(X_test))
# Sigmoid ^===
```
```protobuf=1
best sigmoid
C = 1000.0
CV error = 0.009090909090909038
gamma = 0.001
best sigmoid
C = 1000.0
CV error = 0.009090909090909038
gamma = 0.001
accuracy_score: 0.9473684210526315
confusion_matrix:
[[15 0 0]
[ 0 9 1]
[ 0 1 12]]
classification_report:
precision recall f1-score support
0 1.00 1.00 1.00 15
1 0.90 0.90 0.90 10
2 0.92 0.92 0.92 13
accuracy 0.95 38
macro avg 0.94 0.94 0.94 38
weighted avg 0.95 0.95 0.95 38
```
#### Визуализация данных, используя PCA
```python=3.9
# 3D graph
# Size in inch
fig_size = (10, 10)
fig = plt.figure(1, figsize=fig_size)
axes = Axes3D(fig, elev=10, azim=75, auto_add_to_figure=False)
x_reduced = PCA(n_components=3).fit_transform(X)
axes.scatter(x_reduced[:, 0], x_reduced[:, 1], x_reduced[:, 2],
c=Y, cmap=plt.cm.Set1, edgecolor='k', s=40)
axes.set_title("PCA")
axes.set_xlabel("PCA 1-vector")
axes.w_xaxis.set_ticklabels([])
axes.set_ylabel("PCA 2-vector")
axes.w_yaxis.set_ticklabels([])
axes.set_zlabel("PCA 3-vector")
axes.w_zaxis.set_ticklabels([])
fig.add_axes(axes)
plt.show()
```

##### Вспомогательные функции
```python=3.9
def pfm(y_true, y_pred):
print("accuracy_score:", metrics.accuracy_score(y_true, y_pred), end='\n\n')
print("confusion_matrix:", metrics.confusion_matrix(y_true, y_pred), end='\n\n', sep='\n')
print("classification_report:", metrics.classification_report(y_true, y_pred), sep='\n')
def info(name: str, grid_search_cv: model_selection.GridSearchCV, gamma=None, degree=None):
if gamma is None:
gamma = False
if degree is None:
degree = False
print(f'best {name}')
print(f'C = {grid_search_cv.best_estimator_.C}')
print(f'CV error = {1 - grid_search_cv.best_score_}')
if gamma:
print(f'gamma = {grid_search_cv.best_estimator_.gamma}')
if degree:
print(f'degree = {grid.best_estimator_.degree}')
```