在进行预处理和降维之前还是之后将X分割为测试/训练集?机器学习

4

我一直在完成微软的DAT210X-使用Python进行数据科学编程课程。

在创建用于机器学习的SVC模型时,我们被鼓励将数据集X拆分为测试和训练集,并在执行预处理(例如缩放)和降维(例如PCA / Isomap)之前使用sci-kit learn中的train_test_split。下面是我写的解决方案的部分代码示例。

然而,似乎在将X拆分为测试和训练集之前对X进行预处理和PCA / IsoMap更快,并且得分更高。

我的问题是:

1)为什么我们不能切出标签(y),并在将X拆分为测试和训练集之前对所有X进行预处理和降维?

2)对于所有X(减去y),预处理和降维得分比拆分X然后进行预处理和降维要高。这可能是为什么?

X_train, X_test, y_train, y_test = train_test_split(X, y,test_size=0.30, random_state=7)

step_c = .05
endpt_c = 2 + step_c
startpt_c = .05

step_g = .001
endpt_g = .1 + step_g
startpt_g = .001

bestscore = 0.0
best_i = 0.0
best_j = 0.0

pre_proc = [
        preprocessing.Normalizer(),
        preprocessing.MaxAbsScaler(),
        preprocessing.MinMaxScaler(),
        preprocessing.KernelCenterer(), 
        preprocessing.StandardScaler()
       ]
best_proc = ''
best_score = 0

print('running......')

# pre-processing (scaling etc)
for T in pre_proc: 
    X_train_T = T.fit_transform(X_train) 
    X_test_T =  T.transform(X_test) # only apply transform to X_test!

    # dimensionality reduction
    for k in range(2, 6):
        for l in range(4, 7):
            iso = Isomap(n_neighbors = k, n_components = l)
            X_train_iso = iso.fit_transform(X_train_T)
            X_test_iso = iso.transform(X_test_T)

            # SVC parameter sweeping
            for i in np.arange(startpt_c,endpt_c, step_c):
                # print(i)
                for j in np.arange(startpt_g,endpt_g, step_g):

                    clf = SVC(C=i, gamma=j , kernel='rbf'
                    # max_iter=-1, probability=False, random_state=None,   shrinking=True, tol=0.001, verbose=False)
                )
                    clf.fit(X_train_iso, y_train) 
                    score = clf.score(X_test_iso, y_test)

                    if bestscore < score:
                        bestscore = score
                        best_c = i
                        best_g = j
                        best_proc = T
                        best_n_neighbors = k
                        best_n_components = l

# Print final variables that gave best score:
print('proc: ' + str(T), 'score:' + str(bestscore), 'C: ' + str(i), 'g: ' + str(j), 'n_neigh: ' + str(k), 'n_comp: ' + str(l))enter code here
1个回答

9

关于:

1) 为什么我们不能在分离出测试和训练集之前切片取出标签(y),然后对所有的X进行预处理和降维呢?

原因是你应该在训练数据上训练模型,而不使用任何有关测试数据的信息。如果在训练模型之前在整个数据集(包括测试数据)上进行PCA,则实际上使用了来自测试数据的一些信息。因此,您无法真正使用测试数据评估模型的行为,因为它不再是未知数据。

关于:

2) 对于所有的X(除去y)进行预处理和降维得到的分数比分离X然后进行预处理和降维得到的分数高。这是为什么呢?

这是完全合理的。您使用了来自测试数据的一些信息来训练模型,因此测试数据上的得分更高是有意义的。但是,这个得分不再给出模型在未知数据上的表现的估计。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接