模擬估算器:scikit-learn Estimator

模擬估算器:scikit-learn Estimator

scikit-learn機器學習模型通常嵌入在數據管道中,以便對通過管道傳遞的數據進行預測。對於任何生產管道,需要對機器學習模型進行歷史數據訓練,以提供準確的預測。但是,在某些情況下,使用不考慮任何先前數據的簡單規則來處理管道數據是有意義的。一些有用的案例是:

Pipeline MVP

當一個數據科學項目剛剛開始時,關鍵是要儘可能快地走向一個最小可行的產品(MVP)。這個MVP將包含最終數據產品的所有組件,但只具有最低限度的功能。在項目達到這一點之後,迭代和改進已經存在的Pipeline將會更快。由於一個經過訓練的機器學習模型需要花費大量的時間和精力來創建,因此在數據管道中放置一個模擬模型將允許數據工程師在數據科學家完成最終模型的訓練之前開始他們的工作。

性能Baseline

模擬模型有用的另一種情況是確定機器學習模型有價值所需的最低性能。例如,如果模型試圖預測哪些客戶將離開以及哪些客戶將留下,那麼一個天真的模型可能預測所有客戶將留下。它的精度會很差。任何可行的模型都需要擊敗天真模型的表現。擁有遵循簡單規則並可插入相同分析代碼的模擬模型將允許數據科學家以他們為真實模型測量它的確切方式來衡量其性能。

模擬估算器

現在我們知道創建模擬模型背後的目的,讓我們看看如何在實踐中完成它。以下Python代碼創建MockBinaryClassifier充當二元預測模型的類。該模型遵循以下簡單規則:如果第一個特徵的值小於或等於0,則返回0級,如果第一個特徵大於0則返回1級。Python代碼如下:

import numpy as np
from sklearn.base import BaseEstimator
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import MinMaxScaler
class MockBinaryClassifier(BaseEstimator):
"""Class to emulate a predictive model using a simple heuristic."""
def __init__(self):
"""Set the classes for binary classification"""
self.n_classes_ = 2
self.classes_ = np.array([0, 1])
def fit(
self,
features: np.ndarray,
target: np.ndarray,
sample_weight: np.ndarray = None
):
"""
Mocks out the fit function for a standard scikit-learn estimator. Since
the heuristic doesn't rely on any previous data, the function simply
returns self.
:param features:
Ignored.
:param target:
Ignored.
:param sample_weight:
Ignored.
:return:
Returns the estimator without any changes.
"""
return self
def predict(self, features: np.ndarray) -> np.ndarray:
"""
Emulate a machine learning model's behavior. This function will return
the most probable class for each instance. It only uses the first
feature of the `features` array.

If the feature value is less than or equal to 0, it will return a
class 0. If feature value is greater than zero, it will return a
class 1.
:param features:
Ndarray that corresponds to features used in a classification model.
:return:
Predicted class for all instances of `features`.
"""
return np.where(features[:, 0] > 0, 1, 0)

代碼格式:

模擬估算器:scikit-learn Estimator

關於MockBinaryClassifier有一些需要注意。第一個是類繼承自sklearn.base.BaseEstimator。這意味著它可以在任何使用scikit-learn estimator 的地方使用。另一個是,fit函數本質上是一個無操作。既然我們知道如何對實例進行分類,就不需要考慮任何歷史數據。

示範

下面是Python示例代碼,用於顯示實際運行中的MockBinaryClassifier:

model = MockBinaryClassifier()
test_feature = np.array([[0], [0.5], [3], [-1]])
predictions = model.predict(test_feature)
print(predictions)

[0 1 1 0]

該示例顯示了對一組單特徵實例打分的預測值函數。您可能會反對說,這並不能證明類可以像其他任何scikit-learn estimator 一樣被使用,因為Python代碼即使不從sklearn.base.BaseEstimator繼承也能工作。下面的Python代碼展示了MockBinaryClassifier如何在scikit-learn pipeline中工作:

train_feature = np.zeros_like(test_feature)
train_target = np.zeros_like(test_feature)
pipe = Pipeline([
('scale', MinMaxScaler(feature_range=(0, 1))),
('mock', MockBinaryClassifier())
])
pipe_predictions = pipe.fit(train_feature, train_target).predict(test_feature)
print(pipe_predictions)

[0 1 1 0]

MockBinaryClassifier可以在任意複雜的數據管道中作為scikit-learn estimator 的替代。惟一可能需要的更改是實現額外的函數,如predict_proba等。

需要注意的一點是,如果數據管道包括使用pickle從持久存儲加載模型,那麼需要在加載環境中導入MockBinaryClassifier。

結論

使用啟發式方法創建模擬模型是在開發週期中消除瓶頸的一種極好的方法。它允許數據工程師和數據科學家並行工作,而不需要工程師等待真正的機器學習模型被建立。它還允許數據科學家使用他們將用於構建真實模型的精確代碼來設置基準性能標準。


分享到:


相關文章: