Coverage for biobb_pytorch / test / unitests / test_mdae / test_sensitivity_analysis.py: 100%

39 statements  

« prev     ^ index     » next       coverage.py v7.13.2, created at 2026-02-02 16:33 +0000

1# type: ignore 

2import numpy as np 

3import pandas as pd 

4from biobb_pytorch.mdae.explainability.sensitivity_analysis import make_mi_scores 

5 

6 

7class TestSensitivityAnalysis: 

8 def test_make_mi_scores_basic(self): 

9 """Test make_mi_scores with basic data.""" 

10 # Create simple test data 

11 np.random.seed(42) 

12 n_samples = 100 

13 n_features = 5 

14 

15 # Create DataFrame with some correlation 

16 X_data = np.random.randn(n_samples, n_features) 

17 y = X_data[:, 0] * 2 + X_data[:, 1] + np.random.randn(n_samples) * 0.1 

18 

19 X = pd.DataFrame(X_data, columns=[f'feature_{i}' for i in range(n_features)]) 

20 

21 mi_scores = make_mi_scores(X, y, discrete_features=False) 

22 

23 # Check output type and shape 

24 assert isinstance(mi_scores, pd.Series) 

25 assert len(mi_scores) == n_features 

26 assert mi_scores.name == "MI Scores" 

27 

28 # Check that scores are sorted in descending order 

29 assert (mi_scores.values[:-1] >= mi_scores.values[1:]).all() 

30 

31 # Check that all scores are non-negative 

32 assert (mi_scores.values >= 0).all() 

33 

34 def test_make_mi_scores_discrete(self): 

35 """Test make_mi_scores with discrete features.""" 

36 np.random.seed(42) 

37 n_samples = 100 

38 n_features = 3 

39 

40 # Create DataFrame with discrete (categorical) and continuous features 

41 # For discrete features, we need actual discrete values 

42 X_data = np.random.randn(n_samples, n_features) 

43 # Make first feature discrete by converting to integers 

44 X_data[:, 0] = np.random.randint(0, 5, n_samples) 

45 y = X_data[:, 0] + np.random.randn(n_samples) * 0.1 

46 

47 X = pd.DataFrame(X_data, columns=[f'feature_{i}' for i in range(n_features)]) 

48 

49 # Mark first feature as discrete (it has integer categorical values) 

50 discrete_features = [True, False, False] 

51 

52 mi_scores = make_mi_scores(X, y, discrete_features=discrete_features) 

53 

54 # Check output 

55 assert isinstance(mi_scores, pd.Series) 

56 assert len(mi_scores) == n_features 

57 

58 def test_make_mi_scores_column_names(self): 

59 """Test that make_mi_scores preserves column names.""" 

60 np.random.seed(42) 

61 n_samples = 50 

62 

63 feature_names = ['temperature', 'pressure', 'volume'] 

64 X_data = np.random.randn(n_samples, len(feature_names)) 

65 y = X_data[:, 0] + np.random.randn(n_samples) * 0.1 

66 

67 X = pd.DataFrame(X_data, columns=feature_names) 

68 

69 mi_scores = make_mi_scores(X, y, discrete_features=False) 

70 

71 # Check that all feature names are in the index 

72 for name in feature_names: 

73 assert name in mi_scores.index