簡體   English   中英

使用 python merf 庫構建集成 model

[英]Building ensemble model with the python merf library

我想在集成 model 中使用 python merf (混合效應隨機森林)庫,例如通過使用mlensmlxtend 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 方法具有Xy作為輸入, 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)

我不限於使用mlensmlxten 任何其他構建帶有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

但是,當然,如果您不介意專門將merfensemble一起使用,總有更好的方法。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM