psyke 0.10.1.dev3__tar.gz → 0.10.1.dev6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of psyke might be problematic. Click here for more details.

Files changed (82) hide show
  1. {psyke-0.10.1.dev3/psyke.egg-info → psyke-0.10.1.dev6}/PKG-INFO +1 -1
  2. psyke-0.10.1.dev6/VERSION +1 -0
  3. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/__init__.py +3 -3
  4. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/extraction/hypercubic/__init__.py +4 -4
  5. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/extraction/hypercubic/ginger/__init__.py +10 -8
  6. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/genetic/gin/__init__.py +36 -7
  7. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6/psyke.egg-info}/PKG-INFO +1 -1
  8. psyke-0.10.1.dev3/VERSION +0 -1
  9. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/LICENSE +0 -0
  10. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/MANIFEST.in +0 -0
  11. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/README.md +0 -0
  12. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/clustering/__init__.py +0 -0
  13. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/clustering/cream/__init__.py +0 -0
  14. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/clustering/exact/__init__.py +0 -0
  15. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/clustering/utils.py +0 -0
  16. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/extraction/__init__.py +0 -0
  17. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/extraction/cart/CartPredictor.py +0 -0
  18. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/extraction/cart/FairTree.py +0 -0
  19. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/extraction/cart/FairTreePredictor.py +0 -0
  20. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/extraction/cart/__init__.py +0 -0
  21. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/extraction/hypercubic/cosmik/__init__.py +0 -0
  22. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/extraction/hypercubic/creepy/__init__.py +0 -0
  23. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/extraction/hypercubic/divine/__init__.py +0 -0
  24. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/extraction/hypercubic/gridex/__init__.py +0 -0
  25. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/extraction/hypercubic/gridrex/__init__.py +0 -0
  26. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/extraction/hypercubic/hex/__init__.py +0 -0
  27. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/extraction/hypercubic/hypercube.py +0 -0
  28. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/extraction/hypercubic/iter/__init__.py +0 -0
  29. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/extraction/hypercubic/strategy.py +0 -0
  30. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/extraction/hypercubic/utils.py +0 -0
  31. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/extraction/real/__init__.py +0 -0
  32. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/extraction/real/utils.py +0 -0
  33. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/extraction/trepan/__init__.py +0 -0
  34. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/extraction/trepan/utils.py +0 -0
  35. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/genetic/__init__.py +0 -0
  36. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/hypercubepredictor.py +0 -0
  37. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/schema/__init__.py +0 -0
  38. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/tuning/__init__.py +0 -0
  39. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/tuning/crash/__init__.py +0 -0
  40. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/tuning/orchid/__init__.py +0 -0
  41. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/tuning/pedro/__init__.py +0 -0
  42. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/utils/__init__.py +0 -0
  43. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/utils/dataframe.py +0 -0
  44. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/utils/logic.py +0 -0
  45. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/utils/metrics.py +0 -0
  46. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/utils/plot.py +0 -0
  47. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke/utils/sorted.py +0 -0
  48. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke.egg-info/SOURCES.txt +0 -0
  49. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke.egg-info/dependency_links.txt +0 -0
  50. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke.egg-info/not-zip-safe +0 -0
  51. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke.egg-info/requires.txt +0 -0
  52. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/psyke.egg-info/top_level.txt +0 -0
  53. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/pyproject.toml +0 -0
  54. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/setup.cfg +0 -0
  55. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/setup.py +0 -0
  56. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/test/psyke/__init__.py +0 -0
  57. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/test/psyke/clustering/__init__.py +0 -0
  58. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/test/psyke/extraction/__init__.py +0 -0
  59. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/test/psyke/extraction/cart/__init__.py +0 -0
  60. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/test/psyke/extraction/cart/test_cart.py +0 -0
  61. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/test/psyke/extraction/cart/test_simplified_cart.py +0 -0
  62. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/test/psyke/extraction/hypercubic/__init__.py +0 -0
  63. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/test/psyke/extraction/hypercubic/gridex/__init__.py +0 -0
  64. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/test/psyke/extraction/hypercubic/gridex/test_gridex.py +0 -0
  65. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/test/psyke/extraction/hypercubic/iter/__init__.py +0 -0
  66. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/test/psyke/extraction/hypercubic/iter/test_iter.py +0 -0
  67. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/test/psyke/extraction/hypercubic/test_hypercube.py +0 -0
  68. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/test/psyke/extraction/real/__init__.py +0 -0
  69. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/test/psyke/extraction/real/test_real.py +0 -0
  70. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/test/psyke/extraction/real/test_rule.py +0 -0
  71. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/test/psyke/extraction/trepan/__init__.py +0 -0
  72. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/test/psyke/extraction/trepan/test_node.py +0 -0
  73. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/test/psyke/extraction/trepan/test_split.py +0 -0
  74. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/test/psyke/extraction/trepan/test_trepan.py +0 -0
  75. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/test/psyke/utils/__init__.py +0 -0
  76. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/test/psyke/utils/test_prune.py +0 -0
  77. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/test/psyke/utils/test_simplify.py +0 -0
  78. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/test/psyke/utils/test_simplify_formatter.py +0 -0
  79. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/test/resources/__init__.py +0 -0
  80. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/test/resources/datasets/__init__.py +0 -0
  81. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/test/resources/predictors/__init__.py +0 -0
  82. {psyke-0.10.1.dev3 → psyke-0.10.1.dev6}/test/resources/tests/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: psyke
3
- Version: 0.10.1.dev3
3
+ Version: 0.10.1.dev6
4
4
  Summary: Python-based implementation of PSyKE, i.e. a Platform for Symbolic Knowledge Extraction
5
5
  Home-page: https://github.com/psykei/psyke-python
6
6
  Author: Matteo Magnini
@@ -0,0 +1 @@
1
+ 0.10.1.dev6
@@ -396,8 +396,8 @@ class Extractor(EvaluableModel, ABC):
396
396
 
397
397
  @staticmethod
398
398
  def ginger(predictor, features: Iterable[str], sigmas: Iterable[float], max_slices: int, min_rules: int = 1,
399
- max_poly: int = 1, alpha: float = 0.5, indpb: float = 0.5, tournsize: int = 3, metric:str = 'R2',
400
- n_gen: int = 50, n_pop: int = 50, threshold=None, valid=None,
399
+ max_poly: int = 1, alpha: float = 0.5, indpb: float = 0.5, tournsize: int = 3, metric: str = 'R2',
400
+ n_gen: int = 50, n_pop: int = 50, threshold=None, valid=None, output=Target.REGRESSION,
401
401
  normalization: dict[str, tuple[float, float]] = None,
402
402
  seed: int = get_default_random_seed()) -> Extractor:
403
403
  """
@@ -405,7 +405,7 @@ class Extractor(EvaluableModel, ABC):
405
405
  """
406
406
  from psyke.extraction.hypercubic.ginger import GInGER
407
407
  return GInGER(predictor, features, sigmas, max_slices, min_rules, max_poly, alpha, indpb, tournsize, metric,
408
- n_gen, n_pop, threshold, valid, normalization, seed)
408
+ n_gen, n_pop, threshold, valid, output, normalization, seed)
409
409
 
410
410
  @staticmethod
411
411
  def gridrex(predictor, grid, min_examples: int = 250, threshold: float = 0.1,
@@ -28,12 +28,12 @@ class HyperCubeExtractor(HyperCubePredictor, PedagogicalExtractor, ABC):
28
28
  self._default_surrounding_cube = False
29
29
  self.threshold = None
30
30
 
31
- def _default_cube(self) -> HyperCube | RegressionCube | ClassificationCube:
31
+ def _default_cube(self, dimensions=None) -> HyperCube | RegressionCube | ClassificationCube:
32
32
  if self._output == Target.CONSTANT:
33
- return HyperCube()
33
+ return HyperCube(dimensions)
34
34
  if self._output == Target.REGRESSION:
35
- return RegressionCube()
36
- return ClassificationCube()
35
+ return RegressionCube(dimensions)
36
+ return ClassificationCube(dimensions)
37
37
 
38
38
  @staticmethod
39
39
  def _find_couples(to_split: Iterable[HyperCube], not_in_cache: set[HyperCube],
@@ -3,10 +3,11 @@ from typing import Iterable
3
3
 
4
4
  import numpy as np
5
5
  import pandas as pd
6
+ from sklearn.base import ClassifierMixin
6
7
  from sklearn.preprocessing import PolynomialFeatures
7
8
  from tuprolog.theory import Theory
8
9
 
9
- from psyke import get_default_random_seed
10
+ from psyke import get_default_random_seed, Target
10
11
  from psyke.extraction.hypercubic import HyperCubeExtractor, HyperCube, RegressionCube
11
12
 
12
13
  from deap import base, creator
@@ -20,9 +21,10 @@ class GInGER(HyperCubeExtractor):
20
21
  """
21
22
 
22
23
  def __init__(self, predictor, features, sigmas, max_slices, min_rules=1, max_poly=1, alpha=0.5, indpb=0.5,
23
- tournsize=3, metric='R2', n_gen=50, n_pop=50, threshold=None, valid=None, normalization=None,
24
- seed: int = get_default_random_seed()):
25
- super().__init__(predictor, normalization)
24
+ tournsize=3, metric='R2', n_gen=50, n_pop=50, threshold=None, valid=None,
25
+ output: Target = Target.REGRESSION, normalization=None, seed: int = get_default_random_seed()):
26
+ super().__init__(predictor, output=Target.CLASSIFICATION if isinstance(predictor, ClassifierMixin) else output,
27
+ normalization=normalization)
26
28
  self.threshold = threshold
27
29
  np.random.seed(seed)
28
30
 
@@ -60,8 +62,8 @@ class GInGER(HyperCubeExtractor):
60
62
  for poly in range(self.poly):
61
63
  for slices in list(itertools.product(range(1, self.max_slices + 1), repeat=self.max_features)):
62
64
  gr = GIn((dataframe.iloc[:, :-1], dataframe.iloc[:, -1]), self.valid, self.features, self.sigmas,
63
- slices, min_rules=self.min_rules, poly=poly + 1, alpha=self.alpha,
64
- indpb=self.indpb, tournsize=self.tournsize, metric=self.metric, warm=True)
65
+ slices, min_rules=self.min_rules, poly=poly + 1, alpha=self.alpha, indpb=self.indpb,
66
+ tournsize=self.tournsize, metric=self.metric, output=self._output, warm=True)
65
67
 
66
68
  b, score, _, _ = gr.run(n_gen=self.n_gen, n_pop=self.n_pop)
67
69
  best[(score, poly + 1, slices)] = b
@@ -81,8 +83,8 @@ class GInGER(HyperCubeExtractor):
81
83
 
82
84
  hypercubes = [{f: iv for f, iv in zip(self.features, combo)} for combo in itertools.product(*intervals)]
83
85
  mi_ma = {f: (transformed[f].min(), transformed[f].max()) for f in transformed.columns if f not in self.features}
84
- self._hypercubes = [RegressionCube({feat: h[feat] if feat in self.features else mi_ma[feat]
85
- for feat in transformed.columns[:-1]}) for h in hypercubes]
86
+ self._hypercubes = [self._default_cube({feat: h[feat] if feat in self.features else mi_ma[feat]
87
+ for feat in transformed.columns[:-1]}) for h in hypercubes]
86
88
  self._hypercubes = [c for c in self._hypercubes if c.count(transformed) >= 2]
87
89
  for c in self._hypercubes:
88
90
  for feature in transformed.columns:
@@ -1,17 +1,22 @@
1
+ from statistics import mode
2
+
1
3
  import numpy as np
2
4
  from deap import base, creator, tools, algorithms
3
5
  import random
4
6
  from sklearn.linear_model import LinearRegression
5
- from sklearn.metrics import mean_absolute_error, r2_score
7
+ from sklearn.metrics import mean_absolute_error, r2_score, mean_squared_error, f1_score, accuracy_score
6
8
  from sklearn.preprocessing import PolynomialFeatures
7
9
 
10
+ from psyke import Target
11
+
8
12
 
9
13
  class GIn:
10
14
 
11
15
  def __init__(self, train, valid, features, sigmas, slices, min_rules=1, poly=1, alpha=0.5, indpb=0.5, tournsize=3,
12
- metric='R2', warm=False):
16
+ metric='R2', output=Target.REGRESSION, warm=False):
13
17
  self.X, self.y = train
14
18
  self.valid = valid
19
+ self.output = output
15
20
 
16
21
  self.features = features
17
22
  self.sigmas = sigmas
@@ -42,6 +47,29 @@ class GIn:
42
47
 
43
48
  return regions
44
49
 
50
+ def __output_estimation(self, mask, to_pred):
51
+ if self.output == Target.REGRESSION:
52
+ return LinearRegression().fit(self.poly.fit_transform(self.X)[mask], self.y[mask]).predict(
53
+ self.poly.fit_transform(to_pred))
54
+ if self.output == Target.CONSTANT:
55
+ return np.mean(self.y[mask])
56
+ if self.output == Target.CLASSIFICATION:
57
+ return mode(self.y[mask])
58
+ raise TypeError('Supported outputs are Target.{REGRESSION, CONSTANT, CLASSIFICATION}')
59
+
60
+ def __score(self, true, pred):
61
+ if self.metric == 'R2':
62
+ return r2_score(true, pred)
63
+ if self.metric == 'MAE':
64
+ return -mean_absolute_error(true, pred)
65
+ if self.metric == 'MSE':
66
+ return -mean_squared_error(true, pred)
67
+ if self.metric == 'F1':
68
+ return f1_score(true, pred, average='weighted')
69
+ if self.metric == 'ACC':
70
+ return accuracy_score(true, pred)
71
+ raise NameError('Supported metrics are R2, MAE, MSE, F1, ACC')
72
+
45
73
  def evaluate(self, individual):
46
74
  to_pred, true = self.valid or (self.X, self.y)
47
75
  boundaries = np.cumsum([0] + list(self.slices))
@@ -50,23 +78,24 @@ class GIn:
50
78
  regions = self.region(to_pred, cuts)
51
79
  regionsT = self.region(self.X, cuts)
52
80
 
53
- y_pred = np.zeros(len(to_pred))
81
+ y_pred = np.empty(len(to_pred), dtype=f'U{self.y.str.len().max()}') if self.output == Target.CLASSIFICATION \
82
+ else np.zeros_like(self.y)
54
83
  valid_regions = 0
55
84
 
56
85
  for r in range(np.prod([s + 1 for s in self.slices])):
57
86
  mask = regions == r
58
87
  maskT = regionsT == r
59
88
  if min(mask.sum(), maskT.sum()) < 3:
60
- y_pred[mask] = np.mean(self.y)
89
+ if self.output != Target.CLASSIFICATION:
90
+ y_pred[mask] = np.mean(self.y)
61
91
  continue
62
- y_pred[mask] = LinearRegression().fit(self.poly.fit_transform(self.X)[maskT], self.y[maskT]).predict(
63
- self.poly.fit_transform(to_pred)[mask])
92
+ y_pred[mask] = self.__output_estimation(maskT, to_pred[mask])
64
93
  valid_regions += 1
65
94
 
66
95
  if valid_regions < self.min_rules:
67
96
  return -9999,
68
97
 
69
- return (r2_score if self.metric == 'R2' else -mean_absolute_error)(true, y_pred),
98
+ return self.__score(true, y_pred),
70
99
 
71
100
  def setup(self, warm=False):
72
101
  if not warm:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: psyke
3
- Version: 0.10.1.dev3
3
+ Version: 0.10.1.dev6
4
4
  Summary: Python-based implementation of PSyKE, i.e. a Platform for Symbolic Knowledge Extraction
5
5
  Home-page: https://github.com/psykei/psyke-python
6
6
  Author: Matteo Magnini
psyke-0.10.1.dev3/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.10.1.dev3
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes