Skip to content

Commit c2ad5eb

Browse files
committed
refactor code
1 parent 95d2f2e commit c2ad5eb

10 files changed

+260
-257
lines changed

Diff for: FukuML/MLBase.py

+75-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
#encoding=utf8
22

3-
import pickle
43
from abc import ABCMeta, abstractmethod
54

65

@@ -19,14 +18,84 @@ class Learner(object):
1918

2019
@abstractmethod
2120
def __init__(self):
22-
"""init"""
2321
return
2422

2523
@abstractmethod
2624
def load_train_data(self, input_data_file=''):
27-
"""Load train data"""
2825
return
2926

30-
def serialize(self):
31-
"""serialize"""
32-
return pickle.dumps(self, protocol=0)
27+
@abstractmethod
28+
def load_test_data(self, input_data_file=''):
29+
return
30+
31+
@abstractmethod
32+
def init_W(self):
33+
return
34+
35+
@abstractmethod
36+
def score_function(self, x, W):
37+
return
38+
39+
@abstractmethod
40+
def error_function(self, y_prediction, y_truth):
41+
return
42+
43+
def calculate_avg_error(self, X, Y, W):
44+
45+
'''
46+
Calculate avg error from X, Y, W
47+
'''
48+
49+
data_num = len(Y)
50+
error_num = 0
51+
52+
for i in range(data_num):
53+
error_num = error_num + self.error_function(self.score_function(X[i], W), Y[i])
54+
55+
avg_error = error_num / float(data_num)
56+
57+
return avg_error
58+
59+
def calculate_test_data_avg_error(self):
60+
61+
'''
62+
Calculate test data avg error
63+
'''
64+
65+
avg_error = self.calculate_avg_error(self.test_X, self.test_Y, self.W)
66+
67+
return avg_error
68+
69+
@abstractmethod
70+
def train(self, updates=50, mode='random', alpha=1):
71+
return
72+
73+
def prediction(self, input_data='', mode='test_data'):
74+
75+
'''
76+
Make prediction
77+
input test data
78+
output the prediction
79+
'''
80+
81+
prediction = 0
82+
83+
if (self.status != 'train'):
84+
print("Please load train data and init W then train the W first.")
85+
return prediction
86+
87+
if (input_data == ''):
88+
print("Please input test data for prediction.")
89+
return prediction
90+
91+
if mode == 'future_data':
92+
data = input_data.split()
93+
input_data_x = [1] + [float(v) for v in data]
94+
prediction = self.score_function(input_data_x, self.W)
95+
return {"input_data_x": input_data_x, "input_data_y": None, "prediction": prediction}
96+
else:
97+
data = input_data.split()
98+
input_data_x = [1] + [float(v) for v in data[:-1]]
99+
input_data_y = float(data[-1])
100+
prediction = self.score_function(input_data_x, self.W)
101+
return {"input_data_x": input_data_x, "input_data_y": input_data_y, "prediction": prediction}

Diff for: FukuML/PLA.py

+5-53
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,7 @@ def load_train_data(self, input_data_file=''):
4141
print("Please make sure input_data_file path is correct.")
4242
return self.train_X, self.train_Y
4343

44-
dataset_loader = utility.DatasetLoader()
45-
self.train_X, self.train_Y = dataset_loader.load(input_data_file)
44+
self.train_X, self.train_Y = utility.DatasetLoader.load(input_data_file)
4645

4746
return self.train_X, self.train_Y
4847

@@ -62,8 +61,7 @@ def load_test_data(self, input_data_file=''):
6261
print("Please make sure input_data_file path is correct.")
6362
return self.test_X, self.test_Y
6463

65-
dataset_loader = utility.DatasetLoader()
66-
self.test_X, self.test_Y = dataset_loader.load(input_data_file)
64+
self.test_X, self.test_Y = utility.DatasetLoader.load(input_data_file)
6765

6866
return self.test_X, self.test_Y
6967

@@ -110,32 +108,12 @@ def error_function(self, y_prediction, y_truth):
110108
return 0
111109

112110
def calculate_avg_error(self, X, Y, W):
113-
# need refector
114-
115-
'''
116-
Calculate avg error from X, Y, W
117-
'''
118-
119-
data_num = len(Y)
120-
error_num = 0
121111

122-
for i in range(data_num):
123-
error_num = error_num + self.error_function(self.score_function(X[i], W), Y[i])
124-
125-
avg_error = error_num / float(data_num)
126-
127-
return avg_error
112+
return super(BinaryClassifier, self).calculate_avg_error(X, Y, W)
128113

129114
def calculate_test_data_avg_error(self):
130-
# need refector
131115

132-
'''
133-
Calculate test data avg error
134-
'''
135-
136-
avg_error = self.calculate_avg_error(self.test_X, self.test_Y, self.W)
137-
138-
return avg_error
116+
return super(BinaryClassifier, self).calculate_avg_error()
139117

140118
def train(self, mode='naive_cycle', alpha=1):
141119

@@ -187,30 +165,4 @@ def train(self, mode='naive_cycle', alpha=1):
187165

188166
def prediction(self, input_data='', mode='test_data'):
189167

