当前位置: 首页 > 面试题库 >

scikit学习中的交叉验证指标用于每个数据拆分

卫焕
2023-03-14
问题内容

我需要为(X_test,y_test)数据的每个拆分显式获取交叉验证统计信息。

因此,我尝试这样做:

kf = KFold(n_splits=n_splits)

X_train_tmp = []
y_train_tmp = []
X_test_tmp = []
y_test_tmp = []
mae_train_cv_list = []
mae_test_cv_list = []

for train_index, test_index in kf.split(X_train):

    for i in range(len(train_index)):
        X_train_tmp.append(X_train[train_index[i]])
        y_train_tmp.append(y_train[train_index[i]])

    for i in range(len(test_index)):
        X_test_tmp.append(X_train[test_index[i]])
        y_test_tmp.append(y_train[test_index[i]])

    model.fit(X_train_tmp, y_train_tmp) # FIT the model = SVR, NN, etc.

    mae_train_cv_list.append( mean_absolute_error(y_train_tmp, model.predict(X_train_tmp)) # MAE of the train part of the KFold.

    mae_test_cv_list.append( mean_absolute_error(y_test_tmp, model.predict(X_test_tmp)) ) # MAE of the test part of the KFold.

    X_train_tmp = []
    y_train_tmp = []
    X_test_tmp = []
    y_test_tmp = []

是否是通过使用例如KFold来获得每个交叉验证拆分的平均绝对误差(MAE)的正确方法?


问题答案:

您的方法存在一些问题。

首先,您当然不必在培训和验证列表(即您的2个内部循环)中 一个接一个地手动 添加数据for。简单的索引就可以完成工作。

此外,我们通常从不计算和报告训练CV折叠的错误-仅验证折叠的错误。

请记住这些,并将术语切换为“验证”而不是“测试”,这是一个使用波士顿数据的可复制示例,应直接进行调整以适应您的情况:

from sklearn.model_selection import KFold
from sklearn.datasets import load_boston
from sklearn.metrics import mean_absolute_error
from sklearn.tree import DecisionTreeRegressor

X, y = load_boston(return_X_y=True)
n_splits = 5
kf = KFold(n_splits=n_splits, shuffle=True)
model = DecisionTreeRegressor(criterion='mae')

cv_mae = []

for train_index, val_index in kf.split(X):
    model.fit(X[train_index], y[train_index])
    pred = model.predict(X[val_index])
    err = mean_absolute_error(y[val_index], pred)
    cv_mae.append(err)

之后,您cv_mae应该是这样的(由于简历的随机性质,细节会有所不同):

[3.5294117647058827,
 3.3039603960396042,
 3.5306930693069307,
 2.6910891089108913,
 3.0663366336633664]

当然,所有这些显式的东西并不是真正必需的。您可以使用轻松得多cross_val_score。不过有一个小问题:

from sklearn.model_selection import cross_val_score
cv_mae2 =cross_val_score(model, X, y, cv=n_splits, scoring="neg_mean_absolute_error")
cv_mae2
# result
array([-2.94019608, -3.71980198, -4.92673267, -4.5990099 , -4.22574257])

除了不是真正的问题的负号之外,您还会注意到结果的方差看起来比cv_mae上面的要大得多;原因是我们没有对数据进行 洗牌
。不幸的是,cross_val_score没有提供改组选项,因此我们必须使用手动进行shuffle。因此,我们的最终代码应为:

from sklearn.model_selection import cross_val_score
from sklearn.utils import shuffle
X_s, y_s =shuffle(X, y)
cv_mae3 =cross_val_score(model, X_s, y_s, cv=n_splits, scoring="neg_mean_absolute_error")
cv_mae3
# result:
array([-3.24117647, -3.57029703, -3.10891089, -3.45940594, -2.78316832])

褶皱之间的差异明显较小,并且更接近我们的初始cv_mae



 类似资料:
  • 问题内容: 我想使用scikit-learn的GridSearchCV来确定随机森林模型的一些超级参数。我的数据是时间相关的,看起来像 如何实现以下交叉验证折叠技术? 也就是说,我想使用2年的历史观测值来训练模型,然后在接下来的一年中测试其准确性。 问题答案: 您只需要将拆分的可迭代对象传递给GridSearchCV。此拆分应采用以下格式: 要获取idx,您可以执行以下操作: 看起来像这样: 然后

  • 根据scikit-learn的文档 你觉得呢?

  • 问题内容: 是否可以在没有交叉验证的情况下使用GridSearchCV?我正在尝试通过网格搜索优化KMeans聚类中的聚类数量,因此我不需要或想要交叉验证。 该文档也使我感到困惑,因为在fit()方法下,它有一个用于非监督学习的选项(例如,将None用于非监督学习)。但是,如果您想进行无监督学习,则需要在没有交叉验证的情况下进行学习,而且似乎没有摆脱交叉验证的选择。 问题答案: 经过大量搜索,我能

  • 本文向大家介绍scikit-learn 使用交叉验证训练分类器,包括了scikit-learn 使用交叉验证训练分类器的使用技巧和注意事项,需要的朋友参考一下 示例 使用虹膜数据集: 数据分为训练集和测试集。要做到这一点,我们使用train_test_split效用函数来分割双方X和y(数据和目标矢量)用随机选择train_size=0.75(训练集包含数据的75%)。 训练数据集被输入到k最近邻

  • 问题内容: 我想通过交叉验证从Logistic回归模型预测概率。我知道您可以获取交叉验证分数,但是可以从predict_proba返回值而不是分数吗? 问题答案: 现在,这已作为scikit- learn版本0.18的一部分实现。您可以将’method’字符串参数传递给cross_val_predict方法。文档在这里。 例: 还要注意,这是新的sklearn.model_selection包的一

  • 1)在我读过的大多数机器学习入门页面中,似乎都在说你需要一个训练集、一个验证集和一个测试集。根据我的理解,交叉验证允许你结合训练和验证集来训练模型,然后你应该在测试集上测试它以得到一个分数。然而,我在论文中看到,在很多情况下,您可以在整个数据集上交叉验证,然后报告CV得分作为准确性。我知道在一个理想的世界里,你会想要在不同的数据上进行测试,但如果这是合法的,我想要在我的整个数据集上交叉验证并报告那