【问题标题】:Split X into test/train before pre-processing and dimension reduction or after? Machine Learning在预处理和降维之前或之后将 X 拆分为测试/训练?机器学习
【发布时间】:2018-01-20 05:59:34
【问题描述】:

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

在为机器学习创建SVC 模型时,我们鼓励在执行preprocessing 之前使用sci-kit learn 中的train_test_split 将数据集X 拆分为testtrain 集。 scalingdimension reduction 例如PCA/Isomap。我在下面包含了一个代码示例,它是我使用这种处理方式为给定问题编写的解决方案的一部分。

但是,在将 X 拆分为 testtrain 之前,在 X 上使用 preprocessPCA/IsoMap 似乎要快得多,并且 accuracy 得分更高。

我的问题是:

1) 为什么我们不能切出标签 (y) 并对所有 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

【问题讨论】:

    标签: python machine-learning scikit-learn svm dimensionality-reduction


    【解决方案1】:

    关于

    1) 是否有我们不能切出标签 (y) 并执行的原因 拆分前对所有 X 进行预处理和降维 出去测试和训练?

    原因是您应该在训练数据上训练您的模型,而不使用有关测试数据的任何信息。如果您在训练模型之前对整个数据(包括测试数据)应用 PCA,那么您实际上使用了来自测试数据的一些信息。因此,您无法使用测试数据真正判断模型的行为,因为它不再是看不见的数据。

    关于:

    2) 预处理和维度得分更高 减少所有 X(减去 y)而不是拆分 X 然后 进行预处理和降维。为什么会这样?

    这完全有道理。您使用了测试数据中的一些信息来训练模型,因此测试数据上的分数会更高是有道理的。然而,这个分数并不能真正给出模型在未见数据上的行为的估计。

    【讨论】:

      猜你喜欢
      • 2020-01-01
      • 2019-06-14
      • 2020-11-01
      • 2021-05-13
      • 2016-12-03
      • 1970-01-01
      • 2020-06-15
      • 1970-01-01
      • 2015-10-09
      相关资源
      最近更新 更多