sklearn中的X_test、X_train、y_test和y_train有什么区别?

18

我正在学习sklearn,但我不太理解使用函数train_test_split()时4个输出的区别和为什么要这么做。

在文档中,我找到了一些例子,但这并不足以消除我的疑惑。

代码是使用X_train来预测X_test还是使用X_train来预测y_test?

训练集和测试集有什么区别?我是使用训练集来预测测试集还是类似的东西吗?

我对此非常困惑。我将在下面提供文档中提供的例子。

>>> import numpy as np  
>>> from sklearn.model_selection import train_test_split  
>>> X, y = np.arange(10).reshape((5, 2)), range(5)  
>>> X
array([[0, 1], 
       [2, 3],  
       [4, 5],  
       [6, 7],  
       [8, 9]])  
>>> list(y)  
[0, 1, 2, 3, 4] 
>>> X_train, X_test, y_train, y_test = train_test_split(  
...     X, y, test_size=0.33, random_state=42)  
...  
>>> X_train  
array([[4, 5], 
       [0, 1],  
       [6, 7]])  
>>> y_train  
[2, 0, 3]  
>>> X_test  
array([[2, 3], 
       [8, 9]])  
>>> y_test  
[1, 4]  
>>> train_test_split(y, shuffle=False)  
[[0, 1, 2], [3, 4]]

3
训练集和测试集的区别是你应该在基础机器学习课程或书籍中学习的内容,这是在使用任何ML库之前必须掌握的概念。 - Dr. Snoopy
1
我已经进行了编辑,因为X_train是一个二维矩阵,而y_train是一个一维数组。 - perpetualstudent
4个回答

36

以下是一个示例 pandas.DataFrame

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report

df = pd.DataFrame({'X1':[100,120,140,200,230,400,500,540,600,625],
                       'X2':[14,15,22,24,23,31,33,35,40,40],
                       'Y':[0,0,0,0,1,1,1,1,1,1]})

这里有三列,X1,X2,Y。假设X1和X2是您的自变量,'Y'列是您的因变量。

X = df[['X1','X2']]
y = df['Y']

使用sklearn.model_selection.train_test_split,您将创建4个数据部分,用于拟合和预测值。

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.4,random_state=42) 

X_train, X_test, y_train, y_test

1). X_train - 包含所有独立变量,这些将用于训练模型。由于我们指定了test_size=0.4,这意味着您的完整数据中的60%将用于训练/拟合模型,剩余的40%将用于测试模型。

2). X_test - 这是数据中剩余的40%的独立变量部分,在训练阶段不会使用,并将用于进行预测以测试模型的准确性。

3). y_train - 这是您需要通过此模型进行预测的依赖变量,其中包括与独立变量相对应的类别标签,在训练/拟合模型时需要指定依赖变量。

4). y_test - 此数据具有您的测试数据的类别标签,这些标签将用于测试实际和预测类别之间的准确性。

现在您可以在此数据上拟合模型,让我们拟合sklearn.linear_model.LogisticRegression

logreg = LogisticRegression()
logreg.fit(X_train, y_train) #This is where the training is taking place
y_pred_logreg = logreg.predict(X_test) #Making predictions to test the model on test data
print('Logistic Regression Train accuracy %s' % logreg.score(X_train, y_train)) #Train accuracy
#Logistic Regression Train accuracy 0.8333333333333334
print('Logistic Regression Test accuracy %s' % accuracy_score(y_pred_logreg, y_test)) #Test accuracy
#Logistic Regression Test accuracy 0.5
print(confusion_matrix(y_test, y_pred_logreg)) #Confusion matrix
print(classification_report(y_test, y_pred_logreg)) #Classification Report

你可以在这里了解有关度量的更多信息。

这里阅读有关数据拆分的更多内容。

希望这可以帮到你:)


13

假设我们有这些数据

Age    Sex       Disease
----  ------ |  ---------
  
  X_train    |   y_train   )
                           )
 5       F   |  A Disease  )
 15      M   |  B Disease  ) 
 23      M   |  B Disease  ) training
 39      M   |  B Disease  ) data
 61      F   |  C Disease  )
 55      M   |  F Disease  )
 76      F   |  D Disease  )
 88      F   |  G Disease  )
-------------|------------
   
  X_test     |    y_test

 63      M   |  C Disease  )
 46      F   |  C Disease  ) test
 28      M   |  B Disease  ) data
 33      F   |  B Disease  )

X_train 包含特征值(年龄和性别 => 训练数据)。

y_train 包含与 X_train 值相对应的目标输出(疾病 => 训练数据)(在训练过程中应找到的值)。

在训练过程中还会生成一些价值(预测值),如果模型成功,这些值应该非常接近或与 y_train 值相同。

X_test 包含要在训练后进行测试的特征值(年龄和性别 => 测试数据)。

y_test 包含与 X_test(年龄和性别 => 训练数据)相对应的目标输出(疾病 => 测试数据),将与模型在训练后给定的 X_test 值的预测值进行比较,以确定模型的成功程度。


2
你的图形化方法很有帮助。感谢您的努力! - Julio Nobre

4
您需要使用训练集来训练分类器/回归器,并使用测试集进行测试/评估。
您的分类器/回归器使用x_train来预测y_pred,并使用y_pred与y_train之间的差异(通过损失函数)进行学习。然后,通过计算x_test的预测值(也可以称为y_pred)和y_test之间的损失来进行评估。请注意保留html标签。

我进行了编辑,因为X_train是一个二维矩阵,而y_train则是一个一维数组。 - perpetualstudent

1

将X视为1000个数据点,Y为整数类标签(每个数据点属于哪个类)

例如:
X = [1.24 2.36 3.24 ... (1000个项目)
Y = [1,0,0,1.....(1000个项目)]

我们按600:400的比例拆分

X_train => 将有600个数据点 X_test => 将有对应于400个数据点的类标签

Y_train => 将有600个数据点 Y_test => 将有对应于400个数据点的类标签


1
X_train和Y_train都有600,而X_test和Y_test都有400,是不是这样? - Samantha Garcia

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