是啥让投票回归者的得分低于其选民的得分?

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]。为了评估这种说法,我只是采用DecisionTreeRegressorSeuqential 模型来解决基于投票方法的回归问题,例如使用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。

以上是关于是啥让投票回归者的得分低于其选民的得分?的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中使用逻辑回归的预测向量的准确度得分

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得分(和其他指标)

机器学习术语表