test_consistency.py 5.77 KB
Newer Older
1
# coding: utf-8
2
from pathlib import Path
3
4
5
6

import numpy as np
from sklearn.datasets import load_svmlight_file

7
8
import lightgbm as lgb

9
10
EXAMPLES_DIR = Path(__file__).absolute().parents[2] / 'examples'

11

12
class FileLoader:
13
14
15
16
17

    def __init__(self, directory, prefix, config_file='train.conf'):
        self.directory = directory
        self.prefix = prefix
        self.params = {'gpu_use_dp': True}
18
        with open(self.directory / config_file, 'r') as f:
19
20
21
22
23
            for line in f.readlines():
                line = line.strip()
                if line and not line.startswith('#'):
                    key, value = [token.strip() for token in line.split('=')]
                    if 'early_stopping' not in key:  # disable early_stopping
24
                        self.params[key] = value if key != 'num_trees' else int(value)
25
26

    def load_dataset(self, suffix, is_sparse=False):
27
        filename = str(self.path(suffix))
28
29
30
31
32
33
34
35
        if is_sparse:
            X, Y = load_svmlight_file(filename, dtype=np.float64, zero_based=True)
            return X, Y, filename
        else:
            mat = np.loadtxt(filename, dtype=np.float64)
            return mat[:, 1:], mat[:, 0], filename

    def load_field(self, suffix):
36
        return np.loadtxt(str(self.directory / f'{self.prefix}{suffix}'))
37
38

    def load_cpp_result(self, result_file='LightGBM_predict_result.txt'):
39
        return np.loadtxt(str(self.directory / result_file))
40
41

    def train_predict_check(self, lgb_train, X_test, X_test_fn, sk_pred):
42
43
44
        params = dict(self.params)
        params['force_row_wise'] = True
        gbm = lgb.train(params, lgb_train)
45
46
        y_pred = gbm.predict(X_test)
        cpp_pred = gbm.predict(X_test_fn)
47
48
        np.testing.assert_allclose(y_pred, cpp_pred)
        np.testing.assert_allclose(y_pred, sk_pred)
49

50
51
52
53
54
55
56
57
58
59
    def file_load_check(self, lgb_train, name):
        lgb_train_f = lgb.Dataset(self.path(name), params=self.params).construct()
        for f in ('num_data', 'num_feature', 'get_label', 'get_weight', 'get_init_score', 'get_group'):
            a = getattr(lgb_train, f)()
            b = getattr(lgb_train_f, f)()
            if a is None and b is None:
                pass
            elif a is None:
                assert np.all(b == 1), f
            elif isinstance(b, (list, np.ndarray)):
60
                np.testing.assert_allclose(a, b)
61
62
63
64
            else:
                assert a == b, f

    def path(self, suffix):
65
        return self.directory / f'{self.prefix}{suffix}'
66

67

68
def test_binary():
69
    fd = FileLoader(EXAMPLES_DIR / 'binary_classification', 'binary')
70
71
72
73
74
75
76
77
78
79
80
81
    X_train, y_train, _ = fd.load_dataset('.train')
    X_test, _, X_test_fn = fd.load_dataset('.test')
    weight_train = fd.load_field('.train.weight')
    lgb_train = lgb.Dataset(X_train, y_train, params=fd.params, weight=weight_train)
    gbm = lgb.LGBMClassifier(**fd.params)
    gbm.fit(X_train, y_train, sample_weight=weight_train)
    sk_pred = gbm.predict_proba(X_test)[:, 1]
    fd.train_predict_check(lgb_train, X_test, X_test_fn, sk_pred)
    fd.file_load_check(lgb_train, '.train')


def test_binary_linear():
82
    fd = FileLoader(EXAMPLES_DIR / 'binary_classification', 'binary', 'train_linear.conf')
83
84
85
86
87
88
89
90
91
92
93
94
    X_train, y_train, _ = fd.load_dataset('.train')
    X_test, _, X_test_fn = fd.load_dataset('.test')
    weight_train = fd.load_field('.train.weight')
    lgb_train = lgb.Dataset(X_train, y_train, params=fd.params, weight=weight_train)
    gbm = lgb.LGBMClassifier(**fd.params)
    gbm.fit(X_train, y_train, sample_weight=weight_train)
    sk_pred = gbm.predict_proba(X_test)[:, 1]
    fd.train_predict_check(lgb_train, X_test, X_test_fn, sk_pred)
    fd.file_load_check(lgb_train, '.train')


def test_multiclass():
95
    fd = FileLoader(EXAMPLES_DIR / 'multiclass_classification', 'multiclass')
96
97
98
99
100
101
102
103
104
105
106
    X_train, y_train, _ = fd.load_dataset('.train')
    X_test, _, X_test_fn = fd.load_dataset('.test')
    lgb_train = lgb.Dataset(X_train, y_train)
    gbm = lgb.LGBMClassifier(**fd.params)
    gbm.fit(X_train, y_train)
    sk_pred = gbm.predict_proba(X_test)
    fd.train_predict_check(lgb_train, X_test, X_test_fn, sk_pred)
    fd.file_load_check(lgb_train, '.train')


def test_regression():
107
    fd = FileLoader(EXAMPLES_DIR / 'regression', 'regression')
108
109
110
111
112
113
114
115
116
117
118
119
    X_train, y_train, _ = fd.load_dataset('.train')
    X_test, _, X_test_fn = fd.load_dataset('.test')
    init_score_train = fd.load_field('.train.init')
    lgb_train = lgb.Dataset(X_train, y_train, init_score=init_score_train)
    gbm = lgb.LGBMRegressor(**fd.params)
    gbm.fit(X_train, y_train, init_score=init_score_train)
    sk_pred = gbm.predict(X_test)
    fd.train_predict_check(lgb_train, X_test, X_test_fn, sk_pred)
    fd.file_load_check(lgb_train, '.train')


def test_lambdarank():
120
    fd = FileLoader(EXAMPLES_DIR / 'lambdarank', 'rank')
121
122
123
124
125
126
127
128
129
130
131
132
133
134
    X_train, y_train, _ = fd.load_dataset('.train', is_sparse=True)
    X_test, _, X_test_fn = fd.load_dataset('.test', is_sparse=True)
    group_train = fd.load_field('.train.query')
    lgb_train = lgb.Dataset(X_train, y_train, group=group_train)
    params = dict(fd.params)
    params['force_col_wise'] = True
    gbm = lgb.LGBMRanker(**params)
    gbm.fit(X_train, y_train, group=group_train)
    sk_pred = gbm.predict(X_test)
    fd.train_predict_check(lgb_train, X_test, X_test_fn, sk_pred)
    fd.file_load_check(lgb_train, '.train')


def test_xendcg():
135
    fd = FileLoader(EXAMPLES_DIR / 'xendcg', 'rank')
136
137
138
139
140
141
142
143
144
    X_train, y_train, _ = fd.load_dataset('.train', is_sparse=True)
    X_test, _, X_test_fn = fd.load_dataset('.test', is_sparse=True)
    group_train = fd.load_field('.train.query')
    lgb_train = lgb.Dataset(X_train, y_train, group=group_train)
    gbm = lgb.LGBMRanker(**fd.params)
    gbm.fit(X_train, y_train, group=group_train)
    sk_pred = gbm.predict(X_test)
    fd.train_predict_check(lgb_train, X_test, X_test_fn, sk_pred)
    fd.file_load_check(lgb_train, '.train')