如何使用测试数据对抗训练模型?

我是一名机器学习的初学者,目前正在参与泰坦尼克号竞赛。起初,我的模型给出了1.0的准确率,这看起来好得令人难以置信。后来我意识到,我是用训练模型时所用的训练数据来比较我的模型,而我的测试数据却无处可寻。这就是为什么我认为它会给我这样一个荒谬的数字。

以下是我的代码:

import ...train_path = "C:\\Users\\Omar\\Downloads\\Titanic Data\\train.csv"test_path = "C:\\Users\\Omar\\Downloads\\Titanic Data\\test.csv"train_data = pd.read_csv(train_path)test_data = pd.read_csv(test_path)train_data['Sex'] = pd.factorize(train_data.Sex)[0]columns_of_interest = ['Survived','Pclass', 'Sex', 'Age']filtered_titanic_data = train_data.dropna(axis=0)x = filtered_titanic_data[columns_of_interest]y = filtered_titanic_data.Survivedtrain_x, val_x, train_y, val_y = train_test_split(x, y, random_state=0)titanic_model = DecisionTreeRegressor()titanic_model.fit(train_x, train_y)val_predictions = titanic_model.predict(val_x)print(val_predictions)print(accuracy_score(val_y, val_predictions))

我知道val_predictions需要与我的测试数据有关,但我不知道如何实现这一点。


回答:

train_test_split()的目的是将你的数据集分成两部分,训练集和测试集。在你的情况下,你已经将数据分成了两个部分,分别存储在不同的csv文件中。然后你又将训练数据再次分成trainval,其中val是验证(本质上是测试或验证数据)的缩写。

你可能希望对整个训练数据集进行model.fit操作,然后对测试集调用model.predict。没有必要调用train_test_split()


编辑:

我可能在这里错了。在查看竞赛页面后,我意识到测试集不包括真实值。你不能用这些数据来验证模型的准确性。在这种情况下,我认为将原始训练数据集分成训练和验证集是有意义的。因为你只在训练部分上拟合模型,所以验证集对模型来说仍然是未见的。然后你可以使用验证集中的已知值来验证模型的预测结果。

测试集将仅用于生成“新”的预测,因为你没有真实值来验证。


编辑(回应评论):

我没有这些数据集,也没有实际运行过这段代码,但我建议像下面这样做。基本上,你希望对测试数据进行与训练数据相同的准备,然后以与验证集相同的方式将其输入到模型中。

import ...def get_dataset(path):    data = pd.read_csv(path)    data['Sex'] = pd.factorize(data.Sex)[0]    filtered_titanic_data = data.dropna(axis=0)    return filtered_titanic_datatrain_path = "C:\\Users\\Omar\\Downloads\\Titanic Data\\train.csv"test_path = "C:\\Users\\Omar\\Downloads\\Titanic Data\\test.csv"train_data = get_dataset(train_path)test_data = get_dataset(test_path)columns_of_interest = ['Pclass', 'Sex', 'Age']x = train_data[columns_of_interest]y = train_data.Survivedtrain_x, val_x, train_y, val_y = train_test_split(x, y, random_state=0)titanic_model = DecisionTreeRegressor()titanic_model.fit(train_x, train_y)val_predictions = titanic_model.predict(val_x)print(val_predictions)print(accuracy_score(val_y, val_predictions))text_x = test_data[columns_of_interest]test_predictions = titanic_model.predict(test_x)

(另外,请注意我从columns_of_interest中移除了Survived列。我认为通过在你的x数据中包含该列,你给模型提供了它试图预测的值,这可能是你验证时也得到1.0的原因。你给它提供了测试的答案。)

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注