繁体   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