使用for循环交叉验证模型时,请查看各折的得分

时间:2019-03-29 16:00:19

标签: python pandas for-loop cross-validation

我想查看每个拟合模型的个体得分,以可视化交叉验证的强度(我这样做是为了向我的同事们展示交叉验证为何重要的原因。

我有一个.csv文件,其中包含500行,200个独立变量和1个二进制目标。我定义了skf使用StratifiedKFold将数据折叠5次。

我的代码如下:

X = data.iloc[0:500, 2:202]
y = data["target"]
skf = StratifiedKFold(n_splits = 5, random_state = 0)
clf = svm.SVC(kernel = "linear")
Scores = [0] * 5
for i, j in skf.split(X, y):
    X_train, y_train = X.iloc[i], y.iloc[i]
    X_test, y_test = X.iloc[j], y.iloc[j]
    clf.fit(X_train, y_train)
    clf.score(X_test, y_test)

如您所见,我为Scores分配了5个零的列表。我想将5个预测中的每个预测的clf.score(X_test, y_test)分配给列表。但是,索引ij不是{1、2、3、4、5}。相反,它们是用于折叠Xy数据帧的行号。

如何在此循环内将每个k拟合模型的测试分数分配到Scores中?我需要一个单独的索引吗?

我知道使用cross_val_score确实可以完成所有这些工作,并为您提供k得分的几何平均值。但是,我想向我的同事展示sklearn库中提供的交叉验证功能背后的情况。

谢谢!

1 个答案:

答案 0 :(得分:1)

如果我理解了这个问题,并且您不需要对分数进行任何特殊索引:

from sklearn.model_selection import StratifiedKFold
from sklearn.svm import SVC

X = np.random.normal(size = (500, 200))
y = np.random.randint(low = 0, high=2, size=500)
skf = StratifiedKFold(n_splits = 5, random_state = 0)
clf = SVC(kernel = "linear")
Scores = []
for i, j in skf.split(X, y):
    X_train, y_train = X[i], y[i]
    X_test, y_test = X[j], y[j]
    clf.fit(X_train, y_train)
    Scores.append(clf.score(X_test, y_test))

结果是:

>>>Scores
[0.5247524752475248, 0.53, 0.5, 0.51, 0.4444444444444444]