Blame view

mmodel/svm/SVM.py 5.44 KB
c7fa1d60   Chunk   refractoration st...
1
2
3
4
5
6
7
'''
SVM Model.

@author: chunk
chunkplus@gmail.com
2014 Dec
'''
e3e7e73a   Chunk   spider standalone...
8
from ...mfeat import *
2bf33465   Chunk   staged.
9
10
11
from ...mmodel import *
from ...mmodel.svm.svmutil import *
from ...mspark import SC
e3e7e73a   Chunk   spider standalone...
12
from ...common import *
2bf33465   Chunk   staged.
13

c7fa1d60   Chunk   refractoration st...
14
import numpy as np
c7fa1d60   Chunk   refractoration st...
15
import pickle
84648488   Chunk   reverted.
16
17
from sklearn import svm

c7fa1d60   Chunk   refractoration st...
18
dict_Train = {}
84648488   Chunk   reverted.
19
dict_databuf = {}
c7fa1d60   Chunk   refractoration st...
20
21
dict_tagbuf = {}
dict_featbuf = {}
e3e7e73a   Chunk   spider standalone...
22

84648488   Chunk   reverted.
23

c7fa1d60   Chunk   refractoration st...
24
25
26
27
28
29
30
class ModelSVM(ModelBase):
    def __init__(self, toolset='sklearn', sc=None):
        ModelBase.__init__(self)
        self.toolset = toolset
        self.sparker = sc

    def _train_libsvm(self, X, Y):
02528074   Chunk   staged.
31
        X, Y = list(X), list(Y)
c7fa1d60   Chunk   refractoration st...
32
        # X, Y = [float(i) for i in X], [float(i) for i in Y]
f20e20ce   Chunk   staged.
33
        prob = svm_problem(Y, X)
02528074   Chunk   staged.
34
        param = svm_parameter('-t 0 -c 4 -b 1 -h 0')
c7fa1d60   Chunk   refractoration st...
35
        # param = svm_parameter(kernel_type=LINEAR, C=10)
84648488   Chunk   reverted.
36
        m = svm_train(prob, param)
10b4f63f   Chunk   staged. Before Pa...
37
        svm_save_model('res/svm_libsvm.model', m)
5ec38adb   Chunk   spark-local of da...
38

d0be60e7   Chunk   jpeg update.
39
        self.model = m
a9c10957   Chunk   hbase-svm & spark...
40

10b4f63f   Chunk   staged. Before Pa...
41
42
        return m

a9c10957   Chunk   hbase-svm & spark...
43
    def _predict_libsvm(self, feat, model=None):
e3e7e73a   Chunk   spider standalone...
44
        if model is None:
a9c10957   Chunk   hbase-svm & spark...
45
46
47
48
49
            if self.model != None:
                model = self.model
            else:
                print 'loading model ...'
                model = svm_load_model('res/svm_libsvm.model')
f20e20ce   Chunk   staged.
50

a9c10957   Chunk   hbase-svm & spark...
51
52
53
54
        feat = [list(feat)]
        # print len(feat),[0] * len(feat)
        label, _, _ = svm_predict([0] * len(feat), feat, model)
        return label
1c2a3fa0   Chunk   staged.
55

e3e7e73a   Chunk   spider standalone...
56
    def _test_libsvm(self, X, Y, model=None):
a9c10957   Chunk   hbase-svm & spark...
57
        if model is None:
5ec38adb   Chunk   spark-local of da...
58
59
60
            if self.model != None:
                model = self.model
            else:
a9c10957   Chunk   hbase-svm & spark...
61
62
                print 'loading model ...'
                model = svm_load_model('res/svm_libsvm.model')
84648488   Chunk   reverted.
63

f20e20ce   Chunk   staged.
64
        X, Y = list(X), list(Y)
a9c10957   Chunk   hbase-svm & spark...
65
66
67
68
        p_labs, p_acc, p_vals = svm_predict(Y, X, model)
        # ACC, MSE, SCC = evaluations(Y, p_labs)

        return p_acc
