Bug#1070201: scikit-learn: autopkgtest regression on i386 with NumPy 1.26

Graham Inggs ginggs at debian.org
Wed May 1 19:36:05 BST 2024


Source: scikit-learn
Version: 1.4.1.post1+dfsg-1
Severity: serious
User: debian-ci at lists.debian.org
Usertags: regression

Hi Maintainer

scikit-learn's autopkgtest regresses on i386 when tested with numpy
1.26 [1].  I've copied what I hope is the relevant part of the log
below.

Regards
Graham


[1] https://ci.debian.net/packages/s/scikit-learn/testing/i386/


1386s =================================== FAILURES
===================================
35104
1386s ______________________________ test_graphviz_toy
_______________________________
35105
1386s
35106
1386s def test_graphviz_toy():
35107
1386s # Check correctness of export_graphviz
35108
1386s clf = DecisionTreeClassifier(
35109
1386s max_depth=3, min_samples_split=2, criterion="gini", random_state=2
35110
1386s )
35111
1386s clf.fit(X, y)
35112
1386s
35113
1386s # Test export code
35114
1386s contents1 = export_graphviz(clf, out_file=None)
35115
1386s contents2 = (
35116
1386s "digraph Tree {\n"
35117
1386s 'node [shape=box, fontname="helvetica"] ;\n'
35118
1386s 'edge [fontname="helvetica"] ;\n'
35119
1386s '0 [label="x[0] <= 0.0\\ngini = 0.5\\nsamples = 6\\n'
35120
1386s 'value = [3, 3]"] ;\n'
35121
1386s '1 [label="gini = 0.0\\nsamples = 3\\nvalue = [3, 0]"] ;\n'
35122
1386s "0 -> 1 [labeldistance=2.5, labelangle=45, "
35123
1386s 'headlabel="True"] ;\n'
35124
1386s '2 [label="gini = 0.0\\nsamples = 3\\nvalue = [0, 3]"] ;\n'
35125
1386s "0 -> 2 [labeldistance=2.5, labelangle=-45, "
35126
1386s 'headlabel="False"] ;\n'
35127
1386s "}"
35128
1386s )
35129
1386s
35130
1386s assert contents1 == contents2
35131
1386s
35132
1386s # Test plot_options
35133
1386s contents1 = export_graphviz(
35134
1386s clf,
35135
1386s filled=True,
35136
1386s impurity=False,
35137
1386s proportion=True,
35138
1386s special_characters=True,
35139
1386s rounded=True,
35140
1386s out_file=None,
35141
1386s fontname="sans",
35142
1386s )
35143
1386s contents2 = (
35144
1386s "digraph Tree {\n"
35145
1386s 'node [shape=box, style="filled, rounded", color="black", '
35146
1386s 'fontname="sans"] ;\n'
35147
1386s 'edge [fontname="sans"] ;\n'
35148
1386s "0 [label=<x<SUB>0</SUB> ≤ 0.0<br/>samples = 100.0%<br/>"
35149
1386s 'value = [0.5, 0.5]>, fillcolor="#ffffff"] ;\n'
35150
1386s "1 [label=<samples = 50.0%<br/>value = [1.0, 0.0]>, "
35151
1386s 'fillcolor="#e58139"] ;\n'
35152
1386s "0 -> 1 [labeldistance=2.5, labelangle=45, "
35153
1386s 'headlabel="True"] ;\n'
35154
1386s "2 [label=<samples = 50.0%<br/>value = [0.0, 1.0]>, "
35155
1386s 'fillcolor="#399de5"] ;\n'
35156
1386s "0 -> 2 [labeldistance=2.5, labelangle=-45, "
35157
1386s 'headlabel="False"] ;\n'
35158
1386s "}"
35159
1386s )
35160
1386s
35161
1386s assert contents1 == contents2
35162
1386s
35163
1386s # Test max_depth
35164
1386s contents1 = export_graphviz(clf, max_depth=0, class_names=True,
out_file=None)
35165
1386s contents2 = (
35166
1386s "digraph Tree {\n"
35167
1386s 'node [shape=box, fontname="helvetica"] ;\n'
35168
1386s 'edge [fontname="helvetica"] ;\n'
35169
1386s '0 [label="x[0] <= 0.0\\ngini = 0.5\\nsamples = 6\\n'
35170
1386s 'value = [3, 3]\\nclass = y[0]"] ;\n'
35171
1386s '1 [label="(...)"] ;\n'
35172
1386s "0 -> 1 ;\n"
35173
1386s '2 [label="(...)"] ;\n'
35174
1386s "0 -> 2 ;\n"
35175
1386s "}"
35176
1386s )
35177
1386s
35178
1386s assert contents1 == contents2
35179
1386s
35180
1386s # Test max_depth with plot_options
35181
1386s contents1 = export_graphviz(
35182
1386s clf, max_depth=0, filled=True, out_file=None, node_ids=True
35183
1386s )
35184
1386s contents2 = (
35185
1386s "digraph Tree {\n"
35186
1386s 'node [shape=box, style="filled", color="black", '
35187
1386s 'fontname="helvetica"] ;\n'
35188
1386s 'edge [fontname="helvetica"] ;\n'
35189
1386s '0 [label="node #0\\nx[0] <= 0.0\\ngini = 0.5\\n'
35190
1386s 'samples = 6\\nvalue = [3, 3]", fillcolor="#ffffff"] ;\n'
35191
1386s '1 [label="(...)", fillcolor="#C0C0C0"] ;\n'
35192
1386s "0 -> 1 ;\n"
35193
1386s '2 [label="(...)", fillcolor="#C0C0C0"] ;\n'
35194
1386s "0 -> 2 ;\n"
35195
1386s "}"
35196
1386s )
35197
1386s
35198
1386s assert contents1 == contents2
35199
1386s
35200
1386s # Test multi-output with weighted samples
35201
1386s clf = DecisionTreeClassifier(
35202
1386s max_depth=2, min_samples_split=2, criterion="gini", random_state=2
35203
1386s )
35204
1386s clf = clf.fit(X, y2, sample_weight=w)
35205
1386s
35206
1386s > contents1 = export_graphviz(clf, filled=True, impurity=False,
out_file=None)
35207
1386s
35208
1386s /usr/lib/python3/dist-packages/sklearn/tree/tests/test_export.py:131:
35209
1386s _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _
35210
1386s /usr/lib/python3/dist-packages/sklearn/utils/_param_validation.py:213:
in wrapper
35211
1386s return func(*args, **kwargs)
35212
1386s /usr/lib/python3/dist-packages/sklearn/tree/_export.py:906: in
export_graphviz
35213
1386s exporter.export(decision_tree)
35214
1386s /usr/lib/python3/dist-packages/sklearn/tree/_export.py:466: in export
35215
1386s self.recurse(decision_tree.tree_, 0, criterion=decision_tree.criterion)
35216
1386s /usr/lib/python3/dist-packages/sklearn/tree/_export.py:529: in recurse
35217
1386s ', fillcolor="%s"' % self.get_fill_color(tree, node_id)
35218
1386s /usr/lib/python3/dist-packages/sklearn/tree/_export.py:286: in
get_fill_color
35219
1386s return self.get_color(node_val)
35220
1386s _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _
35221
1386s
35222
1386s self = <sklearn.tree._export._DOTTreeExporter object at 0xe643bcf0>
35223
1386s value = -0.4691358024691358
35224
1386s
35225
1386s def get_color(self, value):
35226
1386s # Find the appropriate color & intensity for a node
35227
1386s if self.colors["bounds"] is None:
35228
1386s # Classification tree
35229
1386s color = list(self.colors["rgb"][np.argmax(value)])
35230
1386s sorted_values = sorted(value, reverse=True)
35231
1386s if len(sorted_values) == 1:
35232
1386s alpha = 0.0
35233
1386s else:
35234
1386s alpha = (sorted_values[0] - sorted_values[1]) / (1 - sorted_values[1])
35235
1386s else:
35236
1386s # Regression tree or multi-output
35237
1386s color = list(self.colors["rgb"][0])
35238
1386s alpha = (value - self.colors["bounds"][0]) / (
35239
1386s self.colors["bounds"][1] - self.colors["bounds"][0]
35240
1386s )
35241
1386s # compute the color as alpha against white
35242
1386s > color = [int(round(alpha * c + (1 - alpha) * 255, 0)) for c in color]
35243
1386s E ValueError: cannot convert float NaN to integer
35244
1386s
35245
1386s /usr/lib/python3/dist-packages/sklearn/tree/_export.py:258: ValueError



More information about the debian-science-maintainers mailing list