如何针对训练好的模型使用测试数据?

Posted

技术标签:

【中文标题】如何针对训练好的模型使用测试数据?【英文标题】:How to use the test data against the trained model? 【发布时间】:2018-12-29 07:49:26 【问题描述】:

我是机器学习的初学者,我正在参加泰坦尼克号比赛。起初,我的模型给了我 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.Survived

train_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 需要与我的测试数据有关,但我不确定如何实现。

【问题讨论】:

比赛排行榜有 25 人在 50% 的测试数据上获得 1.0 分。你确定1.0的分数不合理吗?也许数据和模型非常吻合,您实际上会得到准确的预测。 关于训练、验证和测试数据集的信息:towardsdatascience.com/… 【参考方案1】:

train_test_split() 旨在获取您的数据集并将其分成两个块,即训练集和测试集。在您的情况下,您已经将数据分成两个块,在单独的 csv 文件中。然后,您将获取训练数据并将其再次拆分为 trainval,它们是验证的缩写(本质上是测试或验证数据)。

您可能希望对完整的训练数据集执行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_data

train_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.Survived

train_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 的验证。您正在给它测试答案。)

【讨论】:

如何使用测试集生成新的预测? 因为目标是预测测试集的值。 为什么是在测试预测之前打印? 打印仍然只是打印验证结果(val_predictions)。您可以为 test_predictions 添加相同的内容 验证与测试是分开的。验证是您获得答案的地方,并且可以检查模型的运行情况。测试集不包括答案,所以你只是得到预测,但不知道它有多准确。这就像模型的“现实生活”使用

以上是关于如何针对训练好的模型使用测试数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何实现java上传图片并用python训练好的模型来测试呢

Caffe:如何使用已经训练好的模型一次检查多个数据集的准确性?

TensorFlow 同时调用多个预训练好的模型

机器学习数据集划分-训练集,验证集,测试集

5:使用caffe对自己的图像数据进行训练并测试

5:使用caffe对自己的图像数据进行训练并测试