Skip to content

Commit a183b7e

Browse files
committed
ENH Set random seed to ensure consistency
Also, test models based on user and movie consistently
1 parent b7117f2 commit a183b7e

4 files changed

Lines changed: 60 additions & 11 deletions

File tree

‎ch08/corrneighbours.py‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,17 @@ def predict(otrain):
3838
return norm.inverse_transform(filled.T).T
3939

4040
def main(transpose_inputs=False):
41-
train, test = get_train_test()
41+
train, test = get_train_test(random_state=12)
4242
if transpose_inputs:
4343
train = train.T
4444
test = test.T
4545

4646
predicted = predict(train)
4747
r2 = metrics.r2_score(test[test > 0], predicted[test > 0])
48-
print('R2 score (binary neighbours): {:.1%}'.format(r2))
48+
print('R2 score (binary {} neighbours): {:.1%}'.format(
49+
('movie' if transpose_inputs else 'user'),
50+
r2))
4951

5052
if __name__ == '__main__':
5153
main()
54+
main(transpose_inputs=True)

‎ch08/load_ml100k.py‎

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,29 @@ def load():
2222
reviews = sparse.csc_matrix((values, ij.T)).astype(float)
2323
return reviews.toarray()
2424

25-
def get_train_test():
25+
def get_train_test(reviews=None, return_valid=False, random_state=None):
26+
'''Split data into training & testing
27+
28+
Parameters
29+
----------
30+
reviews : ndarray, optional
31+
Input data
32+
33+
Returns
34+
-------
35+
train : ndarray
36+
training data
37+
test : ndarray
38+
testing data
39+
'''
2640
import numpy as np
2741
import random
28-
reviews = load()
42+
r = random.Random(random_state)
43+
44+
if reviews is None:
45+
reviews = load()
2946
U,M = np.where(reviews)
30-
test_idxs = np.array(random.sample(range(len(U)), len(U)//10))
47+
test_idxs = np.array(r.sample(range(len(U)), len(U)//10))
3148
train = reviews.copy()
3249
train[U[test_idxs], M[test_idxs]] = 0
3350

@@ -38,5 +55,7 @@ def get_train_test():
3855
valid_M = train.any(1)
3956
train = train[valid_M].T[valid_U].T
4057
test = test [valid_M].T[valid_U].T
58+
if return_valid:
59+
return train, test, valid_M, valid_U
4160
return train, test
4261

‎ch08/norm.py‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,25 @@ def inverse_transform(self, features, copy=True):
2828
features *= self.std
2929
features += self.mean
3030
return features
31+
32+
def predict(train):
33+
norm = NormalizePositive()
34+
train = norm.fit_transform(train)
35+
return norm.inverse_transform(train * 0.)
36+
37+
38+
def main(transpose_inputs=False):
39+
from load_ml100k import get_train_test
40+
from sklearn import metrics
41+
train,test = get_train_test(random_state=12)
42+
if transpose_inputs:
43+
train = train.T
44+
test = test.T
45+
predicted = predict(train)
46+
r2 = metrics.r2_score(test[test > 0], predicted[test > 0])
47+
print('R2 score ({} normalization): {:.1%}'.format(
48+
('movie' if transpose_inputs else 'user'),
49+
r2))
50+
if __name__ == '__main__':
51+
main()
52+
main(transpose_inputs=True)
Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
import numpy as np
99
from sklearn.linear_model import ElasticNetCV
10-
from load_ml100k import get_train_test
1110
from norm import NormalizePositive
1211
from sklearn import metrics
1312

@@ -25,21 +24,27 @@ def predict(train):
2524
# remove the current user for training
2625
curtrain = np.delete(train, u, axis=0)
2726
bu = binary[u]
28-
reg.fit(curtrain[:,bu].T, train[u, bu])
27+
if np.sum(bu) > 5:
28+
reg.fit(curtrain[:,bu].T, train[u, bu])
2929

30-
# Fill the values that were not there already
31-
filled[u, ~bu] = reg.predict(curtrain[:,~bu].T)
30+
# Fill the values that were not there already
31+
filled[u, ~bu] = reg.predict(curtrain[:,~bu].T)
3232
return norm.inverse_transform(filled)
3333

3434

3535
def main(transpose_inputs=False):
36-
train,test = get_train_test()
36+
from load_ml100k import get_train_test
37+
train,test = get_train_test(random_state=12)
3738
if transpose_inputs:
3839
train = train.T
3940
test = test.T
4041
filled = predict(train)
4142
r2 = metrics.r2_score(test[test > 0], filled[test > 0])
42-
print('R2 score (user regression): {:.1%}'.format(r2))
43+
44+
print('R2 score ({} regression): {:.1%}'.format(
45+
('movie' if transpose_inputs else 'user'),
46+
r2))
4347

4448
if __name__ == '__main__':
4549
main()
50+
main(transpose_inputs=True)

0 commit comments

Comments
 (0)