質問するログイン新規登録

回答編集履歴

4

edit

2018/03/26 12:23

投稿

mkgrei
mkgrei

スコア8562

answer CHANGED
@@ -111,4 +111,7 @@
111
111
  ![広がったガウシアン](0ad73d4bbe9e4c92c1f070ada5abba0c.png)
112
112
 
113
113
  局在したガウシアンの場合(gamma=10000.)
114
- ![局在したガウシアン](36a1f12aca19dd741317073a61149f14.png)
114
+ ![局在したガウシアン](36a1f12aca19dd741317073a61149f14.png)
115
+
116
+ CVしたガウシアンの場合
117
+ ![最適化したガウシアン](2cd5ffe22ffcfa5b089ce81be2420892.png)

3

edit

2018/03/26 12:23

投稿

mkgrei
mkgrei

スコア8562

answer CHANGED
@@ -110,5 +110,5 @@
110
110
  広がったガウシアンの場合(gamma=0.000001)
111
111
  ![広がったガウシアン](0ad73d4bbe9e4c92c1f070ada5abba0c.png)
112
112
 
113
- 局在したガウシアン(gamma=10000.)
113
+ 局在したガウシアンの場合(gamma=10000.)
114
114
  ![局在したガウシアン](36a1f12aca19dd741317073a61149f14.png)

2

edit

2018/03/26 12:15

投稿

mkgrei
mkgrei

スコア8562

answer CHANGED
@@ -99,4 +99,16 @@
99
99
  CV(get_OvO, *load())
100
100
  print('OneHot')
101
101
  CV(get_OneHot, *load(fonehot=True))
102
- ```
102
+ ```
103
+
104
+ ---
105
+
106
+ 追記
107
+
108
+ IrisのXに2変数を使って平面上に射影したときの境界線。
109
+
110
+ 広がったガウシアンの場合(gamma=0.000001)
111
+ ![広がったガウシアン](0ad73d4bbe9e4c92c1f070ada5abba0c.png)
112
+
113
+ 局在したガウシアン(gamma=10000.)
114
+ ![局在したガウシアン](36a1f12aca19dd741317073a61149f14.png)

1

edit

2018/03/26 12:15

投稿

mkgrei
mkgrei

スコア8562

answer CHANGED
@@ -2,4 +2,101 @@
2
2
 
3
3
  http://scikit-learn.org/stable/modules/svm.html
4
4
 
5
- sklearnのSVCはOne-vs-Oneで実装されていませんか?
5
+ sklearnのSVCはOne-vs-Oneで実装されていませんか?
6
+
7
+ ---
8
+
9
+ 簡単なIrisに対してのコード。
10
+
11
+ SVCをもうすでに使っているのならマルチクラスを分類できない理由は特にないように思いましたが…
12
+
13
+ ```python
14
+ import numpy as np
15
+
16
+ from sklearn.datasets import load_iris
17
+
18
+ from sklearn.preprocessing import OneHotEncoder
19
+ from sklearn.metrics import accuracy_score
20
+ from sklearn.model_selection import StratifiedKFold
21
+ from sklearn.model_selection import RandomizedSearchCV
22
+
23
+ from sklearn.svm import SVC
24
+ from sklearn.multiclass import OneVsRestClassifier, OneVsOneClassifier
25
+ from sklearn.multioutput import MultiOutputClassifier
26
+
27
+ def load(fonehot=False):
28
+ data = load_iris()
29
+
30
+ x = data['data']
31
+ y = data['target']
32
+ hs = y
33
+
34
+ if fonehot:
35
+ en = OneHotEncoder()
36
+ y = en.fit_transform(y.reshape(-1, 1)).toarray()
37
+
38
+ return x, y, hs
39
+
40
+ def get_SVC():
41
+ clf = SVC()
42
+ param_grid = {'kernel': ['rbf', 'linear'],
43
+ 'C': np.logspace(-10, 1, 1000),
44
+ 'gamma': np.logspace(-10, 1, 1000)}
45
+ clf = RandomizedSearchCV(clf, param_grid, cv=5, n_iter=100, random_state=2018)
46
+ return clf
47
+
48
+ def get_OvR():
49
+ clf = SVC()
50
+ clf = OneVsRestClassifier(clf)
51
+ param_grid = {'estimator__kernel': ['rbf', 'linear'],
52
+ 'estimator__C': np.logspace(-10, 1, 1000),
53
+ 'estimator__gamma': np.logspace(-10, 1, 1000)}
54
+ clf = RandomizedSearchCV(clf, param_grid, cv=5, n_iter=100, random_state=2018)
55
+ return clf
56
+
57
+ def get_OvO():
58
+ clf = SVC()
59
+ clf = OneVsOneClassifier(clf)
60
+ param_grid = {'estimator__kernel': ['rbf', 'linear'],
61
+ 'estimator__C': np.logspace(-10, 1, 1000),
62
+ 'estimator__gamma': np.logspace(-10, 1, 1000)}
63
+ clf = RandomizedSearchCV(clf, param_grid, cv=5, n_iter=100, random_state=2018)
64
+ return clf
65
+
66
+ def get_OneHot():
67
+ clf = SVC()
68
+ clf = MultiOutputClassifier(clf)
69
+ param_grid = {'estimator__kernel': ['rbf', 'linear'],
70
+ 'estimator__C': np.logspace(-10, 1, 1000),
71
+ 'estimator__gamma': np.logspace(-10, 1, 1000)}
72
+ clf = RandomizedSearchCV(clf, param_grid, cv=5, n_iter=100, random_state=2018)
73
+ return clf
74
+
75
+ def CV(get_clf, x, y, hs, n_splits=3):
76
+ kf = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=2018)
77
+ s_s = []
78
+ pss = []
79
+ for tr, ts in kf.split(x, hs):
80
+ x_ = x[tr]
81
+ y_ = y[tr]
82
+ px = x[ts]
83
+ py = y[ts]
84
+ clf = get_clf()
85
+ clf.fit(x_, y_)
86
+ s_ = accuracy_score(y_, clf.predict(x_))
87
+ ps = accuracy_score(py, clf.predict(px))
88
+ s_s.append(s_)
89
+ pss.append(ps)
90
+ print('train: {0:7.4f} {1:7.4f}'.format(np.mean(s_s), np.std(s_s)))
91
+ print('test: {0:7.4f} {1:7.4f}'.format(np.mean(pss), np.std(pss)))
92
+
93
+ if __name__ == '__main__':
94
+ print('SVC(Implemented with One-vs-one)')
95
+ CV(get_SVC, *load())
96
+ print('OneVsRest')
97
+ CV(get_OvR, *load())
98
+ print('OneVsOne')
99
+ CV(get_OvO, *load())
100
+ print('OneHot')
101
+ CV(get_OneHot, *load(fonehot=True))
102
+ ```