190-
'''
191-
Make prediction
192-
input test data
193-
output the prediction
194-
'''
195-
196-
prediction = 0
197-
198-
if (self.status != 'train'):
199-
print("Please load train data and init W then train the W first.")
200-
return prediction
201-
202-
if (input_data == ''):
203-
print("Please input test data for prediction.")
204-
return prediction
205-
206-
if mode == 'future_data':
207-
data = input_data.split()
208-
input_data_x = [1] + [float(v) for v in data]
209-
prediction = self.score_function(input_data_x, self.W)
210-
return {"input_data_x": input_data_x, "prediction": prediction}
211-
else:
212-
data = input_data.split()
213-
input_data_x = [1] + [float(v) for v in data[:-1]]
214-
input_data_y = float(data[-1])
215-
prediction = self.score_function(input_data_x, self.W)
216-
return {"input_data_x": input_data_x, "input_data_y": input_data_y, "prediction": prediction}
168+
return super(BinaryClassifier, self).prediction(input_data, mode)

Diff for: FukuML/PocketPLA.py

+5-53
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,7 @@ def load_train_data(self, input_data_file=''):
4747
print("Please make sure input_data_file path is correct.")
4848
return self.train_X, self.train_Y
4949

50-
dataset_loader = utility.DatasetLoader()
51-
self.train_X, self.train_Y = dataset_loader.load(input_data_file)
50+
self.train_X, self.train_Y = utility.DatasetLoader.load(input_data_file)
5251

5352
return self.train_X, self.train_Y
5453

@@ -68,8 +67,7 @@ def load_test_data(self, input_data_file=''):
6867
print("Please make sure input_data_file path is correct.")
6968
return self.test_X, self.test_Y
7069

71-
dataset_loader = utility.DatasetLoader()
72-
self.test_X, self.test_Y = dataset_loader.load(input_data_file)
70+
self.test_X, self.test_Y = utility.DatasetLoader.load(input_data_file)
7371

7472
return self.test_X, self.test_Y
7573

@@ -116,32 +114,12 @@ def error_function(self, y_prediction, y_truth):
116114
return 0
117115

118116
def calculate_avg_error(self, X, Y, W):
119-
# need refector
120-
121-
'''
122-
Calculate avg error from X, Y, W
123-
'''
124-
125-
data_num = len(Y)
126-
error_num = 0
127117

128-
for i in range(data_num):
129-
error_num = error_num + self.error_function(self.score_function(X[i], W), Y[i])
130-
131-
avg_error = error_num / float(data_num)
132-
133-
return avg_error
118+
return super(BinaryClassifier, self).calculate_avg_error(X, Y, W)
134119

135120
def calculate_test_data_avg_error(self):
136-
# need refector
137121

138-
'''
139-
Calculate test data avg error
140-
'''
141-
142-
avg_error = self.calculate_avg_error(self.test_X, self.test_Y, self.W)
143-
144-
return avg_error
122+
return super(BinaryClassifier, self).calculate_avg_error()
145123

146124
def train(self, updates=50, mode='random', alpha=1):
147125

@@ -187,30 +165,4 @@ def train(self, updates=50, mode='random', alpha=1):
187165

188166
def prediction(self, input_data='', mode='test_data'):
189167

190-
'''
191-
Make prediction
192-
input test data
193-
output the prediction
194-
'''
195-
196-
prediction = 0
197-
198-
if (self.status != 'train'):
199-
print("Please load train data and init W then train the W first.")
200-
return prediction
201-
202-
if (input_data == ''):
203-
print("Please input test data for prediction.")
204-
return prediction
205-
206-
if mode == 'future_data':
207-
data = input_data.split()
208-
input_data_x = [1] + [float(v) for v in data]
209-
prediction = self.score_function(input_data_x, self.W)
210-
return {"input_data_x": input_data_x, "input_data_y": None, "prediction": prediction}
211-
else:
212-
data = input_data.split()
213-
input_data_x = [1] + [float(v) for v in data[:-1]]
214-
input_data_y = float(data[-1])
215-
prediction = self.score_function(input_data_x, self.W)
216-
return {"input_data_x": input_data_x, "input_data_y": input_data_y, "prediction": prediction}
168+
return super(BinaryClassifier, self).prediction(input_data, mode)

Diff for: FukuML/Utility.py

+17-8
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,14 @@
11
#encoding=utf8
22

33
import numpy as np
4+
import pickle
45

56

67
class DatasetLoader(object):
78

8-
status = 'empty'
9-
10-
def __init__(self):
11-
12-
self.status = 'empty'
13-
14-
def load(self, input_data_file=''):
15-
9+
@staticmethod
10+
def load(input_data_file=''):
11+
"""load file"""
1612
X = []
1713
Y = []
1814
with open(input_data_file) as f:
@@ -23,3 +19,16 @@ def load(self, input_data_file=''):
2319
Y.append(float(data[-1]))
2420

2521
return np.array(X), np.array(Y)
22+
23+
24+
class Serializer(object):
25+
26+
@staticmethod
27+
def serialize(need_serialize=''):
28+
"""serialize"""
29+
return pickle.dumps(need_serialize, protocol=0)
30+
31+
@staticmethod
32+
def deserialize(pickle_serialized=''):
33+
"""ddserialize"""
34+
return pickle.loads(pickle_serialized)

Diff for: FukuML/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
__version__ = '0.0.3'
44
__all__ = [
5+
'MLBase',
56
'PLA',
67
'PLA.BinaryClassifier',
78
'PocketPLA',

0 commit comments

Comments
 (0)