66using LearnAPI
77using Tables
88using LinearAlgebra
9+ import LearnDataFrontEnds as FrontEnds
910
1011# # NAIVE RIDGE REGRESSION WITH NO INTERCEPTS
1112
12- # We overload `obs` to expose internal representation of data . See later for a simpler
13- # variation using the `obs` fallback .
13+ # We implement a canned data front end . See `BabyRidgeRegressor` below for a no-frills
14+ # version .
1415
16+ # no docstring here; that goes with the constructor
1517struct Ridge
1618 lambda:: Float64
1719end
@@ -43,28 +45,25 @@ Base.getindex(data::RidgeFitObs, I) =
4345 RidgeFitObs (data. A[:,I], data. names, data. y[I])
4446Base. length (data:: RidgeFitObs ) = length (data. y)
4547
46- # observations for consumption by `fit`:
47- function LearnAPI. obs (:: Ridge , data)
48- X, y = data
49- table = Tables. columntable (X)
50- names = Tables. columnnames (table) |> collect
51- RidgeFitObs (Tables. matrix (table)' , names, y)
52- end
48+ # add a canned data front end; `obs` will return objects of type `FrontEnds.Obs`:
49+ const frontend = FrontEnds. Saffron (view= true )
50+ LearnAPI. obs (learner:: Ridge , data) = FrontEnds. fitobs (learner, data, frontend)
51+ LearnAPI. obs (model:: RidgeFitted , data) = obs (model, data, frontend)
5352
54- # for involutivity:
55- LearnAPI. obs (:: Ridge , data:: RidgeFitObs ) = data
53+ # training data deconstructors:
54+ LearnAPI. features (learner:: Ridge , data) = LearnAPI. features (learner, data, frontend)
55+ LearnAPI. target (learner:: Ridge , data) = LearnAPI. target (learner, data, frontend)
5656
57- # for observations:
58- function LearnAPI. fit (learner:: Ridge , observations:: RidgeFitObs ; verbosity= 1 )
57+ function LearnAPI. fit (learner:: Ridge , observations:: FrontEnds.Obs ; verbosity= 1 )
5958
6059 # unpack hyperparameters and data:
6160 lambda = learner. lambda
62- A = observations. A
61+ A = observations. features
6362 names = observations. names
64- y = observations. y
63+ y = observations. target
6564
6665 # apply core learner:
67- coefficients = (A* A' + learner. lambda* I)\ (A* y) # 1 x p matrix
66+ coefficients = (A* A' + learner. lambda* I)\ (A* y) # p x 1 matrix
6867
6968 # determine crude feature importances:
7069 feature_importances =
@@ -78,28 +77,13 @@ function LearnAPI.fit(learner::Ridge, observations::RidgeFitObs; verbosity=1)
7877 return RidgeFitted (learner, coefficients, feature_importances, names)
7978
8079end
81-
82- # for unprocessed `data = (X, y)`:
8380LearnAPI. fit (learner:: Ridge , data; kwargs... ) =
8481 fit (learner, obs (learner, data); kwargs... )
8582
86- # extracting stuff from training data:
87- LearnAPI. target (:: Ridge , observations:: RidgeFitObs ) = observations. y
88- LearnAPI. features (:: Ridge , observations:: RidgeFitObs ) = observations. A
89- LearnAPI. target (learner:: Ridge , data) =
90- LearnAPI. target (learner, obs (learner, data))
91-
92- # observations for consumption by `predict`:
93- LearnAPI. obs (:: RidgeFitted , X) = Tables. matrix (X)'
94- LearnAPI. obs (:: RidgeFitted , X:: AbstractMatrix ) = X
95-
96- # matrix input:
97- LearnAPI. predict (model:: RidgeFitted , :: Point , observations:: AbstractMatrix ) =
98- observations' * model. coefficients
99-
100- # tabular input:
101- LearnAPI. predict (model:: RidgeFitted , :: Point , Xnew) =
102- predict (model, Point (), obs (model, Xnew))
83+ LearnAPI. predict (model:: RidgeFitted , :: Point , observations:: FrontEnds.Obs ) =
84+ (observations. features)' * model. coefficients
85+ LearnAPI. predict (model:: RidgeFitted , kind_of_proxy, data) =
86+ LearnAPI. predict (model, kind_of_proxy, obs (model, data))
10387
10488# accessor function:
10589LearnAPI. feature_importances (model:: RidgeFitted ) = model. feature_importances
0 commit comments