import numpy as np
import pandas as pd
from sklearn.base import RegressorMixin, ClassifierMixin
from ..base import ModelBaseRegressor, ModelBaseClassifier
[docs]
class MoScoredRegressor(RegressorMixin, ModelBaseRegressor):
"""
A wrapper for a scored regression model that provides predictions
without holding the model object itself.
Parameters
----------
dataset : object
The dataset to be used for predictions.
prediction_name : str
The prediction column name in dataset.
If None, will use the prediction_proba_name attribute in dataset.
name : str, default=None
The name of the model.
"""
def __init__(self,
dataset,
prediction_name: str = None,
name: str = None,
):
self.name = name
self.dataset = dataset
if prediction_name is not None:
self.prediction_name = prediction_name
elif dataset.prediction_name is not None:
self.prediction_name = dataset.prediction_name
else:
raise ValueError("prediction_name is not specified and dataset also does not set prediction_name")
self.is_fitted_ = True
def _predict(self, X):
"""
Predicts the target values for the given input data X.
Parameters
----------
X : array-like
Input data for which predictions are to be made.
Returns
-------
array-like
Predicted values corresponding to the input data.
Raises
------
ValueError
If predictions for the given input data are not available.
"""
for name in self.dataset.get_data_list():
XX = self.dataset.get_X_y_data(dataset=name)[0]
if pd.DataFrame(X).equals(pd.DataFrame(XX)):
data = self.dataset.get_data(dataset=name, active_sample=True, active_feature=False)
feature_idx = self.dataset.all_feature_names.index(self.prediction_name)
pred = data[:, feature_idx]
return pred
else:
raise ValueError("Prediction for this X not available.")
[docs]
class MoScoredClassifier(ClassifierMixin, ModelBaseClassifier):
"""
A wrapper for a scored classification model that provides predictions
and probability estimates without holding the model object itself.
Parameters
----------
dataset : object
The dataset to be used for predictions.
prediction_proba_name : str, default=None
The prediction_proba column name in dataset.
If None, will use the prediction_proba_name attribute in dataset.
name : str, default=None
The name of the model.
"""
def __init__(self,
dataset,
prediction_proba_name: str = None,
name: str = None,
):
self.name = name
self.dataset = dataset
if prediction_proba_name is not None:
self.prediction_proba_name = prediction_proba_name
elif dataset.prediction_proba_name is not None:
self.prediction_proba_name = dataset.prediction_proba_name
else:
raise ValueError(
"prediction_proba_name is not specified and dataset also does not set prediction_proba_name")
self.is_fitted_ = True
self.classes_ = [0, 1]
def _predict_proba(self, X):
"""
Predicts the class probabilities for the given input data X.
Parameters
----------
X : array-like
Input data for which probabilities are to be predicted.
Returns
-------
array-like
Predicted class probabilities corresponding to the input data.
Raises
------
ValueError
If probability predictions for the given input data are not available.
"""
for name in self.dataset.get_data_list():
XX = self.dataset.get_X_y_data(dataset=name)[0]
if pd.DataFrame(X).equals(pd.DataFrame(XX)):
data = self.dataset.get_data(dataset=name, active_sample=True, active_feature=False)
feature_idx = self.dataset.all_feature_names.index(self.prediction_proba_name)
proba = data[:, [feature_idx]]
return np.hstack([1 - proba, proba])
else:
continue
else:
raise ValueError("Prediction proba for this X not available.")