162 lines
7.3 KiB
Python
162 lines
7.3 KiB
Python
import numpy as np
|
|
|
|
from numpy.testing import assert_equal, assert_allclose
|
|
from sklearn import neighbors
|
|
from sklearn.metrics import r2_score
|
|
from sklearn.preprocessing import MinMaxScaler
|
|
from cross_val import kfold_split, knn_cv_score
|
|
|
|
|
|
def test_split_0():
|
|
with open('cross_val.py', 'r') as file:
|
|
lines = ' '.join(file.readlines())
|
|
assert 'import numpy' in lines
|
|
assert 'import defaultdict' in lines
|
|
assert 'import typing' in lines
|
|
assert lines.count('import') == 3
|
|
assert 'sklearn' not in lines
|
|
|
|
def test_split_1():
|
|
X_1 = kfold_split(2, 2)
|
|
answer = [(np.array([1]), np.array([0])), (np.array([0]), np.array([1]))]
|
|
|
|
assert type(X_1) == list
|
|
assert_equal(X_1, answer)
|
|
|
|
def test_split_2():
|
|
X_1 = kfold_split(5, 3)
|
|
answer = [(np.array([1, 2, 3, 4]), np.array([0])),
|
|
(np.array([0, 2, 3, 4]), np.array([1])),
|
|
(np.array([0, 1]), np.array([2, 3, 4]))]
|
|
|
|
assert type(X_1) == list
|
|
assert_equal(X_1, answer)
|
|
|
|
def test_split_3():
|
|
X_1 = kfold_split(11, 7)
|
|
answer = [(np.array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]), np.array([0])),
|
|
(np.array([ 0, 2, 3, 4, 5, 6, 7, 8, 9, 10]), np.array([1])),
|
|
(np.array([ 0, 1, 3, 4, 5, 6, 7, 8, 9, 10]), np.array([2])),
|
|
(np.array([ 0, 1, 2, 4, 5, 6, 7, 8, 9, 10]), np.array([3])),
|
|
(np.array([ 0, 1, 2, 3, 5, 6, 7, 8, 9, 10]), np.array([4])),
|
|
(np.array([ 0, 1, 2, 3, 4, 6, 7, 8, 9, 10]), np.array([5])),
|
|
(np.array([0, 1, 2, 3, 4, 5]), np.array([ 6, 7, 8, 9, 10]))]
|
|
|
|
assert type(X_1) == list
|
|
assert_equal(X_1, answer)
|
|
|
|
def test_cv_4():
|
|
X_train = np.array([[2, 1, -1], [1, 1, 1], [0.9, -0.25, 7], [1, 2, -3], [0, 0, 0], [2, -1, 0.5]])
|
|
y_train = np.sum(X_train, axis=1)
|
|
parameters = {
|
|
'n_neighbors': [1, 2, 4],
|
|
'metrics': ['euclidean', 'cosine'],
|
|
'weights': ['uniform', 'distance'],
|
|
'normalizers': [(None, 'None')]
|
|
}
|
|
folds = kfold_split(6, 3)
|
|
out = knn_cv_score(X_train, y_train, parameters, r2_score, folds, neighbors.KNeighborsRegressor)
|
|
|
|
answer = {
|
|
('None', 1, 'euclidean', 'uniform'): -11.29188203967135,
|
|
('None', 1, 'euclidean', 'distance'): -11.29188203967135,
|
|
('None', 1, 'cosine', 'uniform'): -17.63280796559728,
|
|
('None', 1, 'cosine', 'distance'): -17.632807965597276,
|
|
('None', 2, 'euclidean', 'uniform'): -7.5333863756105215,
|
|
('None', 2, 'euclidean', 'distance'): -7.997305328982919,
|
|
('None', 2, 'cosine', 'uniform'): -4.246942433109774,
|
|
('None', 2, 'cosine', 'distance'): -6.7448165099645365,
|
|
('None', 4, 'euclidean', 'uniform'): -3.6194607932134364,
|
|
('None', 4, 'euclidean', 'distance'): -4.211377791660151,
|
|
('None', 4, 'cosine', 'uniform'): -3.6194607932134364,
|
|
('None', 4, 'cosine', 'distance'): -4.335691384752842
|
|
}
|
|
|
|
assert type(out) == dict
|
|
assert len(out) == len(answer)
|
|
for key in answer:
|
|
assert_allclose(answer[key], out[key])
|
|
|
|
def test_cv_5():
|
|
X_train = np.array([[ 0.62069296, -0.07097426, 0.65172896, -1.14620331],
|
|
[ 2.03347616, 0.32524614, -0.71941433, -0.30789854],
|
|
[ 0.17100377, 1.63120292, 1.34284446, -2.16397238],
|
|
[-1.65370417, 0.62499229, -0.50217293, 2.07813591],
|
|
[ 0.84667916, 0.25458428, 0.14720704, -0.18668345],
|
|
[ 0.43833344, -1.40348048, -1.37944118, 0.19192659],
|
|
[ 0.97229574, -0.54606276, -0.09855294, 1.28961291],
|
|
[ 0.25355626, -1.72816511, 0.084554 , -2.14256875],
|
|
[ 0.36103462, -1.28930935, 1.34586369, -0.57300728],
|
|
[-1.42711933, -0.11832827, -0.58038295, -1.56806583]])
|
|
y_train = np.sum(np.abs(X_train), axis=1)
|
|
parameters = {
|
|
'n_neighbors': [1, 2, 4],
|
|
'metrics': ['euclidean', 'cosine'],
|
|
'weights': ['uniform', 'distance'],
|
|
'normalizers': [(None, 'None')]
|
|
}
|
|
folds = kfold_split(10, 3)
|
|
out = knn_cv_score(X_train, y_train, parameters, r2_score, folds, neighbors.KNeighborsRegressor)
|
|
|
|
answer = {
|
|
('None', 1, 'euclidean', 'uniform'): -3.8869140469579033,
|
|
('None', 1, 'euclidean', 'distance'): -3.8869140469579033,
|
|
('None', 1, 'cosine', 'uniform'): -3.8967543637841557,
|
|
('None', 1, 'cosine', 'distance'): -3.8967543637841557,
|
|
('None', 2, 'euclidean', 'uniform'): -2.8537893891104353,
|
|
('None', 2, 'euclidean', 'distance'): -2.8723718210868676,
|
|
('None', 2, 'cosine', 'uniform'): -0.9110922868244854,
|
|
('None', 2, 'cosine', 'distance'): -1.2935713889809644,
|
|
('None', 4, 'euclidean', 'uniform'): -1.0722930212962776,
|
|
('None', 4, 'euclidean', 'distance'): -1.291339953080277,
|
|
('None', 4, 'cosine', 'uniform'): 0.010193326582544423,
|
|
('None', 4, 'cosine', 'distance'): -0.38359677639174855
|
|
}
|
|
|
|
assert type(out) == dict
|
|
assert len(out) == len(answer)
|
|
for key in answer:
|
|
assert_allclose(answer[key], out[key])
|
|
|
|
def test_cv_6():
|
|
X_train = np.array([[ 0.62069296, -0.07097426, 0.65172896, -1.14620331],
|
|
[ 2.03347616, 0.32524614, -0.71941433, -0.30789854],
|
|
[ 0.17100377, 1.63120292, 1.34284446, -2.16397238],
|
|
[-1.65370417, 0.62499229, -0.50217293, 2.07813591],
|
|
[ 0.84667916, 0.25458428, 0.14720704, -0.18668345],
|
|
[ 0.43833344, -1.40348048, -1.37944118, 0.19192659],
|
|
[ 0.97229574, -0.54606276, -0.09855294, 1.28961291],
|
|
[ 0.25355626, -1.72816511, 0.084554 , -2.14256875],
|
|
[ 0.36103462, -1.28930935, 1.34586369, -0.57300728],
|
|
[-1.42711933, -0.11832827, -0.58038295, -1.56806583]])
|
|
y_train = np.sum(np.abs(X_train), axis=1)
|
|
scaler = MinMaxScaler()
|
|
parameters = {
|
|
'n_neighbors': [1, 2, 4],
|
|
'metrics': ['euclidean', 'cosine'],
|
|
'weights': ['uniform', 'distance'],
|
|
'normalizers': [(scaler, 'MinMaxScaler')]
|
|
}
|
|
folds = kfold_split(10, 3)
|
|
out = knn_cv_score(X_train, y_train, parameters, r2_score, folds, neighbors.KNeighborsRegressor)
|
|
|
|
answer = {
|
|
('MinMaxScaler', 1, 'euclidean', 'uniform'): -3.886914104013526,
|
|
('MinMaxScaler', 1, 'euclidean', 'distance'): -3.886914104013526,
|
|
('MinMaxScaler', 1, 'cosine', 'uniform'): -3.339427669385479,
|
|
('MinMaxScaler', 1, 'cosine', 'distance'): -3.339427669385479,
|
|
('MinMaxScaler', 2, 'euclidean', 'uniform'): -2.821522070818421,
|
|
('MinMaxScaler', 2, 'euclidean', 'distance'): -2.909515284414977,
|
|
('MinMaxScaler', 2, 'cosine', 'uniform'): -3.0373126577073877,
|
|
('MinMaxScaler', 2, 'cosine', 'distance'): -2.7197802024893374,
|
|
('MinMaxScaler', 4, 'euclidean', 'uniform'): -1.229118435031323,
|
|
('MinMaxScaler', 4, 'euclidean', 'distance'): -1.4848798788742938,
|
|
('MinMaxScaler', 4, 'cosine', 'uniform'): -0.3586698577110674,
|
|
('MinMaxScaler', 4, 'cosine', 'distance'): -0.7914850319051477
|
|
}
|
|
|
|
assert type(out) == dict
|
|
assert len(out) == len(answer)
|
|
for key in answer:
|
|
assert_allclose(answer[key], out[key])
|