Commit e4487d31 authored by Dr.李's avatar Dr.李

added xgb classifier

parent 38de1f0f
...@@ -31,6 +31,7 @@ from alphamind.model import ConstLinearModel ...@@ -31,6 +31,7 @@ from alphamind.model import ConstLinearModel
from alphamind.model import LogisticRegression from alphamind.model import LogisticRegression
from alphamind.model import RandomForestRegressor from alphamind.model import RandomForestRegressor
from alphamind.model import XGBRegressor from alphamind.model import XGBRegressor
from alphamind.model import XGBClassifier
from alphamind.model import load_model from alphamind.model import load_model
from alphamind.model.data_preparing import fetch_data_package from alphamind.model.data_preparing import fetch_data_package
from alphamind.model.data_preparing import fetch_train_phase from alphamind.model.data_preparing import fetch_train_phase
...@@ -70,6 +71,7 @@ __all__ = [ ...@@ -70,6 +71,7 @@ __all__ = [
'LogisticRegression', 'LogisticRegression',
'RandomForestRegressor', 'RandomForestRegressor',
'XGBRegressor', 'XGBRegressor',
'XGBClassifier',
'load_model', 'load_model',
'NaiveExecutor', 'NaiveExecutor',
'ThresholdExecutor', 'ThresholdExecutor',
......
...@@ -12,6 +12,7 @@ from alphamind.model.linearmodel import LogisticRegression ...@@ -12,6 +12,7 @@ from alphamind.model.linearmodel import LogisticRegression
from alphamind.model.treemodel import RandomForestRegressor from alphamind.model.treemodel import RandomForestRegressor
from alphamind.model.treemodel import XGBRegressor from alphamind.model.treemodel import XGBRegressor
from alphamind.model.treemodel import XGBClassifier
from alphamind.model.loader import load_model from alphamind.model.loader import load_model
...@@ -22,4 +23,5 @@ __all__ = ['LinearRegression', ...@@ -22,4 +23,5 @@ __all__ = ['LinearRegression',
'LogisticRegression', 'LogisticRegression',
'RandomForestRegressor', 'RandomForestRegressor',
'XGBRegressor', 'XGBRegressor',
'XGBClassifier',
'load_model'] 'load_model']
\ No newline at end of file
...@@ -12,6 +12,7 @@ from alphamind.model.linearmodel import LassoRegression ...@@ -12,6 +12,7 @@ from alphamind.model.linearmodel import LassoRegression
from alphamind.model.linearmodel import LogisticRegression from alphamind.model.linearmodel import LogisticRegression
from alphamind.model.treemodel import RandomForestRegressor from alphamind.model.treemodel import RandomForestRegressor
from alphamind.model.treemodel import XGBRegressor from alphamind.model.treemodel import XGBRegressor
from alphamind.model.treemodel import XGBClassifier
def load_model(model_desc: dict) -> ModelBase: def load_model(model_desc: dict) -> ModelBase:
...@@ -31,5 +32,7 @@ def load_model(model_desc: dict) -> ModelBase: ...@@ -31,5 +32,7 @@ def load_model(model_desc: dict) -> ModelBase:
return RandomForestRegressor.load(model_desc) return RandomForestRegressor.load(model_desc)
elif 'XGBRegressor' in model_name_parts: elif 'XGBRegressor' in model_name_parts:
return XGBRegressor.load(model_desc) return XGBRegressor.load(model_desc)
elif 'XGBClassifier' in model_name_parts:
return XGBClassifier.load(model_desc)
else: else:
raise ValueError('{0} is not currently supported in model loader.'.format(model_name)) raise ValueError('{0} is not currently supported in model loader.'.format(model_name))
...@@ -11,6 +11,7 @@ from sklearn import __version__ as sklearn_version ...@@ -11,6 +11,7 @@ from sklearn import __version__ as sklearn_version
from sklearn.ensemble import RandomForestRegressor as RandomForestRegressorImpl from sklearn.ensemble import RandomForestRegressor as RandomForestRegressorImpl
from xgboost import __version__ as xgbboot_version from xgboost import __version__ as xgbboot_version
from xgboost import XGBRegressor as XGBRegressorImpl from xgboost import XGBRegressor as XGBRegressorImpl
from xgboost import XGBClassifier as XGBClassifierImpl
from alphamind.model.modelbase import ModelBase from alphamind.model.modelbase import ModelBase
from alphamind.utilities import alpha_logger from alphamind.utilities import alpha_logger
...@@ -49,7 +50,8 @@ class XGBRegressor(ModelBase): ...@@ -49,7 +50,8 @@ class XGBRegressor(ModelBase):
n_estimators: int=100, n_estimators: int=100,
learning_rate: float=0.1, learning_rate: float=0.1,
max_depth: int=3, max_depth: int=3,
features: List=None, **kwargs): features: List=None,
**kwargs):
super().__init__(features) super().__init__(features)
self.impl = XGBRegressorImpl(n_estimators=n_estimators, self.impl = XGBRegressorImpl(n_estimators=n_estimators,
learning_rate=learning_rate, learning_rate=learning_rate,
...@@ -77,5 +79,39 @@ class XGBRegressor(ModelBase): ...@@ -77,5 +79,39 @@ class XGBRegressor(ModelBase):
return self.impl.feature_importances_.tolist() return self.impl.feature_importances_.tolist()
class XGBClassifier(ModelBase):
def __init__(self,
n_estimators: int=100,
learning_rate: float=0.1,
max_depth: int=3,
features: List = None,
**kwargs):
super().__init__(features)
self.impl = XGBClassifierImpl(n_estimators=n_estimators,
learning_rate=learning_rate,
max_depth=max_depth,
**kwargs)
def save(self) -> dict:
model_desc = super().save()
model_desc['xgbboot_version'] = xgbboot_version
model_desc['importances'] = self.importances
return model_desc
@classmethod
def load(cls, model_desc: dict):
obj_layout = super().load(model_desc)
if LooseVersion(sklearn_version) < LooseVersion(model_desc['xgbboot_version']):
alpha_logger.warning('Current xgboost version {0} is lower than the model version {1}. '
'Loaded model may work incorrectly.'.format(xgbboot_version,
model_desc['xgbboot_version']))
return obj_layout
@property
def importances(self):
return self.impl.feature_importances_.tolist()
...@@ -10,6 +10,7 @@ import numpy as np ...@@ -10,6 +10,7 @@ import numpy as np
from alphamind.model.loader import load_model from alphamind.model.loader import load_model
from alphamind.model.treemodel import RandomForestRegressor from alphamind.model.treemodel import RandomForestRegressor
from alphamind.model.treemodel import XGBRegressor from alphamind.model.treemodel import XGBRegressor
from alphamind.model.treemodel import XGBClassifier
class TestTreeModel(unittest.TestCase): class TestTreeModel(unittest.TestCase):
...@@ -28,7 +29,7 @@ class TestTreeModel(unittest.TestCase): ...@@ -28,7 +29,7 @@ class TestTreeModel(unittest.TestCase):
sample_x = np.random.randn(100, 10) sample_x = np.random.randn(100, 10)
np.testing.assert_array_almost_equal(model.predict(sample_x), new_model.predict(sample_x)) np.testing.assert_array_almost_equal(model.predict(sample_x), new_model.predict(sample_x))
def tes_xgb_regress(self): def test_xgb_regress_persistence(self):
model = XGBRegressor(features=list(range(10))) model = XGBRegressor(features=list(range(10)))
x = np.random.randn(1000, 10) x = np.random.randn(1000, 10)
y = np.random.randn(1000) y = np.random.randn(1000)
...@@ -40,4 +41,19 @@ class TestTreeModel(unittest.TestCase): ...@@ -40,4 +41,19 @@ class TestTreeModel(unittest.TestCase):
self.assertEqual(model.features, new_model.features) self.assertEqual(model.features, new_model.features)
sample_x = np.random.randn(100, 10) sample_x = np.random.randn(100, 10)
np.testing.assert_array_almost_equal(model.predict(sample_x), new_model.predict(sample_x)) np.testing.assert_array_almost_equal(model.predict(sample_x), new_model.predict(sample_x))
\ No newline at end of file
def test_xgb_classify_persistence(self):
model = XGBClassifier(features=list(range(10)))
x = np.random.randn(1000, 10)
y = np.random.randn(1000)
y = np.where(y > 0, 1, 0)
model.fit(x, y)
desc = model.save()
new_model = load_model(desc)
self.assertEqual(model.features, new_model.features)
sample_x = np.random.randn(100, 10)
np.testing.assert_array_almost_equal(model.predict(sample_x), new_model.predict(sample_x))
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment