[英]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.