binary quantifier completed, tests added. errors updated.

This commit is contained in:
Lorenzo Volpi 2023-07-27 03:16:41 +02:00
parent 1347ac3c9d
commit 469dcb5898
13 changed files with 2235 additions and 2328 deletions

BIN
.coverage Normal file

Binary file not shown.

2237
out.html

File diff suppressed because it is too large Load Diff

801
out_imdb.html Normal file
View File

@ -0,0 +1,801 @@
<html>
<head>
<style>
table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
th, td {
padding: 4px;
}
tr:hover{
background-color: lightgreen;
}
</style>
</head>
<body>
<div>imdb</div>
<div>Tests:</div>
<div>protocol=APP</div>
<div>n_prevalences=21</div>
<div>repreats=1000</div>
<div>&nbsp;</div>
<div>binary</div>
<table class="dataframe">
<thead>
<tr>
<th></th>
<th colspan="2" halign="left">base</th>
<th colspan="4" halign="left">true</th>
<th colspan="4" halign="left">estim</th>
<th colspan="4" halign="left">errors</th>
</tr>
<tr>
<th></th>
<th>0</th>
<th>1</th>
<th>T0</th>
<th>F1</th>
<th>F0</th>
<th>T1</th>
<th>T0</th>
<th>F1</th>
<th>F0</th>
<th>T1</th>
<th>ae</th>
<th>f1_true</th>
<th>f1_estim</th>
<th>f1_dist</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>0.0000</td>
<td>1.0000</td>
<td>0.0000</td>
<td>0.0000</td>
<td>0.1100</td>
<td>0.8900</td>
<td>0.0038</td>
<td>0.0108</td>
<td>0.1062</td>
<td>0.8792</td>
<td>0.0073</td>
<td>NaN</td>
<td>0.0565</td>
<td>NaN</td>
</tr>
<tr>
<th>1</th>
<td>0.0500</td>
<td>0.9500</td>
<td>0.0448</td>
<td>0.0052</td>
<td>0.1050</td>
<td>0.8450</td>
<td>0.0454</td>
<td>0.0110</td>
<td>0.1044</td>
<td>0.8392</td>
<td>0.0164</td>
<td>0.4570</td>
<td>0.4274</td>
<td>0.1598</td>
</tr>
<tr>
<th>2</th>
<td>0.1000</td>
<td>0.9000</td>
<td>0.0890</td>
<td>0.0110</td>
<td>0.0981</td>
<td>0.8019</td>
<td>0.0928</td>
<td>0.0134</td>
<td>0.0943</td>
<td>0.7995</td>
<td>0.0194</td>
<td>0.6247</td>
<td>0.6280</td>
<td>0.1120</td>
</tr>
<tr>
<th>3</th>
<td>0.1500</td>
<td>0.8500</td>
<td>0.1329</td>
<td>0.0171</td>
<td>0.0948</td>
<td>0.7552</td>
<td>0.1394</td>
<td>0.0157</td>
<td>0.0883</td>
<td>0.7566</td>
<td>0.0245</td>
<td>0.7062</td>
<td>0.7237</td>
<td>0.1044</td>
</tr>
<tr>
<th>4</th>
<td>0.2000</td>
<td>0.8000</td>
<td>0.1776</td>
<td>0.0224</td>
<td>0.0870</td>
<td>0.7130</td>
<td>0.1860</td>
<td>0.0167</td>
<td>0.0785</td>
<td>0.7188</td>
<td>0.0256</td>
<td>0.7661</td>
<td>0.7942</td>
<td>0.0858</td>
</tr>
<tr>
<th>5</th>
<td>0.2500</td>
<td>0.7500</td>
<td>0.2225</td>
<td>0.0275</td>
<td>0.0837</td>
<td>0.6663</td>
<td>0.2324</td>
<td>0.0192</td>
<td>0.0738</td>
<td>0.6746</td>
<td>0.0282</td>
<td>0.8013</td>
<td>0.8316</td>
<td>0.0781</td>
</tr>
<tr>
<th>6</th>
<td>0.3000</td>
<td>0.7000</td>
<td>0.2668</td>
<td>0.0332</td>
<td>0.0760</td>
<td>0.6240</td>
<td>0.2773</td>
<td>0.0219</td>
<td>0.0655</td>
<td>0.6353</td>
<td>0.0293</td>
<td>0.8306</td>
<td>0.8623</td>
<td>0.0677</td>
</tr>
<tr>
<th>7</th>
<td>0.3500</td>
<td>0.6500</td>
<td>0.3100</td>
<td>0.0400</td>
<td>0.0712</td>
<td>0.5788</td>
<td>0.3252</td>
<td>0.0264</td>
<td>0.0560</td>
<td>0.5924</td>
<td>0.0324</td>
<td>0.8480</td>
<td>0.8867</td>
<td>0.0677</td>
</tr>
<tr>
<th>8</th>
<td>0.4000</td>
<td>0.6000</td>
<td>0.3550</td>
<td>0.0450</td>
<td>0.0648</td>
<td>0.5352</td>
<td>0.3682</td>
<td>0.0282</td>
<td>0.0516</td>
<td>0.5520</td>
<td>0.0315</td>
<td>0.8661</td>
<td>0.9017</td>
<td>0.0589</td>
</tr>
<tr>
<th>9</th>
<td>0.4500</td>
<td>0.5500</td>
<td>0.3988</td>
<td>0.0512</td>
<td>0.0600</td>
<td>0.4900</td>
<td>0.4127</td>
<td>0.0335</td>
<td>0.0461</td>
<td>0.5078</td>
<td>0.0326</td>
<td>0.8776</td>
<td>0.9115</td>
<td>0.0549</td>
</tr>
<tr>
<th>10</th>
<td>0.5000</td>
<td>0.5000</td>
<td>0.4439</td>
<td>0.0561</td>
<td>0.0547</td>
<td>0.4453</td>
<td>0.4580</td>
<td>0.0370</td>
<td>0.0405</td>
<td>0.4644</td>
<td>0.0333</td>
<td>0.8889</td>
<td>0.9217</td>
<td>0.0507</td>
</tr>
<tr>
<th>11</th>
<td>0.5500</td>
<td>0.4500</td>
<td>0.4895</td>
<td>0.0605</td>
<td>0.0498</td>
<td>0.4002</td>
<td>0.5014</td>
<td>0.0428</td>
<td>0.0379</td>
<td>0.4179</td>
<td>0.0337</td>
<td>0.8985</td>
<td>0.9252</td>
<td>0.0465</td>
</tr>
<tr>
<th>12</th>
<td>0.6000</td>
<td>0.4000</td>
<td>0.5318</td>
<td>0.0683</td>
<td>0.0437</td>
<td>0.3563</td>
<td>0.5446</td>
<td>0.0465</td>
<td>0.0309</td>
<td>0.3781</td>
<td>0.0333</td>
<td>0.9045</td>
<td>0.9336</td>
<td>0.0441</td>
</tr>
<tr>
<th>13</th>
<td>0.6500</td>
<td>0.3500</td>
<td>0.5755</td>
<td>0.0745</td>
<td>0.0392</td>
<td>0.3108</td>
<td>0.5843</td>
<td>0.0537</td>
<td>0.0304</td>
<td>0.3316</td>
<td>0.0327</td>
<td>0.9098</td>
<td>0.9326</td>
<td>0.0396</td>
</tr>
<tr>
<th>14</th>
<td>0.7000</td>
<td>0.3000</td>
<td>0.6219</td>
<td>0.0781</td>
<td>0.0326</td>
<td>0.2674</td>
<td>0.6292</td>
<td>0.0579</td>
<td>0.0253</td>
<td>0.2876</td>
<td>0.0313</td>
<td>0.9181</td>
<td>0.9379</td>
<td>0.0350</td>
</tr>
<tr>
<th>15</th>
<td>0.7500</td>
<td>0.2500</td>
<td>0.6641</td>
<td>0.0859</td>
<td>0.0273</td>
<td>0.2227</td>
<td>0.6708</td>
<td>0.0669</td>
<td>0.0206</td>
<td>0.2417</td>
<td>0.0300</td>
<td>0.9212</td>
<td>0.9389</td>
<td>0.0317</td>
</tr>
<tr>
<th>16</th>
<td>0.8000</td>
<td>0.2000</td>
<td>0.7084</td>
<td>0.0916</td>
<td>0.0226</td>
<td>0.1774</td>
<td>0.7120</td>
<td>0.0728</td>
<td>0.0190</td>
<td>0.1963</td>
<td>0.0286</td>
<td>0.9252</td>
<td>0.9393</td>
<td>0.0283</td>
</tr>
<tr>
<th>17</th>
<td>0.8500</td>
<td>0.1500</td>
<td>0.7536</td>
<td>0.0964</td>
<td>0.0167</td>
<td>0.1333</td>
<td>0.7533</td>
<td>0.0816</td>
<td>0.0170</td>
<td>0.1481</td>
<td>0.0251</td>
<td>0.9300</td>
<td>0.9384</td>
<td>0.0230</td>
</tr>
<tr>
<th>18</th>
<td>0.9000</td>
<td>0.1000</td>
<td>0.8009</td>
<td>0.0991</td>
<td>0.0109</td>
<td>0.0891</td>
<td>0.7979</td>
<td>0.0872</td>
<td>0.0139</td>
<td>0.1010</td>
<td>0.0225</td>
<td>0.9355</td>
<td>0.9402</td>
<td>0.0203</td>
</tr>
<tr>
<th>19</th>
<td>0.9500</td>
<td>0.0500</td>
<td>0.8437</td>
<td>0.1063</td>
<td>0.0057</td>
<td>0.0443</td>
<td>0.8364</td>
<td>0.0994</td>
<td>0.0130</td>
<td>0.0512</td>
<td>0.0181</td>
<td>0.9374</td>
<td>0.9367</td>
<td>0.0154</td>
</tr>
<tr>
<th>20</th>
<td>1.0000</td>
<td>0.0000</td>
<td>0.8886</td>
<td>0.1114</td>
<td>0.0000</td>
<td>0.0000</td>
<td>0.8790</td>
<td>0.1018</td>
<td>0.0096</td>
<td>0.0096</td>
<td>0.0096</td>
<td>0.9407</td>
<td>0.9400</td>
<td>0.0082</td>
</tr>
</tbody>
</table>
<div>&nbsp;</div>
<div>multiclass</div>
<table class="dataframe">
<thead>
<tr>
<th></th>
<th colspan="2" halign="left">base</th>
<th colspan="4" halign="left">true</th>
<th colspan="4" halign="left">estim</th>
<th colspan="4" halign="left">errors</th>
</tr>
<tr>
<th></th>
<th>0</th>
<th>1</th>
<th>T0</th>
<th>F1</th>
<th>F0</th>
<th>T1</th>
<th>T0</th>
<th>F1</th>
<th>F0</th>
<th>T1</th>
<th>ae</th>
<th>f1_true</th>
<th>f1_estim</th>
<th>f1_dist</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>0.0000</td>
<td>1.0000</td>
<td>0.0000</td>
<td>0.0000</td>
<td>0.1100</td>
<td>0.8900</td>
<td>0.0057</td>
<td>0.0143</td>
<td>0.1012</td>
<td>0.8788</td>
<td>0.0125</td>
<td>NaN</td>
<td>0.0854</td>
<td>NaN</td>
</tr>
<tr>
<th>1</th>
<td>0.0500</td>
<td>0.9500</td>
<td>0.0448</td>
<td>0.0052</td>
<td>0.1050</td>
<td>0.8450</td>
<td>0.0505</td>
<td>0.0143</td>
<td>0.0970</td>
<td>0.8382</td>
<td>0.0197</td>
<td>0.4570</td>
<td>0.4651</td>
<td>0.1655</td>
</tr>
<tr>
<th>2</th>
<td>0.1000</td>
<td>0.9000</td>
<td>0.0890</td>
<td>0.0110</td>
<td>0.0981</td>
<td>0.8019</td>
<td>0.0982</td>
<td>0.0162</td>
<td>0.0865</td>
<td>0.7991</td>
<td>0.0222</td>
<td>0.6247</td>
<td>0.6541</td>
<td>0.1180</td>
</tr>
<tr>
<th>3</th>
<td>0.1500</td>
<td>0.8500</td>
<td>0.1329</td>
<td>0.0171</td>
<td>0.0948</td>
<td>0.7552</td>
<td>0.1452</td>
<td>0.0189</td>
<td>0.0803</td>
<td>0.7556</td>
<td>0.0274</td>
<td>0.7062</td>
<td>0.7421</td>
<td>0.1113</td>
</tr>
<tr>
<th>4</th>
<td>0.2000</td>
<td>0.8000</td>
<td>0.1776</td>
<td>0.0224</td>
<td>0.0870</td>
<td>0.7130</td>
<td>0.1919</td>
<td>0.0197</td>
<td>0.0706</td>
<td>0.7177</td>
<td>0.0280</td>
<td>0.7661</td>
<td>0.8081</td>
<td>0.0927</td>
</tr>
<tr>
<th>5</th>
<td>0.2500</td>
<td>0.7500</td>
<td>0.2225</td>
<td>0.0275</td>
<td>0.0837</td>
<td>0.6663</td>
<td>0.2378</td>
<td>0.0224</td>
<td>0.0669</td>
<td>0.6729</td>
<td>0.0306</td>
<td>0.8013</td>
<td>0.8408</td>
<td>0.0818</td>
</tr>
<tr>
<th>6</th>
<td>0.3000</td>
<td>0.7000</td>
<td>0.2668</td>
<td>0.0332</td>
<td>0.0760</td>
<td>0.6240</td>
<td>0.2824</td>
<td>0.0256</td>
<td>0.0586</td>
<td>0.6334</td>
<td>0.0315</td>
<td>0.8306</td>
<td>0.8693</td>
<td>0.0711</td>
</tr>
<tr>
<th>7</th>
<td>0.3500</td>
<td>0.6500</td>
<td>0.3100</td>
<td>0.0400</td>
<td>0.0712</td>
<td>0.5788</td>
<td>0.3296</td>
<td>0.0295</td>
<td>0.0503</td>
<td>0.5905</td>
<td>0.0339</td>
<td>0.8480</td>
<td>0.8913</td>
<td>0.0696</td>
</tr>
<tr>
<th>8</th>
<td>0.4000</td>
<td>0.6000</td>
<td>0.3550</td>
<td>0.0450</td>
<td>0.0648</td>
<td>0.5352</td>
<td>0.3726</td>
<td>0.0312</td>
<td>0.0462</td>
<td>0.5501</td>
<td>0.0336</td>
<td>0.8661</td>
<td>0.9055</td>
<td>0.0610</td>
</tr>
<tr>
<th>9</th>
<td>0.4500</td>
<td>0.5500</td>
<td>0.3988</td>
<td>0.0512</td>
<td>0.0600</td>
<td>0.4900</td>
<td>0.4160</td>
<td>0.0355</td>
<td>0.0422</td>
<td>0.5064</td>
<td>0.0339</td>
<td>0.8776</td>
<td>0.9141</td>
<td>0.0554</td>
</tr>
<tr>
<th>10</th>
<td>0.5000</td>
<td>0.5000</td>
<td>0.4439</td>
<td>0.0561</td>
<td>0.0547</td>
<td>0.4453</td>
<td>0.4608</td>
<td>0.0373</td>
<td>0.0382</td>
<td>0.4637</td>
<td>0.0346</td>
<td>0.8889</td>
<td>0.9241</td>
<td>0.0516</td>
</tr>
<tr>
<th>11</th>
<td>0.5500</td>
<td>0.4500</td>
<td>0.4895</td>
<td>0.0605</td>
<td>0.0498</td>
<td>0.4002</td>
<td>0.5044</td>
<td>0.0425</td>
<td>0.0355</td>
<td>0.4176</td>
<td>0.0346</td>
<td>0.8985</td>
<td>0.9280</td>
<td>0.0471</td>
</tr>
<tr>
<th>12</th>
<td>0.6000</td>
<td>0.4000</td>
<td>0.5318</td>
<td>0.0683</td>
<td>0.0437</td>
<td>0.3563</td>
<td>0.5468</td>
<td>0.0452</td>
<td>0.0296</td>
<td>0.3783</td>
<td>0.0344</td>
<td>0.9045</td>
<td>0.9359</td>
<td>0.0448</td>
</tr>
<tr>
<th>13</th>
<td>0.6500</td>
<td>0.3500</td>
<td>0.5755</td>
<td>0.0745</td>
<td>0.0392</td>
<td>0.3108</td>
<td>0.5866</td>
<td>0.0518</td>
<td>0.0293</td>
<td>0.3323</td>
<td>0.0338</td>
<td>0.9098</td>
<td>0.9352</td>
<td>0.0403</td>
</tr>
<tr>
<th>14</th>
<td>0.7000</td>
<td>0.3000</td>
<td>0.6219</td>
<td>0.0781</td>
<td>0.0326</td>
<td>0.2674</td>
<td>0.6312</td>
<td>0.0534</td>
<td>0.0258</td>
<td>0.2896</td>
<td>0.0331</td>
<td>0.9181</td>
<td>0.9408</td>
<td>0.0367</td>
</tr>
<tr>
<th>15</th>
<td>0.7500</td>
<td>0.2500</td>
<td>0.6641</td>
<td>0.0859</td>
<td>0.0273</td>
<td>0.2227</td>
<td>0.6730</td>
<td>0.0619</td>
<td>0.0207</td>
<td>0.2445</td>
<td>0.0322</td>
<td>0.9212</td>
<td>0.9423</td>
<td>0.0335</td>
</tr>
<tr>
<th>16</th>
<td>0.8000</td>
<td>0.2000</td>
<td>0.7084</td>
<td>0.0916</td>
<td>0.0226</td>
<td>0.1774</td>
<td>0.7141</td>
<td>0.0657</td>
<td>0.0200</td>
<td>0.2001</td>
<td>0.0309</td>
<td>0.9252</td>
<td>0.9431</td>
<td>0.0304</td>
</tr>
<tr>
<th>17</th>
<td>0.8500</td>
<td>0.1500</td>
<td>0.7536</td>
<td>0.0964</td>
<td>0.0167</td>
<td>0.1333</td>
<td>0.7556</td>
<td>0.0756</td>
<td>0.0171</td>
<td>0.1517</td>
<td>0.0274</td>
<td>0.9300</td>
<td>0.9420</td>
<td>0.0247</td>
</tr>
<tr>
<th>18</th>
<td>0.9000</td>
<td>0.1000</td>
<td>0.8009</td>
<td>0.0991</td>
<td>0.0109</td>
<td>0.0891</td>
<td>0.8000</td>
<td>0.0799</td>
<td>0.0150</td>
<td>0.1050</td>
<td>0.0250</td>
<td>0.9355</td>
<td>0.9437</td>
<td>0.0223</td>
</tr>
<tr>
<th>19</th>
<td>0.9500</td>
<td>0.0500</td>
<td>0.8437</td>
<td>0.1063</td>
<td>0.0057</td>
<td>0.0443</td>
<td>0.8389</td>
<td>0.0916</td>
<td>0.0140</td>
<td>0.0555</td>
<td>0.0209</td>
<td>0.9374</td>
<td>0.9405</td>
<td>0.0167</td>
</tr>
<tr>
<th>20</th>
<td>1.0000</td>
<td>0.0000</td>
<td>0.8886</td>
<td>0.1114</td>
<td>0.0000</td>
<td>0.0000</td>
<td>0.8811</td>
<td>0.0965</td>
<td>0.0108</td>
<td>0.0116</td>
<td>0.0135</td>
<td>0.9407</td>
<td>0.9422</td>
<td>0.0108</td>
</tr>
</tbody>
</table>
</body>
</html>

802
out_spambase.html Normal file
View File

@ -0,0 +1,802 @@
<html>
<head>
<style>
table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
th, td {
padding: 4px;
}
tr:hover{
background-color: lightgreen;
}
</style>
</head>
<body>
<div>spambase</div>
<div>#instances=4601, type=<class 'numpy.ndarray'>, #features=57, #classes=[0 1], prevs=[0.606, 0.394]</div>
<div>Tests:</div>
<div>protocol=APP</div>
<div>n_prevalences=21</div>
<div>repreats=1000</div>
<div>&nbsp;</div>
<div>binary</div>
<table class="dataframe">
<thead>
<tr>
<th></th>
<th colspan="2" halign="left">base</th>
<th colspan="4" halign="left">true</th>
<th colspan="4" halign="left">estim</th>
<th colspan="4" halign="left">errors</th>
</tr>
<tr>
<th></th>
<th>0</th>
<th>1</th>
<th>T0</th>
<th>F1</th>
<th>F0</th>
<th>T1</th>
<th>T0</th>
<th>F1</th>
<th>F0</th>
<th>T1</th>
<th>ae</th>
<th>f1_true</th>
<th>f1_estim</th>
<th>f1_dist</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>0.0000</td>
<td>1.0000</td>
<td>0.0000</td>
<td>0.0000</td>
<td>0.0949</td>
<td>0.9052</td>
<td>0.0067</td>
<td>0.0012</td>
<td>0.0882</td>
<td>0.9040</td>
<td>0.0039</td>
<td>NaN</td>
<td>0.1154</td>
<td>NaN</td>
</tr>
<tr>
<th>1</th>
<td>0.0500</td>
<td>0.9500</td>
<td>0.0470</td>
<td>0.0030</td>
<td>0.0908</td>
<td>0.8592</td>
<td>0.0584</td>
<td>0.0020</td>
<td>0.0794</td>
<td>0.8601</td>
<td>0.0114</td>
<td>0.5095</td>
<td>0.5828</td>
<td>0.1418</td>
</tr>
<tr>
<th>2</th>
<td>0.1000</td>
<td>0.9000</td>
<td>0.0940</td>
<td>0.0060</td>
<td>0.0867</td>
<td>0.8133</td>
<td>0.1090</td>
<td>0.0030</td>
<td>0.0717</td>
<td>0.8163</td>
<td>0.0147</td>
<td>0.6748</td>
<td>0.7417</td>
<td>0.1057</td>
</tr>
<tr>
<th>3</th>
<td>0.1500</td>
<td>0.8500</td>
<td>0.1410</td>
<td>0.0090</td>
<td>0.0817</td>
<td>0.7683</td>
<td>0.1585</td>
<td>0.0039</td>
<td>0.0642</td>
<td>0.7733</td>
<td>0.0180</td>
<td>0.7593</td>
<td>0.8205</td>
<td>0.0926</td>
</tr>
<tr>
<th>4</th>
<td>0.2000</td>
<td>0.8000</td>
<td>0.1882</td>
<td>0.0118</td>
<td>0.0761</td>
<td>0.7238</td>
<td>0.2081</td>
<td>0.0066</td>
<td>0.0562</td>
<td>0.7291</td>
<td>0.0203</td>
<td>0.8121</td>
<td>0.8676</td>
<td>0.0762</td>
</tr>
<tr>
<th>5</th>
<td>0.2500</td>
<td>0.7500</td>
<td>0.2360</td>
<td>0.0140</td>
<td>0.0707</td>
<td>0.6794</td>
<td>0.2564</td>
<td>0.0073</td>
<td>0.0503</td>
<td>0.6860</td>
<td>0.0212</td>
<td>0.8491</td>
<td>0.8982</td>
<td>0.0662</td>
</tr>
<tr>
<th>6</th>
<td>0.3000</td>
<td>0.7000</td>
<td>0.2828</td>
<td>0.0173</td>
<td>0.0657</td>
<td>0.6343</td>
<td>0.3051</td>
<td>0.0093</td>
<td>0.0434</td>
<td>0.6422</td>
<td>0.0236</td>
<td>0.8727</td>
<td>0.9202</td>
<td>0.0622</td>
</tr>
<tr>
<th>7</th>
<td>0.3500</td>
<td>0.6500</td>
<td>0.3293</td>
<td>0.0207</td>
<td>0.0630</td>
<td>0.5870</td>
<td>0.3521</td>
<td>0.0106</td>
<td>0.0402</td>
<td>0.5971</td>
<td>0.0244</td>
<td>0.8877</td>
<td>0.9325</td>
<td>0.0556</td>
</tr>
<tr>
<th>8</th>
<td>0.4000</td>
<td>0.6000</td>
<td>0.3759</td>
<td>0.0241</td>
<td>0.0563</td>
<td>0.5438</td>
<td>0.3975</td>
<td>0.0149</td>
<td>0.0347</td>
<td>0.5529</td>
<td>0.0252</td>
<td>0.9037</td>
<td>0.9411</td>
<td>0.0485</td>
</tr>
<tr>
<th>9</th>
<td>0.4500</td>
<td>0.5500</td>
<td>0.4246</td>
<td>0.0254</td>
<td>0.0533</td>
<td>0.4967</td>
<td>0.4465</td>
<td>0.0157</td>
<td>0.0315</td>
<td>0.5064</td>
<td>0.0262</td>
<td>0.9153</td>
<td>0.9499</td>
<td>0.0464</td>
</tr>
<tr>
<th>10</th>
<td>0.5000</td>
<td>0.5000</td>
<td>0.4718</td>
<td>0.0282</td>
<td>0.0475</td>
<td>0.4525</td>
<td>0.4904</td>
<td>0.0180</td>
<td>0.0289</td>
<td>0.4628</td>
<td>0.0255</td>
<td>0.9258</td>
<td>0.9543</td>
<td>0.0397</td>
</tr>
<tr>
<th>11</th>
<td>0.5500</td>
<td>0.4500</td>
<td>0.5181</td>
<td>0.0319</td>
<td>0.0427</td>
<td>0.4073</td>
<td>0.5344</td>
<td>0.0233</td>
<td>0.0264</td>
<td>0.4159</td>
<td>0.0261</td>
<td>0.9328</td>
<td>0.9556</td>
<td>0.0365</td>
</tr>
<tr>
<th>12</th>
<td>0.6000</td>
<td>0.4000</td>
<td>0.5655</td>
<td>0.0345</td>
<td>0.0377</td>
<td>0.3623</td>
<td>0.5803</td>
<td>0.0249</td>
<td>0.0229</td>
<td>0.3719</td>
<td>0.0254</td>
<td>0.9400</td>
<td>0.9606</td>
<td>0.0314</td>
</tr>
<tr>
<th>13</th>
<td>0.6500</td>
<td>0.3500</td>
<td>0.6124</td>
<td>0.0376</td>
<td>0.0327</td>
<td>0.3173</td>
<td>0.6240</td>
<td>0.0280</td>
<td>0.0211</td>
<td>0.3268</td>
<td>0.0248</td>
<td>0.9457</td>
<td>0.9622</td>
<td>0.0294</td>
</tr>
<tr>
<th>14</th>
<td>0.7000</td>
<td>0.3000</td>
<td>0.6593</td>
<td>0.0407</td>
<td>0.0286</td>
<td>0.2714</td>
<td>0.6680</td>
<td>0.0326</td>
<td>0.0199</td>
<td>0.2794</td>
<td>0.0246</td>
<td>0.9500</td>
<td>0.9623</td>
<td>0.0268</td>
</tr>
<tr>
<th>15</th>
<td>0.7500</td>
<td>0.2500</td>
<td>0.7054</td>
<td>0.0446</td>
<td>0.0242</td>
<td>0.2258</td>
<td>0.7113</td>
<td>0.0367</td>
<td>0.0182</td>
<td>0.2337</td>
<td>0.0244</td>
<td>0.9534</td>
<td>0.9630</td>
<td>0.0240</td>
</tr>
<tr>
<th>16</th>
<td>0.8000</td>
<td>0.2000</td>
<td>0.7528</td>
<td>0.0472</td>
<td>0.0192</td>
<td>0.1808</td>
<td>0.7564</td>
<td>0.0394</td>
<td>0.0156</td>
<td>0.1887</td>
<td>0.0234</td>
<td>0.9577</td>
<td>0.9651</td>
<td>0.0222</td>
</tr>
<tr>
<th>17</th>
<td>0.8500</td>
<td>0.1500</td>
<td>0.8007</td>
<td>0.0493</td>
<td>0.0143</td>
<td>0.1357</td>
<td>0.8004</td>
<td>0.0442</td>
<td>0.0147</td>
<td>0.1407</td>
<td>0.0214</td>
<td>0.9617</td>
<td>0.9646</td>
<td>0.0192</td>
</tr>
<tr>
<th>18</th>
<td>0.9000</td>
<td>0.1000</td>
<td>0.8478</td>
<td>0.0522</td>
<td>0.0094</td>
<td>0.0906</td>
<td>0.8445</td>
<td>0.0472</td>
<td>0.0127</td>
<td>0.0956</td>
<td>0.0191</td>
<td>0.9648</td>
<td>0.9658</td>
<td>0.0163</td>
</tr>
<tr>
<th>19</th>
<td>0.9500</td>
<td>0.0500</td>
<td>0.8945</td>
<td>0.0555</td>
<td>0.0050</td>
<td>0.0450</td>
<td>0.8883</td>
<td>0.0512</td>
<td>0.0112</td>
<td>0.0493</td>
<td>0.0170</td>
<td>0.9672</td>
<td>0.9661</td>
<td>0.0141</td>
</tr>
<tr>
<th>20</th>
<td>1.0000</td>
<td>0.0000</td>
<td>0.9421</td>
<td>0.0579</td>
<td>0.0000</td>
<td>0.0000</td>
<td>0.9306</td>
<td>0.0476</td>
<td>0.0115</td>
<td>0.0103</td>
<td>0.0109</td>
<td>0.9701</td>
<td>0.9691</td>
<td>0.0081</td>
</tr>
</tbody>
</table>
<div>&nbsp;</div>
<div>multiclass</div>
<table border="1" class="dataframe">
<thead>
<tr>
<th></th>
<th colspan="2" halign="left">base</th>
<th colspan="4" halign="left">true</th>
<th colspan="4" halign="left">estim</th>
<th colspan="4" halign="left">errors</th>
</tr>
<tr>
<th></th>
<th>0</th>
<th>1</th>
<th>T0</th>
<th>F1</th>
<th>F0</th>
<th>T1</th>
<th>T0</th>
<th>F1</th>
<th>F0</th>
<th>T1</th>
<th>ae</th>
<th>f1_true</th>
<th>f1_estim</th>
<th>f1_dist</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>0.0000</td>
<td>1.0000</td>
<td>0.0000</td>
<td>0.0000</td>
<td>0.0949</td>
<td>0.9052</td>
<td>0.0008</td>
<td>0.0001</td>
<td>0.0202</td>
<td>0.9789</td>
<td>0.0375</td>
<td>NaN</td>
<td>0.0949</td>
<td>NaN</td>
</tr>
<tr>
<th>1</th>
<td>0.0500</td>
<td>0.9500</td>
<td>0.0470</td>
<td>0.0030</td>
<td>0.0908</td>
<td>0.8592</td>
<td>0.0460</td>
<td>0.0001</td>
<td>0.0329</td>
<td>0.9209</td>
<td>0.0368</td>
<td>0.5095</td>
<td>0.7394</td>
<td>0.3362</td>
</tr>
<tr>
<th>2</th>
<td>0.1000</td>
<td>0.9000</td>
<td>0.0940</td>
<td>0.0060</td>
<td>0.0867</td>
<td>0.8133</td>
<td>0.0971</td>
<td>0.0001</td>
<td>0.0379</td>
<td>0.8650</td>
<td>0.0358</td>
<td>0.6748</td>
<td>0.8416</td>
<td>0.2255</td>
</tr>
<tr>
<th>3</th>
<td>0.1500</td>
<td>0.8500</td>
<td>0.1410</td>
<td>0.0090</td>
<td>0.0817</td>
<td>0.7683</td>
<td>0.1459</td>
<td>0.0001</td>
<td>0.0452</td>
<td>0.8088</td>
<td>0.0342</td>
<td>0.7593</td>
<td>0.8626</td>
<td>0.1647</td>
</tr>
<tr>
<th>4</th>
<td>0.2000</td>
<td>0.8000</td>
<td>0.1882</td>
<td>0.0118</td>
<td>0.0761</td>
<td>0.7238</td>
<td>0.1985</td>
<td>0.0001</td>
<td>0.0499</td>
<td>0.7515</td>
<td>0.0324</td>
<td>0.8121</td>
<td>0.8892</td>
<td>0.1246</td>
</tr>
<tr>
<th>5</th>
<td>0.2500</td>
<td>0.7500</td>
<td>0.2360</td>
<td>0.0140</td>
<td>0.0707</td>
<td>0.6794</td>
<td>0.2519</td>
<td>0.0001</td>
<td>0.0511</td>
<td>0.6970</td>
<td>0.0318</td>
<td>0.8491</td>
<td>0.9077</td>
<td>0.0996</td>
</tr>
<tr>
<th>6</th>
<td>0.3000</td>
<td>0.7000</td>
<td>0.2828</td>
<td>0.0173</td>
<td>0.0657</td>
<td>0.6343</td>
<td>0.3042</td>
<td>0.0001</td>
<td>0.0513</td>
<td>0.6444</td>
<td>0.0319</td>
<td>0.8727</td>
<td>0.9216</td>
<td>0.0832</td>
</tr>
<tr>
<th>7</th>
<td>0.3500</td>
<td>0.6500</td>
<td>0.3293</td>
<td>0.0207</td>
<td>0.0630</td>
<td>0.5870</td>
<td>0.3606</td>
<td>0.0001</td>
<td>0.0539</td>
<td>0.5854</td>
<td>0.0350</td>
<td>0.8877</td>
<td>0.9298</td>
<td>0.0756</td>
</tr>
<tr>
<th>8</th>
<td>0.4000</td>
<td>0.6000</td>
<td>0.3759</td>
<td>0.0241</td>
<td>0.0563</td>
<td>0.5438</td>
<td>0.4070</td>
<td>0.0001</td>
<td>0.0580</td>
<td>0.5349</td>
<td>0.0365</td>
<td>0.9037</td>
<td>0.9326</td>
<td>0.0666</td>
</tr>
<tr>
<th>9</th>
<td>0.4500</td>
<td>0.5500</td>
<td>0.4246</td>
<td>0.0254</td>
<td>0.0533</td>
<td>0.4967</td>
<td>0.4652</td>
<td>0.0001</td>
<td>0.0574</td>
<td>0.4773</td>
<td>0.0388</td>
<td>0.9153</td>
<td>0.9412</td>
<td>0.0588</td>
</tr>
<tr>
<th>10</th>
<td>0.5000</td>
<td>0.5000</td>
<td>0.4718</td>
<td>0.0282</td>
<td>0.0475</td>
<td>0.4525</td>
<td>0.5159</td>
<td>0.0001</td>
<td>0.0605</td>
<td>0.4235</td>
<td>0.0417</td>
<td>0.9258</td>
<td>0.9439</td>
<td>0.0526</td>
</tr>
<tr>
<th>11</th>
<td>0.5500</td>
<td>0.4500</td>
<td>0.5181</td>
<td>0.0319</td>
<td>0.0427</td>
<td>0.4073</td>
<td>0.5681</td>
<td>0.0001</td>
<td>0.0574</td>
<td>0.3744</td>
<td>0.0437</td>
<td>0.9328</td>
<td>0.9511</td>
<td>0.0467</td>
</tr>
<tr>
<th>12</th>
<td>0.6000</td>
<td>0.4000</td>
<td>0.5655</td>
<td>0.0345</td>
<td>0.0377</td>
<td>0.3623</td>
<td>0.6211</td>
<td>0.0001</td>
<td>0.0552</td>
<td>0.3236</td>
<td>0.0463</td>
<td>0.9400</td>
<td>0.9568</td>
<td>0.0426</td>
</tr>
<tr>
<th>13</th>
<td>0.6500</td>
<td>0.3500</td>
<td>0.6124</td>
<td>0.0376</td>
<td>0.0327</td>
<td>0.3173</td>
<td>0.6710</td>
<td>0.0001</td>
<td>0.0575</td>
<td>0.2714</td>
<td>0.0496</td>
<td>0.9457</td>
<td>0.9582</td>
<td>0.0385</td>
</tr>
<tr>
<th>14</th>
<td>0.7000</td>
<td>0.3000</td>
<td>0.6593</td>
<td>0.0407</td>
<td>0.0286</td>
<td>0.2714</td>
<td>0.7240</td>
<td>0.0001</td>
<td>0.0541</td>
<td>0.2217</td>
<td>0.0515</td>
<td>0.9500</td>
<td>0.9634</td>
<td>0.0345</td>
</tr>
<tr>
<th>15</th>
<td>0.7500</td>
<td>0.2500</td>
<td>0.7054</td>
<td>0.0446</td>
<td>0.0242</td>
<td>0.2258</td>
<td>0.7750</td>
<td>0.0001</td>
<td>0.0476</td>
<td>0.1773</td>
<td>0.0523</td>
<td>0.9534</td>
<td>0.9697</td>
<td>0.0337</td>
</tr>
<tr>
<th>16</th>
<td>0.8000</td>
<td>0.2000</td>
<td>0.7528</td>
<td>0.0472</td>
<td>0.0192</td>
<td>0.1808</td>
<td>0.8212</td>
<td>0.0001</td>
<td>0.0469</td>
<td>0.1318</td>
<td>0.0526</td>
<td>0.9577</td>
<td>0.9717</td>
<td>0.0296</td>
</tr>
<tr>
<th>17</th>
<td>0.8500</td>
<td>0.1500</td>
<td>0.8007</td>
<td>0.0493</td>
<td>0.0143</td>
<td>0.1357</td>
<td>0.8673</td>
<td>0.0001</td>
<td>0.0443</td>
<td>0.0882</td>
<td>0.0524</td>
<td>0.9617</td>
<td>0.9745</td>
<td>0.0272</td>
</tr>
<tr>
<th>18</th>
<td>0.9000</td>
<td>0.1000</td>
<td>0.8478</td>
<td>0.0522</td>
<td>0.0094</td>
<td>0.0906</td>
<td>0.9127</td>
<td>0.0001</td>
<td>0.0366</td>
<td>0.0506</td>
<td>0.0489</td>
<td>0.9648</td>
<td>0.9799</td>
<td>0.0250</td>
</tr>
<tr>
<th>19</th>
<td>0.9500</td>
<td>0.0500</td>
<td>0.8945</td>
<td>0.0555</td>
<td>0.0050</td>
<td>0.0450</td>
<td>0.9515</td>
<td>0.0001</td>
<td>0.0275</td>
<td>0.0208</td>
<td>0.0423</td>
<td>0.9672</td>
<td>0.9854</td>
<td>0.0235</td>
</tr>
<tr>
<th>20</th>
<td>1.0000</td>
<td>0.0000</td>
<td>0.9421</td>
<td>0.0579</td>
<td>0.0000</td>
<td>0.0000</td>
<td>0.9762</td>
<td>0.0001</td>
<td>0.0190</td>
<td>0.0047</td>
<td>0.0301</td>
<td>0.9701</td>
<td>0.9901</td>
<td>0.0222</td>
</tr>
</tbody>
</table>
</body>
</html>

