alg-sel/algsel_models.py

176 lines
5.6 KiB
Python

from sklearn import ensemble
import numpy as np
class BaseAlgSel(object):
def __init__(self, modeltype='ET', n_estimators=100, n_jobs=-1):
self.modeltype = modeltype
self.n_estimators = n_estimators
self.learner = None
self.n_jobs = n_jobs
if self.modeltype=='ET':
self.treesmodel = ensemble.ExtraTreesRegressor
elif self.modeltype=='RF':
self.treesmodel = ensemble.RandomForestRegressor
def predict_algID(self, X):
preds = self.predict_runtime(X)
BestAlgIDs = preds.argmin(axis=1)
return BestAlgIDs
class AlgSel_SingleOutputModel(BaseAlgSel):
def __init__(self, modeltype='ET', n_estimators=100, n_jobs=-1):
super(AlgSel_SingleOutputModel,self).__init__(
modeltype = modeltype,
n_estimators = n_estimators,
n_jobs = n_jobs)
self.name = 'Single-output ' + modeltype
def __str__(self):
s = 'Single-output ' + self.modeltype
s += "; ntrees=%d" % (self.n_estimators)
return s
def fit(self, X, y):
print 'training single-output', self.modeltype
etrgrs = []
for i in range(y.shape[1]):
print '\tsingle-output', self.modeltype, i
etrgr = self.treesmodel(n_estimators=self.n_estimators, n_jobs=self.n_jobs)
etrgr.fit(X, y[:,i])
etrgrs += [etrgr]
self.learner = etrgrs
def predict_runtime(self, X):
preds = []
for etrgr in self.learner:
pred = etrgr.predict(X)
preds += [pred]
preds = np.array(preds)
preds = preds.T
return preds
class AlgSel_StackModel(BaseAlgSel):
def __init__(self, modeltype='ET', n_estimators=100, n_jobs=-1):
super(AlgSel_StackModel,self).__init__(
modeltype = modeltype,
n_estimators = n_estimators,
n_jobs = n_jobs)
def __str__(self):
s = 'Stack Single-output ' + self.modeltype
s += "; ntrees=%d" % (self.n_estimators)
return s
def fit(self, X, y):
print 'training stack-model', self.modeltype
# 1st model
print ' 1st stage'
etrgrs1 = []
pred1 = []
for i in range(y.shape[1]):
print '\tsingle-output', self.modeltype, i
etrgr = self.treesmodel(n_estimators=self.n_estimators, n_jobs=-1)
etrgr.fit(X, y[:,i])
pred = etrgr.predict(X)
pred1 += [pred]
etrgrs1 += [etrgr]
pred1 = np.array(pred1).T
# 2nd model
print ' 2nd stage'
X_stack = np.concatenate((X, pred1), axis=1)
print 'X_stack:', X_stack.shape
etrgrs2 = []
for i in range(y.shape[1]):
print '\tsingle-output', self.modeltype, i
etrgr = self.treesmodel(n_estimators=self.n_estimators, n_jobs=-1)
etrgr.fit(X_stack, y[:,i])
etrgrs2 += [etrgr]
self.learner = [etrgrs1, etrgrs2]
def predict_runtime(self, X):
etrgrs1 = self.learner[0]
etrgrs2 = self.learner[1]
# 1st model
pred_test1 = []
for etrgr in etrgrs1:
pred = etrgr.predict(X)
pred_test1 += [pred]
pred_test1 = np.array(pred_test1).T
# 2nd model
X_test_stack = np.concatenate((X, pred_test1), axis=1)
pred_test2 = []
for etrgr in etrgrs2:
pred = etrgr.predict(X_test_stack)
pred_test2 += [pred]
pred_test2 = np.array(pred_test2).T
return pred_test2
class AlgSel_MultiOutputModel(BaseAlgSel):
def __init__(self, modeltype='ET', n_estimators=100, n_jobs=-1):
super(AlgSel_MultiOutputModel,self).__init__(
modeltype = modeltype,
n_estimators = n_estimators,
n_jobs = n_jobs)
def __str__(self):
s = 'Multi-output ' + self.modeltype
s += "; ntrees=%d" % (self.n_estimators)
return s
def fit(self, X, y):
print 'training multi-output', self.modeltype
self.learner = self.treesmodel(n_estimators=self.n_estimators, n_jobs=self.n_jobs)
self.learner.fit(X, y)
def predict_runtime(self, X):
preds = self.learner.predict(X)
return preds
class AlgSel_CombinedModel(BaseAlgSel):
def __init__(self, modeltype='ET', n_estimators=100, alpha=0.5, n_jobs=-1):
super(AlgSel_CombinedModel,self).__init__(
modeltype = modeltype,
n_estimators = n_estimators,
n_jobs = n_jobs)
self.alpha = alpha
def __str__(self):
s = 'Combined Single- and Multi-output ' + self.modeltype
s += "; ntrees=%d" % (self.n_estimators)
s += "; alpha=%d" % (self.alpha)
return s
def fit(self, X, y):
print '\tcombined single- and multi-output', self.modeltype
print '\tmulti-output', self.modeltype
rgrmul = self.treesmodel(n_estimators=self.n_estimators, n_jobs=self.n_jobs)
rgrmul.fit(X, y)
etrgrs = []
for i in range(y.shape[1]):
print '\tsingle-output', self.modeltype, i
etrgr = self.treesmodel(n_estimators=self.n_estimators, n_jobs=self.n_jobs)
etrgr.fit(X, y[:,i])
etrgrs += [etrgr]
self.learner = [rgrmul, etrgrs]
def predict_runtime(self, X):
rgrmul = self.learner[0]
preds_mul = rgrmul.predict(X)
preds = []
for etrgr in self.learner[1]:
pred = etrgr.predict(X)
preds += [pred]
preds = np.array(preds)
preds = preds.T
preds_combined = self.alpha*preds_mul + (1-self.alpha)*preds
return preds_combined