You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

49 lines
1.5 KiB

#!/usr/bin/env python
import pandas as pd
from sklearn.linear_model import ElasticNet as _ElasticNet
from base import RegressorMixin, BaseAlgo
from codec import codecs_manager
from util.param_util import convert_params
class ElasticNet(RegressorMixin, BaseAlgo):
def __init__(self, options):
self.handle_options(options)
out_params = convert_params(
options.get('params', {}),
bools=['fit_intercept'],
floats=['alpha', 'l1_ratio'],
)
if 'l1_ratio' in out_params:
if out_params['l1_ratio'] < 0 or out_params['l1_ratio'] > 1:
raise RuntimeError('l1_ratio must be >= 0 and <= 1')
self.estimator = _ElasticNet(**out_params)
def summary(self, options):
if len(options) != 2: # only model name and mlspl_limits
raise RuntimeError(
'"%s" models do not take options for summarization' % self.__class__.__name__
)
df = pd.DataFrame(
{'feature': self.columns, 'coefficient': self.estimator.coef_.ravel()}
)
idf = pd.DataFrame(
{'feature': ['_intercept'], 'coefficient': [self.estimator.intercept_]}
)
return pd.concat([df, idf])
@staticmethod
def register_codecs():
from codec.codecs import SimpleObjectCodec
codecs_manager.add_codec('algos.ElasticNet', 'ElasticNet', SimpleObjectCodec)
codecs_manager.add_codec(
'sklearn.linear_model._coordinate_descent', 'ElasticNet', SimpleObjectCodec
)