1c2a3fa0   Chunk   staged.
69

e3e7e73a   Chunk   spider standalone...
70
    def _train_sklearn(self, X, Y):
a9c10957   Chunk   hbase-svm & spark...
71
        clf = svm.SVC(C=4, kernel='linear', shrinking=False, verbose=True)
5ec38adb   Chunk   spark-local of da...
72
        clf.fit(X, Y)
a9c10957   Chunk   hbase-svm & spark...
73
74
75
76
        with open('res/svm_sk.model', 'wb') as modelfile:
            model = pickle.dump(clf, modelfile)

        self.model = clf
c7fa1d60   Chunk   refractoration st...
77

1c2a3fa0   Chunk   staged.
78
79
        return clf

9371f8fa   Chunk   SVM param engenee...
80
    def _predict_sklearn(self, feat, model=None):
e3e7e73a   Chunk   spider standalone...
81
        """N.B. sklearn.svm.base.predict :
9371f8fa   Chunk   SVM param engenee...
82
            Perform classification on samples in X.
c7fa1d60   Chunk   refractoration st...
83
                Parameters
9371f8fa   Chunk   SVM param engenee...
84
                ----------
c7fa1d60   Chunk   refractoration st...
85
                X : {array-like, sparse matrix}, shape = [n_samples, n_features]
9371f8fa   Chunk   SVM param engenee...
86

c7fa1d60   Chunk   refractoration st...
87
                Returns
84648488   Chunk   reverted.
88
                -------
f20e20ce   Chunk   staged.
89
                y_pred : array, shape = [n_samples]
be12257b   Chunk   data-feat-model f...
90
91
92
93
94
                    Class labels for samples in X.
        """
        if model is None:
            if self.model != None:
                model = self.model
c7fa1d60   Chunk   refractoration st...
95
            else:
be12257b   Chunk   data-feat-model f...
96
97
98
99
100
101
102
103
104
                print 'loading model ...'
                with open('res/svm_sklearn.model', 'rb') as modelfile:
                    model = pickle.load(modelfile)

        return model.predict(feat)

    def __test_sklearn(self, X, Y, model=None):
        if model is None:
            if self.model != None:
1c2a3fa0   Chunk   staged.
105
                model = self.model
e3e7e73a   Chunk   spider standalone...
106
            else:
be12257b   Chunk   data-feat-model f...
107
                print 'loading model ...'
c7fa1d60   Chunk   refractoration st...
108
                with open('res/svm_sklearn.model', 'rb') as modelfile:
be12257b   Chunk   data-feat-model f...
109
                    model = pickle.load(modelfile)
c7fa1d60   Chunk   refractoration st...
110

9371f8fa   Chunk   SVM param engenee...
111
        result_Y = np.array(self._predict_sklearn(X, model))
be12257b   Chunk   data-feat-model f...
112
113
114
115

        fp = 0
        tp = 0
        sum = np.sum(np.array(Y) == 1)
1c2a3fa0   Chunk   staged.
116
        positive, negative = np.sum(np.array(Y) == 1), np.sum(np.array(Y) == 0)
e3e7e73a   Chunk   spider standalone...
117
        print positive, negative
be12257b   Chunk   data-feat-model f...
118
        for i in range(len(Y)):
c7fa1d60   Chunk   refractoration st...
119
            if Y[i] == 0 and result_Y[i] == 1:
f20e20ce   Chunk   staged.
120
                fp += 1
c7fa1d60   Chunk   refractoration st...
121
            elif Y[i] == 1 and result_Y[i] == 1:
13a594f1   Chunk   before 中期答辩~~~
122
123
124
125
126
127
128
129
130
131
132
                tp += 1
        return float(fp) / negative, float(tp) / positive, np.mean(Y == result_Y)

    def _test_sklearn(self, X, Y, model=None):
        if model is None:
            if self.model != None:
                model = self.model
            else:
                print 'loading model ...'
                with open('res/svm_sklearn.model', 'rb') as modelfile:
                    model = pickle.load(modelfile)
