Changeset 10431:8dc18238bde5 in orange


Ignore:
Timestamp:
03/02/12 17:27:31 (2 years ago)
Author:
Lan Zagar <lan.zagar@…>
Branch:
default
rebase_source:
28b3c9bc53da1db9a69241914210ce65820219e9
Message:

Some code clean-up in linear regression and updated its regression test.

Location:
Orange
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • Orange/regression/linear.py

    r10428 r10431  
    150150    """     
    151151 
    152     def __init__(self, name='linear regression', intercept=True, \ 
    153                  compute_stats=True, ridge_lambda=None,\ 
    154                  imputer=None, continuizer=None, \ 
    155                  use_vars=None, stepwise=False, add_sig=0.05, 
    156                  remove_sig=0.2, **kwds): 
     152    def __init__(self, name='linear regression', intercept=True, 
     153                 compute_stats=True, ridge_lambda=None, imputer=None, 
     154                 continuizer=None, use_vars=None, stepwise=False, 
     155                 add_sig=0.05, remove_sig=0.2, **kwds): 
    157156        """ 
    158157        :param name: name of the linear model, default 'linear regression' 
     
    160159        :param intercept: if True, the intercept beta0 is included 
    161160            in the model 
    162         :type intercept: boolean 
     161        :type intercept: bool 
    163162        :param compute_stats: if True, statistical properties of 
    164163            the estimators (standard error, t-scores, significances) 
    165164            and statistical properties of the model 
    166165            (sum of squares, R2, adjusted R2) are computed 
    167         :type compute_stats: boolean 
    168         :param ridge_lambda: if not None, the lambda parameter 
    169             in ridge regression 
    170         :type ridge_lambda: integer or None 
     166        :type compute_stats: bool 
     167        :param ridge_lambda: if not None, ridge regression is performed  
     168                             with the given lambda parameter controlling 
     169                             the regularization 
     170        :type ridge_lambda: :obj:`int` or :obj:`None` 
    171171        :param use_vars: the list of independent varaiables included in 
    172172            regression model. If None (default) all variables are used 
     
    176176            based on F-test is performed. The significance parameters are 
    177177            add_sig and remove_sig 
    178         :type stepwise: boolean 
     178        :type stepwise: bool 
    179179        :param add_sig: lower bound of significance for which the variable 
    180180            is included in regression model 
     
    222222        if self.stepwise: 
    223223            use_vars = stepwise(table, weight, add_sig=self.add_sig, 
    224                                       remove_sig=self.remove_sig) 
     224                                remove_sig=self.remove_sig) 
    225225            new_domain = Orange.data.Domain(use_vars, table.domain.class_var) 
    226226            new_domain.addmetas(table.domain.getmetas()) 
     
    236236        if self.intercept: 
    237237            if A is None: 
    238                 X = numpy.ones([n,1]) 
     238                X = numpy.ones([n, 1]) 
    239239            else: 
    240240                X = numpy.insert(A, 0, 1, axis=1) # adds a column of ones 
     
    260260            cov = pinv(dot(dot(X.T, W), X)) 
    261261        else: 
    262             cov = pinv(dot(dot(X.T, W), X) - self.ridge_lambda*numpy.eye(m)) 
    263             compute_stats = False # TO DO: find inferential properties of the estimators 
     262            cov = pinv(dot(dot(X.T, W), X) - self.ridge_lambda * numpy.eye(m)) 
     263            # TODO: find inferential properties of the estimators 
     264            compute_stats = False  
    264265        D = dot(dot(cov, X.T), W) 
    265266        coefficients = dot(D, y) 
     
    270271 
    271272            # standardized coefficients 
    272             std_coefficients = (sqrt(cov_x.diagonal()) / sigma_y) \ 
    273                                 * coefficients 
     273            std_coefficients = sqrt(cov_x.diagonal()) / sigma_y * coefficients 
    274274        else: 
    275275            std_coefficients = None 
    276276 
    277277        if compute_stats is False: 
    278             return LinearRegression(domain.class_var, domain, coefficients=coefficients, 
    279                                     std_coefficients=std_coefficients, intercept=self.intercept) 
     278            return LinearRegression(domain.class_var, domain, 
     279                coefficients=coefficients, std_coefficients=std_coefficients, 
     280                intercept=self.intercept) 
    280281             
    281282 
    282283        fitted = dot(X, coefficients) 
    283         residuals = [ins.get_class() - fitted[i] \ 
     284        residuals = [ins.get_class() - fitted[i] 
    284285                     for i, ins in enumerate(table)] 
    285286 
     
    293294        # coefficient of determination 
    294295        r2 = ssr / sst 
    295         r2adj = 1-(1-r2)*(n-1)/(n-m-1) 
    296         F = (ssr/m)/(sst-ssr/(n-m-1)) 
    297         df = n-2  
    298         sigma_square = sse/(n-m-1) 
     296        r2adj = 1 - (1 - r2) * (n - 1) / (n - m - 1) 
     297        F = (ssr / m) / (sst - ssr / (n - m - 1)) 
     298        df = n - 2 
     299        sigma_square = sse / (n - m - 1) 
    299300        # standard error of the regression estimator, t-scores and p-values 
    300         std_error = sqrt(sigma_square*pinv(dot(X.T, X)).diagonal()) 
    301         t_scores = coefficients/std_error 
    302         p_vals = [stats.betai(df*0.5,0.5,df/(df + t*t)) \ 
     301        std_error = sqrt(sigma_square * pinv(dot(X.T, X)).diagonal()) 
     302        t_scores = coefficients / std_error 
     303        p_vals = [stats.betai(df * 0.5, 0.5, df / (df + t * t)) 
    303304                  for t in t_scores] 
    304305 
     
    307308        dict_model = {} 
    308309        if self.intercept: 
    309             dict_model["Intercept"] = (coefficients[0],\ 
    310                                       std_error[0], \ 
    311                                       t_scores[0], \ 
    312                                       p_vals[0]) 
     310            dict_model["Intercept"] = (coefficients[0], std_error[0], 
     311                                       t_scores[0], p_vals[0]) 
    313312        for i, var in enumerate(domain.attributes): 
    314313            j = i + 1 if self.intercept else i 
    315             dict_model[var.name] = (coefficients[j], \ 
    316                                    std_error[j],\ 
    317                                    t_scores[j],\ 
    318                                    p_vals[j]) 
     314            dict_model[var.name] = (coefficients[j], std_error[j], 
     315                                    t_scores[j], p_vals[j]) 
    319316         
    320317        return LinearRegression(domain.class_var, domain, coefficients, F, 
    321                  std_error=std_error, t_scores=t_scores, p_vals=p_vals, dict_model=dict_model, 
    322                  fitted=fitted, residuals=residuals, m=m, n=n, mu_y=mu_y, 
    323                  r2=r2, r2adj=r2adj, sst=sst, sse=sse, ssr=ssr, 
    324                  std_coefficients=std_coefficients, intercept=self.intercept) 
     318                 std_error=std_error, t_scores=t_scores, p_vals=p_vals, 
     319                 dict_model=dict_model, fitted=fitted, residuals=residuals, 
     320                 m=m, n=n, mu_y=mu_y, r2=r2, r2adj=r2adj, sst=sst, sse=sse, 
     321                 ssr=ssr, std_coefficients=std_coefficients, 
     322                 intercept=self.intercept) 
    325323 
    326324deprecated_members({"ridgeLambda": "ridge_lambda", 
     
    415413    def __init__(self, class_var=None, domain=None, coefficients=None, F=None, 
    416414                 std_error=None, t_scores=None, p_vals=None, dict_model=None, 
    417                  fitted=None, residuals=None, m = None, n=None, mu_y=None, 
     415                 fitted=None, residuals=None, m=None, n=None, mu_y=None, 
    418416                 r2=None, r2adj=None, sst=None, sse=None, ssr=None, 
    419417                 std_coefficients=None, intercept=None): 
     
    443441        self.intercept = intercept 
    444442 
    445     def __call__(self, instance, \ 
     443    def __call__(self, instance, 
    446444                 result_type=Orange.classification.Classifier.GetValue): 
    447445        """ 
    448446        :param instance: data instance for which the value of the response 
    449             variable will be predicted 
    450         :type instance:  
     447                         variable will be predicted 
     448        :type instance: :obj:`~Orange.data.Instance` 
    451449        """         
    452450        ins = Orange.data.Instance(self.domain, instance) 
     
    458456        if self.intercept: 
    459457            if len(self.coefficients) > 1: 
    460                 y_hat = self.coefficients[0] + \ 
    461                        dot(self.coefficients[1:], ins[:-1]) 
     458                y_hat = self.coefficients[0] + dot(self.coefficients[1:], 
     459                                                   ins[:-1]) 
    462460            else: 
    463461                if len(ins) == 1: 
     
    471469        y_hat = self.class_var(y_hat) 
    472470        dist = Orange.statistics.distribution.Continuous(self.class_var) 
    473         dist[y_hat] = 1.0 
     471        dist[y_hat] = 1. 
    474472        if result_type == Orange.classification.Classifier.GetValue: 
    475473            return y_hat 
     
    489487        lines = [join(['%10s' % l for l in labels], ' ')] 
    490488 
    491         fmt = "%10s " + join(["%10.3f"]*4, " ") + " %5s" 
     489        fmt = "%10s " + join(["%10.3f"] * 4, " ") + " %5s" 
    492490        if not self.p_vals: 
    493491            raise ValueError("Model does not contain model statistics.") 
    494492        def get_star(p): 
    495             if p < 0.001: return  "*"*3 
    496             elif p < 0.01: return "*"*2 
     493            if p < 0.001: return  "*" * 3 
     494            elif p < 0.01: return "*" * 2 
    497495            elif p < 0.05: return "*" 
    498496            elif p < 0.1: return  "." 
     
    501499        if self.intercept == True: 
    502500            stars =  get_star(self.p_vals[0]) 
    503             lines.append(fmt % ('Intercept', self.coefficients[0],  
    504                          self.std_error[0], self.t_scores[0], self.p_vals[0], stars)) 
     501            lines.append(fmt % ('Intercept', self.coefficients[0], 
     502                                self.std_error[0], self.t_scores[0], 
     503                                self.p_vals[0], stars)) 
    505504            for i in range(len(self.domain.attributes)): 
    506                 stars = get_star(self.p_vals[i+1]) 
     505                stars = get_star(self.p_vals[i + 1]) 
    507506                lines.append(fmt % (self.domain.attributes[i].name, 
    508                              self.coefficients[i+1], self.std_error[i+1], 
    509                              self.t_scores[i+1], self.p_vals[i+1], stars)) 
     507                             self.coefficients[i + 1], self.std_error[i + 1], 
     508                             self.t_scores[i + 1], self.p_vals[i + 1], stars)) 
    510509        else: 
    511510            for i in range(len(self.domain.attributes)): 
     
    519518    def __str__(self): 
    520519        return self.to_string() 
    521          
    522  
    523520 
    524521 
     
    538535    if RSS1 <= RSS2 or p2 <= p1 or n <= p2 or RSS2 <= 0: 
    539536        return 1.0 
    540     F = ((RSS1-RSS2)/(p2-p1))/(RSS2/(n-p2)) 
    541     return stats.fprob(int(p2-p1), int(n-p2), F) 
     537    F = ((RSS1 - RSS2) / (p2 - p1)) / (RSS2 / (n - p2)) 
     538    return stats.fprob(int(p2 - p1), int(n - p2), F) 
    542539 
    543540 
     
    619616    c = LinearRegressionLearner(table) 
    620617    print c 
     618 
  • Orange/testing/regression/results_reference/linear-example.py.txt

    r9954 r10431  
    55Actual: 36.20, predicted: 27.94  
    66  Variable  Coeff Est  Std Error    t-value          p 
    7  Intercept     36.459      5.103      7.144      0.000   *** 
    8       CRIM     -0.108      0.033     -3.287      0.001    ** 
    9         ZN      0.046      0.014      3.382      0.001   *** 
    10      INDUS      0.021      0.061      0.334      0.738       
    11       CHAS      2.687      0.862      3.118      0.002    ** 
    12        NOX    -17.767      3.820     -4.651      0.000   *** 
    13         RM      3.810      0.418      9.116      0.000   *** 
     7 Intercept     36.459      5.109      7.137      0.000   *** 
     8      CRIM     -0.108      0.033     -3.283      0.001    ** 
     9        ZN      0.046      0.014      3.378      0.001   *** 
     10     INDUS      0.021      0.062      0.334      0.739       
     11      CHAS      2.687      0.862      3.115      0.002    ** 
     12       NOX    -17.767      3.824     -4.647      0.000   *** 
     13        RM      3.810      0.418      9.107      0.000   *** 
    1414       AGE      0.001      0.013      0.052      0.958       
    15        DIS     -1.476      0.199     -7.398      0.000   *** 
    16        RAD      0.306      0.066      4.613      0.000   *** 
    17        TAX     -0.012      0.004     -3.280      0.001    ** 
    18    PTRATIO     -0.953      0.131     -7.283      0.000   *** 
    19          B      0.009      0.003      3.467      0.001   *** 
    20      LSTAT     -0.525      0.051    -10.347      0.000   *** 
     15       DIS     -1.476      0.200     -7.390      0.000   *** 
     16       RAD      0.306      0.066      4.608      0.000   *** 
     17       TAX     -0.012      0.004     -3.277      0.001    ** 
     18   PTRATIO     -0.953      0.131     -7.275      0.000   *** 
     19         B      0.009      0.003      3.463      0.001   *** 
     20     LSTAT     -0.525      0.051    -10.337      0.000   *** 
    2121Signif. codes:  0 *** 0.001 ** 0.01 * 0.05 . 0.1 empty 1 
    2222  Variable  Coeff Est  Std Error    t-value          p 
    23  Intercept     36.341      5.067      7.171      0.000   *** 
    24      LSTAT     -0.523      0.047    -11.019      0.000   *** 
    25         RM      3.802      0.406      9.356      0.000   *** 
    26    PTRATIO     -0.947      0.129     -7.334      0.000   *** 
    27        DIS     -1.493      0.186     -8.037      0.000   *** 
    28        NOX    -17.376      3.535     -4.915      0.000   *** 
    29       CHAS      2.719      0.854      3.183      0.002    ** 
    30          B      0.009      0.003      3.475      0.001   *** 
    31         ZN      0.046      0.014      3.390      0.001   *** 
    32       CRIM     -0.108      0.033     -3.307      0.001    ** 
    33        RAD      0.300      0.063      4.726      0.000   *** 
    34        TAX     -0.012      0.003     -3.493      0.001   *** 
     23 Intercept     36.341      5.073      7.164      0.000   *** 
     24     LSTAT     -0.523      0.047    -11.008      0.000   *** 
     25        RM      3.802      0.407      9.347      0.000   *** 
     26   PTRATIO     -0.947      0.129     -7.326      0.000   *** 
     27       DIS     -1.493      0.186     -8.029      0.000   *** 
     28       NOX    -17.376      3.539     -4.910      0.000   *** 
     29      CHAS      2.719      0.855      3.179      0.002    ** 
     30         B      0.009      0.003      3.471      0.001   *** 
     31        ZN      0.046      0.014      3.387      0.001   *** 
     32      CRIM     -0.108      0.033     -3.304      0.001    ** 
     33       RAD      0.300      0.063      4.721      0.000   *** 
     34       TAX     -0.012      0.003     -3.489      0.001   *** 
    3535Signif. codes:  0 *** 0.001 ** 0.01 * 0.05 . 0.1 empty 1 
Note: See TracChangeset for help on using the changeset viewer.