244
poetry.lock generated
View File

@ -100,6 +100,78 @@ mypy = ["contourpy[bokeh]", "docutils-stubs", "mypy (==0.991)", "types-Pillow"]
test = ["Pillow", "matplotlib", "pytest"]
test-no-images = ["pytest"]
[[package]]
name = "coverage"
version = "7.2.7"
description = "Code coverage measurement for Python"
optional = false
python-versions = ">=3.7"
files = [
{file = "coverage-7.2.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d39b5b4f2a66ccae8b7263ac3c8170994b65266797fb96cbbfd3fb5b23921db8"},
{file = "coverage-7.2.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d040ef7c9859bb11dfeb056ff5b3872436e3b5e401817d87a31e1750b9ae2fb"},
{file = "coverage-7.2.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba90a9563ba44a72fda2e85302c3abc71c5589cea608ca16c22b9804262aaeb6"},
{file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7d9405291c6928619403db1d10bd07888888ec1abcbd9748fdaa971d7d661b2"},
{file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31563e97dae5598556600466ad9beea39fb04e0229e61c12eaa206e0aa202063"},
{file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ebba1cd308ef115925421d3e6a586e655ca5a77b5bf41e02eb0e4562a111f2d1"},
{file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cb017fd1b2603ef59e374ba2063f593abe0fc45f2ad9abdde5b4d83bd922a353"},
{file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62a5c7dad11015c66fbb9d881bc4caa5b12f16292f857842d9d1871595f4495"},
{file = "coverage-7.2.7-cp310-cp310-win32.whl", hash = "sha256:ee57190f24fba796e36bb6d3aa8a8783c643d8fa9760c89f7a98ab5455fbf818"},
{file = "coverage-7.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:f75f7168ab25dd93110c8a8117a22450c19976afbc44234cbf71481094c1b850"},
{file = "coverage-7.2.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06a9a2be0b5b576c3f18f1a241f0473575c4a26021b52b2a85263a00f034d51f"},
{file = "coverage-7.2.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5baa06420f837184130752b7c5ea0808762083bf3487b5038d68b012e5937dbe"},
{file = "coverage-7.2.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdec9e8cbf13a5bf63290fc6013d216a4c7232efb51548594ca3631a7f13c3a3"},
{file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52edc1a60c0d34afa421c9c37078817b2e67a392cab17d97283b64c5833f427f"},
{file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63426706118b7f5cf6bb6c895dc215d8a418d5952544042c8a2d9fe87fcf09cb"},
{file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:afb17f84d56068a7c29f5fa37bfd38d5aba69e3304af08ee94da8ed5b0865833"},
{file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:48c19d2159d433ccc99e729ceae7d5293fbffa0bdb94952d3579983d1c8c9d97"},
{file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0e1f928eaf5469c11e886fe0885ad2bf1ec606434e79842a879277895a50942a"},
{file = "coverage-7.2.7-cp311-cp311-win32.whl", hash = "sha256:33d6d3ea29d5b3a1a632b3c4e4f4ecae24ef170b0b9ee493883f2df10039959a"},
{file = "coverage-7.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:5b7540161790b2f28143191f5f8ec02fb132660ff175b7747b95dcb77ac26562"},
{file = "coverage-7.2.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f2f67fe12b22cd130d34d0ef79206061bfb5eda52feb6ce0dba0644e20a03cf4"},
{file = "coverage-7.2.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a342242fe22407f3c17f4b499276a02b01e80f861f1682ad1d95b04018e0c0d4"},
{file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:171717c7cb6b453aebac9a2ef603699da237f341b38eebfee9be75d27dc38e01"},
{file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49969a9f7ffa086d973d91cec8d2e31080436ef0fb4a359cae927e742abfaaa6"},
{file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b46517c02ccd08092f4fa99f24c3b83d8f92f739b4657b0f146246a0ca6a831d"},
{file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a3d33a6b3eae87ceaefa91ffdc130b5e8536182cd6dfdbfc1aa56b46ff8c86de"},
{file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:976b9c42fb2a43ebf304fa7d4a310e5f16cc99992f33eced91ef6f908bd8f33d"},
{file = "coverage-7.2.7-cp312-cp312-win32.whl", hash = "sha256:8de8bb0e5ad103888d65abef8bca41ab93721647590a3f740100cd65c3b00511"},
{file = "coverage-7.2.7-cp312-cp312-win_amd64.whl", hash = "sha256:9e31cb64d7de6b6f09702bb27c02d1904b3aebfca610c12772452c4e6c21a0d3"},
{file = "coverage-7.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58c2ccc2f00ecb51253cbe5d8d7122a34590fac9646a960d1430d5b15321d95f"},
{file = "coverage-7.2.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d22656368f0e6189e24722214ed8d66b8022db19d182927b9a248a2a8a2f67eb"},
{file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a895fcc7b15c3fc72beb43cdcbdf0ddb7d2ebc959edac9cef390b0d14f39f8a9"},
{file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84606b74eb7de6ff581a7915e2dab7a28a0517fbe1c9239eb227e1354064dcd"},
{file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0a5f9e1dbd7fbe30196578ca36f3fba75376fb99888c395c5880b355e2875f8a"},
{file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:419bfd2caae268623dd469eff96d510a920c90928b60f2073d79f8fe2bbc5959"},
{file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2aee274c46590717f38ae5e4650988d1af340fe06167546cc32fe2f58ed05b02"},
{file = "coverage-7.2.7-cp37-cp37m-win32.whl", hash = "sha256:61b9a528fb348373c433e8966535074b802c7a5d7f23c4f421e6c6e2f1697a6f"},
{file = "coverage-7.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:b1c546aca0ca4d028901d825015dc8e4d56aac4b541877690eb76490f1dc8ed0"},
{file = "coverage-7.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:54b896376ab563bd38453cecb813c295cf347cf5906e8b41d340b0321a5433e5"},
{file = "coverage-7.2.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3d376df58cc111dc8e21e3b6e24606b5bb5dee6024f46a5abca99124b2229ef5"},
{file = "coverage-7.2.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e330fc79bd7207e46c7d7fd2bb4af2963f5f635703925543a70b99574b0fea9"},
{file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e9d683426464e4a252bf70c3498756055016f99ddaec3774bf368e76bbe02b6"},
{file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d13c64ee2d33eccf7437961b6ea7ad8673e2be040b4f7fd4fd4d4d28d9ccb1e"},
{file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7aa5f8a41217360e600da646004f878250a0d6738bcdc11a0a39928d7dc2050"},
{file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8fa03bce9bfbeeef9f3b160a8bed39a221d82308b4152b27d82d8daa7041fee5"},
{file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:245167dd26180ab4c91d5e1496a30be4cd721a5cf2abf52974f965f10f11419f"},
{file = "coverage-7.2.7-cp38-cp38-win32.whl", hash = "sha256:d2c2db7fd82e9b72937969bceac4d6ca89660db0a0967614ce2481e81a0b771e"},
{file = "coverage-7.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:2e07b54284e381531c87f785f613b833569c14ecacdcb85d56b25c4622c16c3c"},
{file = "coverage-7.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:537891ae8ce59ef63d0123f7ac9e2ae0fc8b72c7ccbe5296fec45fd68967b6c9"},
{file = "coverage-7.2.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06fb182e69f33f6cd1d39a6c597294cff3143554b64b9825d1dc69d18cc2fff2"},
{file = "coverage-7.2.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:201e7389591af40950a6480bd9edfa8ed04346ff80002cec1a66cac4549c1ad7"},
{file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6951407391b639504e3b3be51b7ba5f3528adbf1a8ac3302b687ecababf929e"},
{file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f48351d66575f535669306aa7d6d6f71bc43372473b54a832222803eb956fd1"},
{file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b29019c76039dc3c0fd815c41392a044ce555d9bcdd38b0fb60fb4cd8e475ba9"},
{file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:81c13a1fc7468c40f13420732805a4c38a105d89848b7c10af65a90beff25250"},
{file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:975d70ab7e3c80a3fe86001d8751f6778905ec723f5b110aed1e450da9d4b7f2"},
{file = "coverage-7.2.7-cp39-cp39-win32.whl", hash = "sha256:7ee7d9d4822c8acc74a5e26c50604dff824710bc8de424904c0982e25c39c6cb"},
{file = "coverage-7.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:eb393e5ebc85245347950143969b241d08b52b88a3dc39479822e073a1a8eb27"},
{file = "coverage-7.2.7-pp37.pp38.pp39-none-any.whl", hash = "sha256:b7b4c971f05e6ae490fef852c218b0e79d4e52f79ef0c8475566584a8fb3e01d"},
{file = "coverage-7.2.7.tar.gz", hash = "sha256:924d94291ca674905fe9481f12294eb11f2d3d3fd1adb20314ba89e94f44ed59"},
]
[package.extras]
toml = ["tomli"]
[[package]]
name = "cycler"
version = "0.11.0"
@ -147,6 +219,23 @@ files = [
{file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"},
]
[[package]]
name = "jinja2"
version = "3.1.2"
description = "A very fast and expressive template engine."
optional = false
python-versions = ">=3.7"
files = [
{file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"},
{file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"},
]
[package.dependencies]
MarkupSafe = ">=2.0"
[package.extras]
i18n = ["Babel (>=2.7)"]
[[package]]
name = "joblib"
version = "1.2.0"
@ -235,6 +324,65 @@ files = [
{file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"},
]
[[package]]
name = "markupsafe"
version = "2.1.3"
description = "Safely add untrusted strings to HTML/XML markup."
optional = false
python-versions = ">=3.7"
files = [
{file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"},
{file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"},
{file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"},
{file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"},
{file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"},
{file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"},
{file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"},
{file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"},
{file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"},
{file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"},
{file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"},
{file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"},
{file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"},
{file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"},
{file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"},
{file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"},
{file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"},
{file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"},
{file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"},
{file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"},
{file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"},
{file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"},
{file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"},
{file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"},
{file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"},
{file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"},
{file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"},
{file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"},
{file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"},
{file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"},
{file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"},
{file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"},
{file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"},
{file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"},
{file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"},
{file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"},
{file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"},
{file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"},
{file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"},
{file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"},
{file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"},
{file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"},
{file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"},
{file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"},
{file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"},
{file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"},
{file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"},
{file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"},
{file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"},
{file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"},
]
[[package]]
name = "matplotlib"
version = "3.7.1"
@ -504,6 +652,65 @@ files = [
dev = ["pre-commit", "tox"]
testing = ["pytest", "pytest-benchmark"]
[[package]]
name = "pyarrow"
version = "12.0.1"
description = "Python library for Apache Arrow"
optional = false
python-versions = ">=3.7"
files = [
{file = "pyarrow-12.0.1-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:6d288029a94a9bb5407ceebdd7110ba398a00412c5b0155ee9813a40d246c5df"},
{file = "pyarrow-12.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:345e1828efdbd9aa4d4de7d5676778aba384a2c3add896d995b23d368e60e5af"},
{file = "pyarrow-12.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d6009fdf8986332b2169314da482baed47ac053311c8934ac6651e614deacd6"},
{file = "pyarrow-12.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d3c4cbbf81e6dd23fe921bc91dc4619ea3b79bc58ef10bce0f49bdafb103daf"},
{file = "pyarrow-12.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:cdacf515ec276709ac8042c7d9bd5be83b4f5f39c6c037a17a60d7ebfd92c890"},
{file = "pyarrow-12.0.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:749be7fd2ff260683f9cc739cb862fb11be376de965a2a8ccbf2693b098db6c7"},
{file = "pyarrow-12.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6895b5fb74289d055c43db3af0de6e16b07586c45763cb5e558d38b86a91e3a7"},
{file = "pyarrow-12.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1887bdae17ec3b4c046fcf19951e71b6a619f39fa674f9881216173566c8f718"},
{file = "pyarrow-12.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2c9cb8eeabbadf5fcfc3d1ddea616c7ce893db2ce4dcef0ac13b099ad7ca082"},
{file = "pyarrow-12.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:ce4aebdf412bd0eeb800d8e47db854f9f9f7e2f5a0220440acf219ddfddd4f63"},
{file = "pyarrow-12.0.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:e0d8730c7f6e893f6db5d5b86eda42c0a130842d101992b581e2138e4d5663d3"},
{file = "pyarrow-12.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43364daec02f69fec89d2315f7fbfbeec956e0d991cbbef471681bd77875c40f"},
{file = "pyarrow-12.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:051f9f5ccf585f12d7de836e50965b3c235542cc896959320d9776ab93f3b33d"},
{file = "pyarrow-12.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:be2757e9275875d2a9c6e6052ac7957fbbfc7bc7370e4a036a9b893e96fedaba"},
{file = "pyarrow-12.0.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:cf812306d66f40f69e684300f7af5111c11f6e0d89d6b733e05a3de44961529d"},
{file = "pyarrow-12.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:459a1c0ed2d68671188b2118c63bac91eaef6fc150c77ddd8a583e3c795737bf"},
{file = "pyarrow-12.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85e705e33eaf666bbe508a16fd5ba27ca061e177916b7a317ba5a51bee43384c"},
{file = "pyarrow-12.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9120c3eb2b1f6f516a3b7a9714ed860882d9ef98c4b17edcdc91d95b7528db60"},
{file = "pyarrow-12.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:c780f4dc40460015d80fcd6a6140de80b615349ed68ef9adb653fe351778c9b3"},
{file = "pyarrow-12.0.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:a3c63124fc26bf5f95f508f5d04e1ece8cc23a8b0af2a1e6ab2b1ec3fdc91b24"},
{file = "pyarrow-12.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b13329f79fa4472324f8d32dc1b1216616d09bd1e77cfb13104dec5463632c36"},
{file = "pyarrow-12.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb656150d3d12ec1396f6dde542db1675a95c0cc8366d507347b0beed96e87ca"},
{file = "pyarrow-12.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6251e38470da97a5b2e00de5c6a049149f7b2bd62f12fa5dbb9ac674119ba71a"},
{file = "pyarrow-12.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:3de26da901216149ce086920547dfff5cd22818c9eab67ebc41e863a5883bac7"},
{file = "pyarrow-12.0.1.tar.gz", hash = "sha256:cce317fc96e5b71107bf1f9f184d5e54e2bd14bbf3f9a3d62819961f0af86fec"},
]
[package.dependencies]
numpy = ">=1.16.6"
[[package]]
name = "pylance"
version = "0.5.9"
description = "python wrapper for lance-rs"
optional = false
python-versions = ">=3.8"
files = [
{file = "pylance-0.5.9-cp38-abi3-macosx_10_15_x86_64.whl", hash = "sha256:6d5395f8a400caa152b9dc8d1f979b67c3003cbe54e038a53b33127f9a0c96da"},
{file = "pylance-0.5.9-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:b099a7fa01a96dc6a3d7413890a3c06c6837563100f6e71311916dbd24f1b26e"},
{file = "pylance-0.5.9-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:293520fada417e653085118d296ba011024ad0cfbbb1e60ee025b14aae2c0178"},
{file = "pylance-0.5.9-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22bbb04024302996268bef98e190d62960f62293e2b5606be276d801cdfb13f3"},
{file = "pylance-0.5.9-cp38-abi3-win_amd64.whl", hash = "sha256:810d4020a65b8d001352cc69c751602412f73c498b1ac0cdb408f00cb493a2b6"},
]
[package.dependencies]
numpy = ">=1.22"
pandas = ">=1.4"
pyarrow = ">=10"
[package.extras]
tests = ["duckdb", "ml_dtypes", "polars[pandas,pyarrow]", "pytest"]
[[package]]
name = "pyparsing"
version = "3.0.9"
@ -538,6 +745,41 @@ pluggy = ">=0.12,<2.0"
[package.extras]
testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
[[package]]
name = "pytest-cov"
version = "4.1.0"
description = "Pytest plugin for measuring coverage."
optional = false
python-versions = ">=3.7"
files = [
{file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"},
{file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"},
]
[package.dependencies]
coverage = {version = ">=5.2.1", extras = ["toml"]}
pytest = ">=4.6"
[package.extras]
testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"]
[[package]]
name = "pytest-mock"
version = "3.11.1"
description = "Thin-wrapper around the mock package for easier use with pytest"
optional = false
python-versions = ">=3.7"
files = [
{file = "pytest-mock-3.11.1.tar.gz", hash = "sha256:7f6b125602ac6d743e523ae0bfa71e1a697a2f5534064528c6ff84c2f7c2fc7f"},
{file = "pytest_mock-3.11.1-py3-none-any.whl", hash = "sha256:21c279fff83d70763b05f8874cc9cfb3fcacd6d354247a976f9529d19f9acf39"},
]
[package.dependencies]
pytest = ">=5.0"
[package.extras]
dev = ["pre-commit", "pytest-asyncio", "tox"]
[[package]]
name = "python-dateutil"
version = "2.8.2"
@ -735,4 +977,4 @@ test = ["pytest", "pytest-cov"]
[metadata]
lock-version = "2.0"
python-versions = "^3.11"
content-hash = "834ffb619893a1fb006e1b5a3213cc772117c9000e719b95a4478f74fd5d0066"
content-hash = "72e3afd9a24b88fc8a8f5f55e1c408f65090fce9015a442f6f41638191276b6f"

View File

@ -9,13 +9,21 @@ readme = "README.md"
python = "^3.11"
quapy = "^0.1.7"
pandas = "^2.0.3"
jinja2 = "^3.1.2"
[tool.poetry.scripts]
main = "quacc.main:main"
multi = "quacc.main:estimate_multiclass"
bin = "quacc.main:estimate_binary"
[tool.poetry.group.dev.dependencies]
pytest = "^7.4.0"
pylance = "^0.5.9"
pytest-mock = "^3.11.1"
pytest-cov = "^4.1.0"
[tool.pytest.ini_options]
addopts = "--cov=quacc"
[build-system]
requires = ["poetry-core"]

View File

@ -46,36 +46,77 @@ class ExtendedCollection(LabelledCollection):
def split_by_pred(self):
_ncl = int(math.sqrt(self.n_classes))
_indexes = ExtendedCollection.split_index_by_pred(_ncl, self.instances)
return [
ExtendedCollection(
self.instances[ind] if len(ind) > 0 else np.asarray([], dtype=int),
np.asarray(
[
ExClassManager.get_true(_ncl, lbl)
for lbl in (self.labels[ind] if len(ind) > 0 else [])
],
dtype=int,
),
classes=range(0, _ncl),
_indexes = ExtendedCollection._split_index_by_pred(_ncl, self.instances)
if isinstance(self.instances, np.ndarray):
_instances = [
self.instances[ind] if ind.shape[0] > 0 else np.asarray([], dtype=int)
for ind in _indexes
]
elif isinstance(self.instances, sp.csr_matrix):
_instances = [
self.instances[ind]
if ind.shape[0] > 0
else sp.csr_matrix(np.empty((0, 0), dtype=int))
for ind in _indexes
]
_labels = [
np.asarray(
[
ExClassManager.get_true(_ncl, lbl)
for lbl in (self.labels[ind] if len(ind) > 0 else [])
],
dtype=int,
)
for ind in _indexes
]
return [
ExtendedCollection(inst, lbl, classes=range(0, _ncl))
for (inst, lbl) in zip(_instances, _labels)
]
@classmethod
def split_index_by_pred(
cls, n_classes: int, instances: np.ndarray
def split_inst_by_pred(
cls, n_classes: int, instances: np.ndarray | sp.csr_matrix
) -> (List[np.ndarray | sp.csr_matrix], List[float]):
_indexes = cls._split_index_by_pred(n_classes, instances)
if isinstance(instances, np.ndarray):
_instances = [
instances[ind] if ind.shape[0] > 0 else np.asarray([], dtype=int)
for ind in _indexes
]
elif isinstance(instances, sp.csr_matrix):
_instances = [
instances[ind]
if ind.shape[0] > 0
else sp.csr_matrix(np.empty((0, 0), dtype=int))
for ind in _indexes
]
norms = [inst.shape[0] / instances.shape[0] for inst in _instances]
return _instances, norms
@classmethod
def _split_index_by_pred(
cls, n_classes: int, instances: np.ndarray | sp.csr_matrix
) -> List[np.ndarray]:
_pred_label = [np.argmax(inst[-n_classes:], axis=0) for inst in instances]
if isinstance(instances, np.ndarray):
_pred_label = [np.argmax(inst[-n_classes:], axis=0) for inst in instances]
elif isinstance(instances, sp.csr_matrix):
_pred_label = [
np.argmax(inst[:, -n_classes:].toarray().flatten(), axis=0)
for inst in instances
]
else:
raise ValueError("Unsupported matrix format")
return [
np.asarray([j for (j, x) in enumerate(_pred_label) if x == i])
np.asarray([j for (j, x) in enumerate(_pred_label) if x == i], dtype=int)
for i in range(0, n_classes)
]
@classmethod
def extend_instances(
cls, instances: np.ndarray, pred_proba: np.ndarray
) -> np.ndarray:
cls, instances: np.ndarray | sp.csr_matrix, pred_proba: np.ndarray
) -> np.ndarray | sp.csr_matrix:
if isinstance(instances, sp.csr_matrix):
_pred_proba = sp.csr_matrix(pred_proba)
n_x = sp.hstack([instances, _pred_proba])

View File

@ -3,13 +3,12 @@ import quapy as qp
def from_name(err_name):
if err_name == 'f1e':
return f1e
elif err_name == 'f1':
return f1
else:
return qp.error.from_name(err_name)
def f1e(prev):
return 1 - f1_score(prev)
def f1_score(prev):
def f1(prev):
# https://github.com/dice-group/gerbil/wiki/Precision,-Recall-and-F1-measure
if prev[0] == 0 and prev[1] == 0 and prev[2] == 0:
return 1.0
@ -21,3 +20,6 @@ def f1_score(prev):
recall = prev[0] / (prev[0] + prev[1])
precision = prev[0] / (prev[0] + prev[2])
return 2 * (precision * recall) / (precision + recall)
def f1e(prev):
return 1 - f1(prev)

View File

@ -11,17 +11,10 @@ from sklearn.model_selection import cross_val_predict
from quacc.data import ExtendedCollection as EC
def _check_prevalence_classes(true_classes, estim_classes, estim_prev):
for _cls in true_classes:
if _cls not in estim_classes:
estim_prev = np.insert(estim_prev, _cls, [0.0], axis=0)
return estim_prev
class AccuracyEstimator:
def extend(self, base: LabelledCollection, pred_proba=None) -> EC:
if not pred_proba:
pred_proba = self.model.predict_proba(base.X)
pred_proba = self.c_model.predict_proba(base.X)
return EC.extend_collection(base, pred_proba)
@abstractmethod
@ -62,10 +55,16 @@ class MulticlassAccuracyEstimator(AccuracyEstimator):
estim_prev = self.q_model.quantify(e_inst)
return _check_prevalence_classes(
return self._check_prevalence_classes(
self.e_train.classes_, self.q_model.classes_, estim_prev
)
def _check_prevalence_classes(self, true_classes, estim_classes, estim_prev):
for _cls in true_classes:
if _cls not in estim_classes:
estim_prev = np.insert(estim_prev, _cls, [0.0], axis=0)
return estim_prev
class BinaryQuantifierAccuracyEstimator(AccuracyEstimator):
def __init__(self, c_model: BaseEstimator):
@ -86,10 +85,11 @@ class BinaryQuantifierAccuracyEstimator(AccuracyEstimator):
else:
self.e_train = train
self.n_classes = self.e_train.n_classes
[e_train_0, e_train_1] = self.e_train.split_by_pred()
self.q_model_0.fit(self.e_train_0)
self.q_model_1.fit(self.e_train_1)
self.q_model_0.fit(e_train_0)
self.q_model_1.fit(e_train_1)
def estimate(self, instances, ext=False):
# TODO: test
@ -99,17 +99,24 @@ class BinaryQuantifierAccuracyEstimator(AccuracyEstimator):
else:
e_inst = instances
_ncl = int(math.sqrt(self.e_train.n_classes))
[e_inst_0, e_inst_1] = [
e_inst[ind] for ind in EC.split_index_by_pred(_ncl, e_inst)
_ncl = int(math.sqrt(self.n_classes))
s_inst, norms = EC.split_inst_by_pred(_ncl, e_inst)
[estim_prev_0, estim_prev_1] = [
self._quantify_helper(inst, norm, q_model)
for (inst, norm, q_model) in zip(
s_inst, norms, [self.q_model_0, self.q_model_1]
)
]
estim_prev_0 = self.q_model_0.quantify(e_inst_0)
estim_prev_1 = self.q_model_1.quantify(e_inst_1)
estim_prev = []
for prev_row in zip(estim_prev_0, estim_prev_1):
for prev in prev_row:
estim_prev.append(prev)
return estim_prev
return np.asarray(estim_prev)
def _quantify_helper(self, inst, norm, q_model):
if inst.shape[0] > 0:
return np.asarray(list(map(lambda p: p * norm, q_model.quantify(inst))))
else:
return np.asarray([0.0, 0.0])

View File

@ -104,7 +104,7 @@ def evaluation_report(
base_prevs, true_prevs, estim_prevs = estimate(estimator, protocol)
if error_metrics == "all":
error_metrics = ["mae", "rae", "mrae", "kld", "nkld", "f1e"]
error_metrics = ["ae", "f1"]
error_funcs = [
error.from_name(e) if isinstance(e, str) else e for e in error_metrics
@ -112,6 +112,9 @@ def evaluation_report(
assert all(hasattr(e, "__call__") for e in error_funcs), "invalid error function"
error_names = [e.__name__ for e in error_funcs]
error_cols = error_names.copy()
if "f1" in error_cols:
error_cols.remove("f1")
error_cols.extend(["f1_true", "f1_estim", "f1_dist"])
if "f1e" in error_cols:
error_cols.remove("f1e")
error_cols.extend(["f1e_true", "f1e_estim"])
@ -136,6 +139,12 @@ def evaluation_report(
series[("errors", "f1e_true")] = error_metric(true_prev)
series[("errors", "f1e_estim")] = error_metric(estim_prev)
continue
if error_name == "f1":
f1_true, f1_estim = error_metric(true_prev), error_metric(estim_prev)
series[("errors", "f1_true")] = f1_true
series[("errors", "f1_estim")] = f1_estim
series[("errors", "f1_dist")] = abs(f1_estim - f1_true)
continue
score = error_metric(true_prev, estim_prev)
series[("errors", error_name)] = score

View File

@ -4,7 +4,10 @@ from quapy.protocol import APP
from sklearn.linear_model import LogisticRegression
import quacc.evaluation as eval
from quacc.estimator import MulticlassAccuracyEstimator
from quacc.estimator import (
BinaryQuantifierAccuracyEstimator,
MulticlassAccuracyEstimator,
)
from quacc.data import get_dataset
@ -12,8 +15,11 @@ qp.environ["SAMPLE_SIZE"] = 100
pd.set_option("display.float_format", "{:.4f}".format)
dataset_name = "imdb"
def test_2(dataset_name):
def estimate_multiclass():
print(dataset_name)
train, test = get_dataset(dataset_name)
model = LogisticRegression()
@ -45,19 +51,52 @@ def test_2(dataset_name):
protocol,
aggregate=True,
)
# print(df.to_latex())
print(df.to_string())
# print(df.to_html())
print()
def main():
for dataset_name in [
"imdb",
# "hp",
# "spambase",
]:
print(dataset_name)
test_2(dataset_name)
print("*" * 50)
def estimate_binary():
print(dataset_name)
train, test = get_dataset(dataset_name)
model = LogisticRegression()
print(f"fitting model {model.__class__.__name__}...", end=" ", flush=True)
model.fit(*train.Xy)
print("fit")
estimator = BinaryQuantifierAccuracyEstimator(model)
print(
f"fitting qmodel {estimator.q_model_0.__class__.__name__}...",
end=" ",
flush=True,
)
estimator.fit(train)
print("fit")
n_prevalences = 21
repreats = 1000
protocol = APP(test, n_prevalences=n_prevalences, repeats=repreats)
print(
f"Tests:\n\
protocol={protocol.__class__.__name__}\n\
n_prevalences={n_prevalences}\n\
repreats={repreats}\n\
executing...\n"
)
df = eval.evaluation_report(
estimator,
protocol,
aggregate=True,
)
# print(df.to_latex(float_format="{:.4f}".format))
print(df.to_string())
# print(df.to_html())
print()
if __name__ == "__main__":
main()
estimate_multiclass()

View File

@ -1,6 +1,7 @@
import pytest
from quacc.data import ExClassManager as ECM, ExtendedCollection
import numpy as np
import scipy.sparse as sp
class TestExClassManager:
@ -45,50 +46,180 @@ class TestExClassManager:
class TestExtendedCollection:
@pytest.mark.parametrize(
"instances,result",
[
(
np.asarray(
[[0, 0.3, 0.7], [1, 0.54, 0.46], [2, 0.28, 0.72], [3, 0.6, 0.4]]
),
[np.asarray([1, 3]), np.asarray([0, 2])],
),
(
sp.csr_matrix(
[[0, 0.3, 0.7], [1, 0.54, 0.46], [2, 0.28, 0.72], [3, 0.6, 0.4]]
),
[np.asarray([1, 3]), np.asarray([0, 2])],
),
(
np.asarray([[0, 0.3, 0.7], [2, 0.28, 0.72]]),
[np.asarray([], dtype=int), np.asarray([0, 1])],
),
(
sp.csr_matrix([[0, 0.3, 0.7], [2, 0.28, 0.72]]),
[np.asarray([], dtype=int), np.asarray([0, 1])],
),
(
np.asarray([[1, 0.54, 0.46], [3, 0.6, 0.4]]),
[np.asarray([0, 1]), np.asarray([], dtype=int)],
),
(
sp.csr_matrix([[1, 0.54, 0.46], [3, 0.6, 0.4]]),
[np.asarray([0, 1]), np.asarray([], dtype=int)],
),
],
)
def test__split_index_by_pred(self, instances, result):
ncl = 2
assert all(
np.array_equal(a, b)
for (a, b) in zip(
ExtendedCollection._split_index_by_pred(ncl, instances),
result,
)
)
@pytest.mark.parametrize(
"instances,s_inst,norms",
[
(
np.asarray(
[[0, 0.3, 0.7], [1, 0.54, 0.46], [2, 0.28, 0.72], [3, 0.6, 0.4]]
),
[
np.asarray([[1, 0.54, 0.46], [3, 0.6, 0.4]]),
np.asarray([[0, 0.3, 0.7], [2, 0.28, 0.72]]),
],
[0.5, 0.5],
),
(
sp.csr_matrix(
[[0, 0.3, 0.7], [1, 0.54, 0.46], [2, 0.28, 0.72], [3, 0.6, 0.4]]
),
[
sp.csr_matrix([[1, 0.54, 0.46], [3, 0.6, 0.4]]),
sp.csr_matrix([[0, 0.3, 0.7], [2, 0.28, 0.72]]),
],
[0.5, 0.5],
),
(
np.asarray([[1, 0.54, 0.46], [3, 0.6, 0.4]]),
[
np.asarray([[1, 0.54, 0.46], [3, 0.6, 0.4]]),
np.asarray([], dtype=int),
],
[1.0, 0.0],
),
(
sp.csr_matrix([[1, 0.54, 0.46], [3, 0.6, 0.4]]),
[
sp.csr_matrix([[1, 0.54, 0.46], [3, 0.6, 0.4]]),
sp.csr_matrix([], dtype=int),
],
[1.0, 0.0],
),
(
np.asarray([[0, 0.3, 0.7], [2, 0.28, 0.72]]),
[
np.asarray([], dtype=int),
np.asarray([[0, 0.3, 0.7], [2, 0.28, 0.72]]),
],
[0.0, 1.0],
),
(
sp.csr_matrix([[0, 0.3, 0.7], [2, 0.28, 0.72]]),
[
sp.csr_matrix([], dtype=int),
sp.csr_matrix([[0, 0.3, 0.7], [2, 0.28, 0.72]]),
],
[0.0, 1.0],
),
],
)
def test_split_inst_by_pred(self, instances, s_inst, norms):
ncl = 2
_s_inst, _norms = ExtendedCollection.split_inst_by_pred(ncl, instances)
if isinstance(s_inst, np.ndarray):
assert all(np.array_equal(a, b) for (a, b) in zip(_s_inst, s_inst))
if isinstance(s_inst, sp.csr_matrix):
assert all((a != b).nnz == 0 for (a, b) in zip(_s_inst, s_inst))
assert all(a == b for (a, b) in zip(_norms, norms))
@pytest.mark.parametrize(
"instances,labels,inst0,lbl0,inst1,lbl1",
[
(
[[0, 0.3, 0.7], [1, 0.54, 0.46], [2, 0.28, 0.72], [3, 0.6, 0.4]],
[3, 0, 1, 2],
[[1, 0.54, 0.46], [3, 0.6, 0.4]],
[0, 1],
[[0, 0.3, 0.7], [2, 0.28, 0.72]],
[1, 0],
np.asarray(
[[0, 0.3, 0.7], [1, 0.54, 0.46], [2, 0.28, 0.72], [3, 0.6, 0.4]]
),
np.asarray([3, 0, 1, 2]),
np.asarray([[1, 0.54, 0.46], [3, 0.6, 0.4]]),
np.asarray([0, 1]),
np.asarray([[0, 0.3, 0.7], [2, 0.28, 0.72]]),
np.asarray([1, 0]),
),
(
[[0, 0.3, 0.7], [2, 0.28, 0.72]],
[3, 1],
[],
[],
[[0, 0.3, 0.7], [2, 0.28, 0.72]],
[1, 0],
sp.csr_matrix(
[[0, 0.3, 0.7], [1, 0.54, 0.46], [2, 0.28, 0.72], [3, 0.6, 0.4]]
),
np.asarray([3, 0, 1, 2]),
sp.csr_matrix([[1, 0.54, 0.46], [3, 0.6, 0.4]]),
np.asarray([0, 1]),
sp.csr_matrix([[0, 0.3, 0.7], [2, 0.28, 0.72]]),
np.asarray([1, 0]),
),
(
[[1, 0.54, 0.46], [3, 0.6, 0.4]],
[0, 2],
[[1, 0.54, 0.46], [3, 0.6, 0.4]],
[0, 1],
[],
[],
np.asarray([[0, 0.3, 0.7], [2, 0.28, 0.72]]),
np.asarray([3, 1]),
np.asarray([], dtype=int),
np.asarray([], dtype=int),
np.asarray([[0, 0.3, 0.7], [2, 0.28, 0.72]]),
np.asarray([1, 0]),
),
(
sp.csr_matrix([[0, 0.3, 0.7], [2, 0.28, 0.72]]),
np.asarray([3, 1]),
sp.csr_matrix(np.empty((0, 0), dtype=int)),
np.asarray([], dtype=int),
sp.csr_matrix([[0, 0.3, 0.7], [2, 0.28, 0.72]]),
np.asarray([1, 0]),
),
(
np.asarray([[1, 0.54, 0.46], [3, 0.6, 0.4]]),
np.asarray([0, 2]),
np.asarray([[1, 0.54, 0.46], [3, 0.6, 0.4]]),
np.asarray([0, 1]),
np.asarray([], dtype=int),
np.asarray([], dtype=int),
),
(
sp.csr_matrix([[1, 0.54, 0.46], [3, 0.6, 0.4]]),
np.asarray([0, 2]),
sp.csr_matrix([[1, 0.54, 0.46], [3, 0.6, 0.4]]),
np.asarray([0, 1]),
sp.csr_matrix(np.empty((0, 0), dtype=int)),
np.asarray([], dtype=int),
),
],
)
def test_split_by_pred(self, instances, labels, inst0, lbl0, inst1, lbl1):
ec = ExtendedCollection(
np.asarray(instances), np.asarray(labels), classes=range(0, 4)
)
ec = ExtendedCollection(instances, labels, classes=range(0, 4))
[ec0, ec1] = ec.split_by_pred()
print(ec0.X, np.asarray(inst0))
assert( np.array_equal(ec0.X, np.asarray(inst0)) )
print(ec0.y, np.asarray(lbl0))
assert( np.array_equal(ec0.y, np.asarray(lbl0)) )
print(ec1.X, np.asarray(inst1))
assert( np.array_equal(ec1.X, np.asarray(inst1)) )
print(ec1.y, np.asarray(lbl1))
assert( np.array_equal(ec1.y, np.asarray(lbl1)) )
if isinstance(instances, np.ndarray):
assert np.array_equal(ec0.X, inst0)
assert np.array_equal(ec1.X, inst1)
if isinstance(instances, sp.csr_matrix):
assert (ec0.X != inst0).nnz == 0
assert (ec1.X != inst1).nnz == 0
assert np.array_equal(ec0.y, lbl0)
assert np.array_equal(ec1.y, lbl1)

View File

@ -1,4 +1,66 @@
class TestBinaryQuantifierAccuracyEstimator:
import pytest
import numpy as np
import scipy.sparse as sp
from sklearn.linear_model import LogisticRegression
def test_estimate(self):
pass
from quacc.estimator import BinaryQuantifierAccuracyEstimator
class TestBinaryQuantifierAccuracyEstimator:
@pytest.mark.parametrize(
"instances,preds0,preds1,result",
[
(
np.asarray(
[[0, 0.3, 0.7], [1, 0.54, 0.46], [2, 0.28, 0.72], [3, 0.6, 0.4]]
),
np.asarray([0.3, 0.7]),
np.asarray([0.4, 0.6]),
np.asarray([0.15, 0.2, 0.35, 0.3]),
),
(
sp.csr_matrix(
[[0, 0.3, 0.7], [1, 0.54, 0.46], [2, 0.28, 0.72], [3, 0.6, 0.4]]
),
np.asarray([0.3, 0.7]),
np.asarray([0.4, 0.6]),
np.asarray([0.15, 0.2, 0.35, 0.3]),
),
(
np.asarray([[0, 0.3, 0.7], [2, 0.28, 0.72]]),
np.asarray([0.3, 0.7]),
np.asarray([0.4, 0.6]),
np.asarray([0.0, 0.4, 0.0, 0.6]),
),
(
sp.csr_matrix([[0, 0.3, 0.7], [2, 0.28, 0.72]]),
np.asarray([0.3, 0.7]),
np.asarray([0.4, 0.6]),
np.asarray([0.0, 0.4, 0.0, 0.6]),
),
(
np.asarray([[1, 0.54, 0.46], [3, 0.6, 0.4]]),
np.asarray([0.3, 0.7]),
np.asarray([0.4, 0.6]),
np.asarray([0.3, 0.0, 0.7, 0.0]),
),
(
sp.csr_matrix([[1, 0.54, 0.46], [3, 0.6, 0.4]]),
np.asarray([0.3, 0.7]),
np.asarray([0.4, 0.6]),
np.asarray([0.3, 0.0, 0.7, 0.0]),
),
],
)
def test_estimate_ndarray(self, mocker, instances, preds0, preds1, result):
estimator = BinaryQuantifierAccuracyEstimator(LogisticRegression())
estimator.n_classes = 4
with mocker.patch.object(estimator.q_model_0, "quantify"), mocker.patch.object(
estimator.q_model_1, "quantify"
):
estimator.q_model_0.quantify.return_value = preds0
estimator.q_model_1.quantify.return_value = preds1
assert np.array_equal(
estimator.estimate(instances, ext=True),
result,
)