[英]Building ensemble model with the python merf library
我想在集成 model 中使用 python merf
(混合效應隨機森林)庫,例如通過使用mlens
或mlxtend
python 庫。 但是,由於merf
的 fit 和 predict 方法的結構采用非傳統方式,我無法弄清楚如何做到這一點:
from merf import MERF
merf = MERF()
merf.fit(X_train, Z_train, clusters_train, y_train)
y_hat = merf.predict(X_test, Z_test, clusters_test)
有沒有辦法可以在集合 model 中使用merf
庫? 問題是使用mlens
或其他集成庫構建集成 model 假定 scikit-learn 結構,其中 fit 方法具有X
, y
作為輸入, predict 方法具有X_test
作為輸入。 然而, merf
顯然在 fit 和 predict 方法中都有更多的輸入。 這是mlens
的簡化語法:
from mlens.ensemble import SuperLearner
ensemble = SuperLearner()
ensemble.add(estimators)
ensemble.add_meta(meta_estimator)
ensemble.fit(X, y).predict(X)
我不限於使用mlens
或mlxten
。 任何其他構建帶有merf
的集合 model 的方法也可以。
我的意思是,您總是可以使用merf
潛入數據制作過程中:P。 大部分數據生成來自manifoldai merf示例:
from merf.utils import MERFDataGenerator
import numpy as np
from mlens.ensemble import SuperLearner
from sklearn.svm import SVR
from sklearn.linear_model import Lasso
from mlens.metrics.metrics import rmse
dgm = MERFDataGenerator(m = .6, sigma_b = np.sqrt(4.5), sigma_e = 1)
num_clusters_each_size = 20
train_sizes = [1, 3, 5, 7, 9]
known_sizes = [9, 27, 45, 63, 81]
new_sizes = [10, 30, 50, 70, 90]
train_cluster_sizes = MERFDataGenerator.create_cluster_sizes_array(train_sizes, num_clusters_each_size)
known_cluster_sizes = MERFDataGenerator.create_cluster_sizes_array(known_sizes, num_clusters_each_size)
new_cluster_sizes = MERFDataGenerator.create_cluster_sizes_array(new_sizes, num_clusters_each_size)
train, test_known, test_new, training_cluster_ids, ptev, prev = dgm.generate_split_samples(train_cluster_sizes, known_cluster_sizes, new_cluster_sizes)
X_train = train[['X_0', 'X_1', 'X_2']]
Z_train = train[['Z']]
clusters_train = train['cluster']
y_train = train['y']
在對Flennerhag mlens.ensemble mlens.ensemble superlearner.py
(Github)進行一些修改進行擬合和預測之前:
ensemble = SuperLearner()
ensemble.add([SVR(), Lasso()])
ensemble.add_meta(SVR())
pred = ensemble.fit(X_train, y_train).predict(X_train)
root = rmse(y_train, pred)
print(root)
>>>
2.345318341087564
但是,當然,如果您不介意專門將merf
和ensemble
一起使用,總有更好的方法。
Keras
方法from keras.models import Sequential
from keras.layers import Dense
from matplotlib import pyplot
from keras import backend
import matplotlib.pyplot as plt
import numpy as np
def rmse(y_true, y_pred):
return backend.sqrt(backend.mean(backend.square(y_pred - y_true), axis=-1))
X = X_train.to_numpy().flatten()
model = Sequential()
model.add(Dense(2, input_dim=1, activation='relu'))
model.add(Dense(1))
model.compile(loss='mse', optimizer='adam', metrics=[rmse])
history = model.fit(X, X, epochs=500, batch_size=len(X), verbose=2)
plt.plot(history.history['rmse'])
plt.title("keras loss function")
plt.show()
>>>
請注意,這里使用的X_train
來自之前的merf
代碼:
X_train = train[['X_0', 'X_1', 'X_2']]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.