NMF Compatibility Fix
Problem
The NMFRiskDiscovery class initialization failed with:
TypeError: NMF.__init__() got an unexpected keyword argument 'alpha'
Root Cause
The scikit-learn NMF class has different parameter names across versions:
- scikit-learn < 0.19: No regularization parameters
- scikit-learn 0.19-0.24: Uses
alphaandl1_ratio - scikit-learn >= 1.0: Uses
alpha_W,alpha_H, andl1_ratio
The code was using the old alpha parameter which doesn't exist in newer versions.
Solution
Implemented version detection to use the correct parameters:
import sklearn
sklearn_version = tuple(map(int, sklearn.__version__.split('.')[:2]))
nmf_params = {
'n_components': n_components,
'random_state': random_state,
'init': 'nndsvda',
'max_iter': 500
}
# Add regularization params if supported
if sklearn_version >= (1, 0):
# scikit-learn >= 1.0
nmf_params['alpha_W'] = 0.1
nmf_params['alpha_H'] = 0.1
nmf_params['l1_ratio'] = 0.5
elif sklearn_version >= (0, 19):
# scikit-learn 0.19 to 0.24
nmf_params['alpha'] = 0.1
nmf_params['l1_ratio'] = 0.5
# else: very old version, use basic params only
self.nmf_model = NMF(**nmf_params)
Testing
Run the comparison script again:
python3 compare_risk_discovery.py --advanced
All 9 methods should now work correctly across different scikit-learn versions.
Files Modified
risk_discovery_alternatives.py: FixedNMFRiskDiscovery.__init__()method