c7fa1d60   Chunk   refractoration st...
133

9371f8fa   Chunk   SVM param engenee...
134
        return model.score(X, Y)
1c2a3fa0   Chunk   staged.
135

9371f8fa   Chunk   SVM param engenee...
136
137
138
139
    def _train_spark(self, X, Y=None):
        if self.sparker == None:
            self.sparker = SC.Sparker(host='HPC-server', appname='ImageCV',
                                      master='spark://HPC-server:7077')
e3e7e73a   Chunk   spider standalone...
140

9371f8fa   Chunk   SVM param engenee...
141
        self.model = self.sparker.train_svm(X, Y)
1c2a3fa0   Chunk   staged.
142
143
144

        return svm

84648488   Chunk   reverted.
145
146
147
148
    def _predict_spark(self, feat, model=None):
        return self.sparker.predict_svm(feat, model)

    def _test_spark(self, X, Y, model=None):
f4fb4381   Chunk   staged.
149
        return self.sparker.test_svm(X, Y, model)
84648488   Chunk   reverted.
150
151
152
153
154

    def train(self, X, Y=None):

        if self.toolset == 'sklearn':
            return self._train_sklearn(X, Y)
e3e7e73a   Chunk   spider standalone...
155
        elif self.toolset == 'libsvm':
84648488   Chunk   reverted.
156
157
158
159
160
161
162
163
164
165
166
167
            return self._train_libsvm(X, Y)
        elif self.toolset == 'spark':
            return self._train_spark(X, Y)
        else:
            raise Exception("Unknown toolset!")

    def predict(self, feat, model=None):

        if self.toolset == 'sklearn':
            return self._predict_sklearn(feat, model)
        elif self.toolset == 'libsvm':
            return self._predict_libsvm(feat, model)
e3e7e73a   Chunk   spider standalone...
168
        elif self.toolset == 'spark':
84648488   Chunk   reverted.
169
170
171
172
173
174
175
176
177
178
179
180
            return self._predict_spark(feat, model)
        else:
            raise Exception("Unknown toolset!")

    def test(self, X, Y=None, model=None):

        if self.toolset == 'sklearn':
            return self.__test_sklearn(X, Y, model)
        elif self.toolset == 'libsvm':
            return self._test_libsvm(X, Y, model)
        elif self.toolset == 'spark':
            return self._test_spark(X, Y, model)
e3e7e73a   Chunk   spider standalone...
181
        else:
84648488   Chunk   reverted.
182
            raise Exception("Unknown toolset!")
f4fb4381   Chunk   staged.

84648488   Chunk   reverted.

f4fb4381   Chunk   staged.

84648488   Chunk   reverted.

02528074   Chunk   staged.

f20e20ce   Chunk   staged.

e3e7e73a   Chunk   spider standalone...

f20e20ce   Chunk   staged.

02528074   Chunk   staged.

f20e20ce   Chunk   staged.

84648488   Chunk   reverted.

02528074   Chunk   staged.

10b4f63f   Chunk   staged. Before Pa...

84648488   Chunk   reverted.

10b4f63f   Chunk   staged. Before Pa...

c7fa1d60   Chunk   refractoration st...

be12257b   Chunk   data-feat-model f...

f20e20ce   Chunk   staged.

10b4f63f   Chunk   staged. Before Pa...

84648488   Chunk   reverted.

10b4f63f   Chunk   staged. Before Pa...

02528074   Chunk   staged.

10b4f63f   Chunk   staged. Before Pa...

f20e20ce   Chunk   staged.

84648488   Chunk   reverted.

02528074   Chunk   staged.

f20e20ce   Chunk   staged.

10b4f63f   Chunk   staged. Before Pa...

13a594f1   Chunk   before 中期答辩~~~

84648488   Chunk   reverted.

10b4f63f   Chunk   staged. Before Pa...

02528074   Chunk   staged.

10b4f63f   Chunk   staged. Before Pa...

84648488   Chunk   reverted.