Ignore:
Location:
Orange
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • Orange/classification/logreg.py

    r10885 r11060  
    22from Orange.utils import deprecated_keywords, deprecated_members 
    33from Orange.data import preprocess 
     4import decimal 
    45import math 
    56 
     
    910from numpy.linalg import inv 
    1011from Orange.core import LogRegClassifier, LogRegFitter, LogRegFitter_Cholesky 
     12 
     13def format_decimal(x, prec=2): 
     14    """Allows arbitrary precision with scientific notation""" 
     15    tup = x.as_tuple() 
     16    digits = list(tup.digits[:prec + 1]) 
     17    sign = '-' if tup.sign else '' 
     18    dec = ''.join(str(i) for i in digits[1:]) 
     19    exp = x.adjusted() 
     20    return '{sign}{int}.{dec}e{exp}'.format(sign=sign, int=digits[0], dec=dec, exp=exp) 
    1121 
    1222def dump(classifier): 
     
    3444    formatstr = "%"+str(longest)+"s %10.2f %10.2f %10.2f %10.2f"     
    3545    out.append(formatstr % ("Intercept", classifier.beta[0], classifier.beta_se[0], classifier.wald_Z[0], classifier.P[0])) 
    36     formatstr = "%"+str(longest)+"s %10.2f %10.2f %10.2f %10.2f %10.2f"     
     46    formatstr = "%"+str(longest)+"s %10.2f %10.2f %10.2f %10.2f %s"     
    3747    for i in range(len(classifier.continuized_domain.features)): 
    38         out.append(formatstr % (classifier.continuized_domain.features[i].name, classifier.beta[i+1], classifier.beta_se[i+1], classifier.wald_Z[i+1], abs(classifier.P[i+1]), math.exp(classifier.beta[i+1]))) 
     48        exp = decimal.Decimal(math.e) ** decimal.Decimal(classifier.beta[i+1]) 
     49        out.append(formatstr % (classifier.continuized_domain.features[i].name, 
     50            classifier.beta[i+1], 
     51            classifier.beta_se[i+1], 
     52            classifier.wald_Z[i+1], 
     53            abs(classifier.P[i+1]), 
     54            format_decimal(exp))) 
    3955 
    4056    return '\n'.join(out) 
  • Orange/testing/unit/tests/test_logreg.py

    r10678 r11061  
    77from orngLR import LogRegLearner, Univariate_LogRegLearner, StepWiseFSS, StepWiseFSS_Filter 
    88 
    9 from Orange.classification.logreg import LibLinearLogRegLearner 
     9from Orange.classification.logreg import LibLinearLogRegLearner, dump 
     10import Orange 
     11 
    1012def datasets_iter(): 
    1113    for name, (data,) in testing.datasets_iter(testing.CLASSIFICATION_DATASETS): 
     
    2224        """ 
    2325        if len(dataset) < len(dataset.domain): 
    24             raise unittest.SkipTest("No enough examples") 
     26            raise unittest.SkipTest("Not enough examples") 
    2527        testing.LearnerTestCase.test_learner_on(self, dataset) 
    2628 
     
    4850        testing.LearnerTestCase.test_learner_on(self, dataset) 
    4951 
     52class TestUtils(unittest.TestCase): 
     53    def test_dump(self): 
     54        """Test for dump() failing (OverflowError: math range error on math.exp) 
     55         on classifiers with high beta""" 
     56        quality = Orange.feature.Discrete('quality') 
     57        quality.add_value('low') 
     58        quality.add_value('high') 
     59        price = Orange.feature.Continuous('price') 
     60        variables = [price, quality] 
     61        matrix = [[0.01, 'high'], [0.001, 'low']] 
     62        domain = Orange.data.Domain(variables) 
     63        data = Orange.data.Table(domain, matrix) 
     64        classifier = LogRegLearner(data) 
     65        text_dump = dump(classifier) 
     66 
     67 
    5068if __name__ == "__main__": 
    5169    unittest.main() 
Note: See TracChangeset for help on using the changeset viewer.