是啥让投票回归者的得分低于其选民的得分?
Posted
技术标签:
【中文标题】是啥让投票回归者的得分低于其选民的得分?【英文标题】:What does make the score of a voting regressor less than those of its voters?是什么让投票回归者的得分低于其选民的得分? 【发布时间】:2021-08-06 21:59:27 【问题描述】:关于集成学习,我经常听说``在某种意义上更多样化的估计器往往具有更好的集成性能'' [tmrlv's answer]。为了评估这种说法,我只是采用DecisionTreeRegressor
和Seuqential
模型来解决基于投票方法的回归问题,例如使用VotingRegressor
。据我所知,决策树和神经网络是多种估计器,因此我希望我的 Ensemble 模型能够超越这些选民的表现。这是一个简单的测试,说明了其他情况。
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import VotingRegressor
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import mean_squared_error
from sklearn.datasets import fetch_california_housing
import tensorflow as tf
from scikeras.wrappers import KerasRegressor
housing = fetch_california_housing()
seed1 = 7
seed2 = 5
seed3 = 42
X_train_full, X_test, y_train_full, y_test = train_test_split(housing.data, housing.target, random_state=seed1)
X_train, X_valid, y_train, y_valid = train_test_split(X_train_full, y_train_full, random_state=seed2)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_valid = scaler.fit_transform(X_valid)
X_test = scaler.fit_transform(X_test)
def build_dnn_reg():
model = tf.keras.Sequential()
model.add(tf.keras.layers.InputLayer(input_shape=X_train.shape[1:]))
model.add(tf.keras.layers.Dense(24, tf.keras.activations.relu))
model.add(tf.keras.layers.Dense(24, tf.keras.activations.relu))
model.add(tf.keras.layers.Dense(1))
model.compile(loss=tf.keras.losses.mean_squared_error,
optimizer=tf.keras.optimizers.SGD(learning_rate=0.0003),
metrics=[tf.keras.metrics.MSE])
return model
dnn_reg = KerasRegressor(build_dnn_reg)
rnd_reg = DecisionTreeRegressor(max_depth=5,
min_samples_leaf=1,
max_leaf_nodes=9, random_state=seed1)
vot_reg = VotingRegressor(estimators=[("rnd", rnd_reg), ("dnn", dnn_reg)])
rnd_reg.fit(X_train, y_train)
dnn_reg.fit(X_train, y_train, epochs = 90, validation_data=(X_valid, y_valid))
vot_reg.fit(X_train, y_train)
rnd_reg_scr = cross_val_score(estimator=rnd_reg, X=X_valid, y=y_valid, cv=10, n_jobs=-1)
vot_reg_scr = cross_val_score(estimator=vot_reg, X=X_valid, y=y_valid, cv=10, n_jobs=-1)
yhat_rnd_reg = rnd_reg.predict(X_test)
yhat_dnn_reg = dnn_reg.predict(X_test)
yhat_vot_reg = vot_reg.predict(X_test)
print("rnd_reg_mse: 0".format(mean_squared_error(y_test, yhat_rnd_reg)))
print("dnn_reg_mse: 0".format(mean_squared_error(y_test, yhat_dnn_reg)))
print("vot_reg_mse: 0".format(mean_squared_error(y_test, yhat_vot_reg)))
print("rnd_reg_scr: 0".format(vot_reg.score(X_test, y_test)))
print("dnn_reg_scr: 0".format(vot_reg.score(X_test, y_test)))
print("vot_reg_scr: 0".format(vot_reg.score(X_test, y_test)))
特别是,上面的代码报告了以下指标。
rnd_reg_mse: 0.7501101252790635
dnn_reg_mse: 0.45553422440199703
vot_reg_mse: 0.8858773948030302
rnd_reg_scr: 0.4371867731255331
dnn_reg_scr: 0.6582092706826692
vot_reg_scr: 0.3353195772437395
正如人们所观察到的,我的投票分类器的分数低于选民的分数。如何证明这些结果是合理的?
【问题讨论】:
【参考方案1】:这类事情并不能保证,所以我首先要提醒的是,即使有“不同”的选民,你也可能在一个整体中得到更差的表现。
不过,这里的一个特别之处在于,您的投票合奏无法设置您在单独的 keras 回归器中设置的拟合参数。所以在内部,keras 选民只适合一个时代(the default)。在VotingRegressor
中我没有看到一个简单的方法来克服它,但为了比较,您可以看到rnd_reg
在安装默认值时的表现。
【讨论】:
你能解释一下你是怎么知道 ensemble 没有设置 Keras voter 的 fit 方法的参数的吗? 简而言之,这就是 sklearn API 的行为方式:不保留拟合参数。但更具体地说,拆分您的代码并分别运行两个拟合:您会看到,当您拟合投票模型时,没有打印验证分数,只有一个 epoch。以上是关于是啥让投票回归者的得分低于其选民的得分?的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用survival包的coxph函数构建cox回归模型使用ggrisk包的ggrisk函数可视化Cox回归的风险评分图(风险得分图)并解读风险评分图基于LIRI数据集(基因数据集)
R语言使用survival包的coxph函数构建cox回归模型使用ggrisk包的ggrisk函数可视化Cox回归的风险评分图(风险得分图)使用heatmap.genes参数指定需要显示的基因列表
R语言survival包的coxph函数构建cox回归模型ggrisk包的ggrisk函数可视化Cox回归的风险评分图(风险得分图)使用size参数自定义数据点的大小文本字体大小线条粗细等
R语言计算F1评估指标实战:F1 score使用R中caret包中的confusionMatrix()函数为给定的logistic回归模型计算F1得分(和其他指标)