拆分scikit的测试/培训数据?

时间:2020-09-23 06:02:29

标签: python machine-learning scikit-learn

给了我一些入门代码,但是我不确定在调用train_test_split时如何将其拆分(我被明确告知要使用)。本质上,当我已经获得X_train,Y_train和X_test拆分时,它在哪里起作用?

入门代码如下:

train_df = pd.read_csv('./train_preprocessed.csv')
test_df = pd.read_csv('./test_preprocessed.csv')
X_train = train_df.drop("Survived",axis=1)
Y_train = train_df["Survived"]
X_test = test_df.drop("PassengerId",axis=1).copy()
print(train_df[train_df.isnull().any(axis=1)])

##SVM
svc = SVC()
svc.fit(X_train, Y_train)
Y_pred = svc.predict(X_test)
acc_svc = round(svc.score(X_train, Y_train) * 100, 2)
print("svm accuracy is:", acc_svc)

但是,我需要将acc_svc变量更改为使用X_test和Y_test。 X_test是给我们的,但是我该如何提出Y_test?我知道Y_test应该与标签相对应,并且在尝试这样做时会出现一些大小不匹配的情况。应该是一个简单的问题,有人介意向我指出正确的方向吗?

2 个答案:

答案 0 :(得分:0)

不应使用test_preprocessed.csv来检查模型性能。使用scikit-learn中的train_test_split()将train_df拆分为训练和验证数据集。您必须在验证数据集上检查模型性能,即验证y。请参阅:scikit-learn documentation

答案 1 :(得分:0)

  • 首先,您必须了解并阐明目标变量。您的“ Y_test ”似乎是您已经存在的“ Y_pred”变量,它似乎与“ Survived”标签(在您的测试集中)相对应。但是,尽管您将其从“ X_train”中删除以便可以将其用作目标,但在“ Y_train”中似乎并没有做同样的事情,而是在其中删除了“ PassengerId”。

  • 这里的另一个基本概念是,您的数据集已经被分成训练测试子集(您的CSV文件)。我假设您的测试集的列比火车集少了一列,并且应该是火车CSV文件的“ Survived”变量作为延续。否则,应删除它以避免不匹配,并将其保留为测试目标变量。您不必提出“ Y_test” ,等式“ Y_pred = svc.predict(X_test)” 的结果将为您提供“ Y_test”这是“ Y_pred”的结果。

  • 大小不匹配的一个可能原因是训练集中的列数(x轴)与测试集中的列数不相等。

  • 如果要拆分为train/test subsets based on Scikit-learn,则应首先合并CSV文件,然后在合并的数据集中进行数据分析,最后进行拆分。跟踪这些更改并保持相同的原始大小的一种方法是保持键值对源自于火车测试合并。一种实现方法是通过使用参数“ keys” pandas.concat

结合上述内容,一个推荐的简单解决方案可能是:

# reading csv files
train_df = pd.read_csv('./train_preprocessed.csv')
test_df = pd.read_csv('./test_preprocessed.csv')

# merge train and test sets
merged_data = pd.concat([train_df, test_df], keys=[0,1])

# data preprocessing can take place in the below assigned variable
# here also you could do feature engineering etc.
# e.g. check null values for all dataset
print(merged_data[merged_data.isnull().any(axis=1)])

# now you can eject the train and test sets, using the key-value pairs from the train-test merge
X_train = merged_data.xs(0)
X_test = merged_data.xs(1)

# setting up predictors - target
X= X_train.loc[:, X_train.columns!="Survived"]
y= X_train.loc[:, "Survived"]

# train-test split
# If train_size is None, it will be set to 0.25 based on the documentation
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)

##SVM
svc = SVC()
svc.fit(X_train, y_train)
y_pred = svc.predict(X_test)
acc_svc = round(svc.score(X_train, y_train) * 100, 2)
print("svm accuracy is:", acc_svc)

我认为,在理解了以上内容之后,您可以使用cross_val_score函数(以@SunilG提及的方式)进一步估计和比较模型的性能。例如3倍(CV = 3)交叉验证,您可以:

from sklearn.model_selection import cross_val_score
cross_val_score(svc, X_train, y_train.values, cv=3, scoring='accuracy')

如果您不想继续上述操作,并且想要接近入门代码,则应该删除第5行代码,我想它会运行(如果测试集不包含目标变量) ,否则请将其删除)。但是,在这种情况下,您将无法拆分自己的火车测试,因为它已经被拆分,因此,主要问题/帖子的标题应该更改。

相关问题