基于训练数据集的模型,如何预测测试数据?

6

我是一名数据科学和分析的新手。在浏览了Kaggle上很多内核之后,我建立了一个可以预测房产价格的模型。我已经使用我的训练数据对这个模型进行了测试,但现在我想在我的测试数据上运行它。我有一个test.csv文件,我想使用它。我该怎么做? 我之前如何处理我的训练数据集:

#loading my train dataset into python
train = pd.read_csv('/Users/sohaib/Downloads/test.csv')

#factors that will predict the price
train_pr = ['OverallQual','GrLivArea','GarageCars','TotalBsmtSF','FullBath','YearBuilt']

#set my model to DecisionTree
model = DecisionTreeRegressor()

#set prediction data to factors that will predict, and set target to SalePrice
prdata = train[train_pr]
target = train.SalePrice

#fitting model with prediction data and telling it my target
model.fit(prdata, target)

model.predict(prdata.head())

现在我尝试的是,复制整个代码,并将"train"改为"test","predate"改为"testprdata",我以为这样就可以了,但很遗憾没有成功。我知道我做错了什么,但不知道具体是哪里出了问题。


请添加您尝试的测试数据的代码,包括您收到的完整错误信息。 - Miriam Farber
2个回答

4
只要您以完全相同的方式处理训练和测试数据,predict函数即可对任何数据集起作用。因此,您需要加载训练集和测试集,使用训练集进行fit操作,然后使用测试集或训练集和测试集一起进行predict操作。
此外,请注意,您正在读取的文件是test数据。假设您的文件命名正确,即使您将变量命名为train,您当前也正在对测试数据进行训练。
#loading my train dataset into python
train = pd.read_csv('/Users/sohaib/Downloads/train.csv')
test = pd.read_csv('/Users/sohaib/Downloads/test.csv')

#factors that will predict the price
desired_factors = ['OverallQual','GrLivArea','GarageCars','TotalBsmtSF','FullBath','YearBuilt']

#set my model to DecisionTree
model = DecisionTreeRegressor()

#set prediction data to factors that will predict, and set target to SalePrice
train_data = train[desired_factors]
test_data = test[desired_factors]
target = train.SalePrice

#fitting model with prediction data and telling it my target
model.fit(train_data, target)

model.predict(test_data.head())

完美地工作了。 我得到的答案是以数组形式呈现的,我能否将其作为数据集中的新字段输入?就像添加一个新列并将数组添加到其中一样? - Sohaib Asim Syed
你需要将模型的预测结果与test.SalePrice进行比较。假设你正在使用http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeRegressor.html#sklearn.tree.DecisionTreeRegressor.predict,我认为你应该得到一个1xN(N是测试集长度)的矩阵(即向量),其中`model.predict`的第i个结果对应于输入数据中第i行,对应于目标值(`test.SalePrice`)中的第i个值。不确定如何在给定数据结构的情况下最理想地实现这一点。 - TheGrimmScientist
我会这样做: actuals = model.predict(test_data) <new line>for target, actual in zip(test.SalePrice, actuals): <new line> print(target == actual) 但是在循环内部加入一些有意义的成功和失败的累积。 - TheGrimmScientist

1

您已经在使用训练好的模型进行预测 (model.predict(prdata.head()))。如果您想要使用该模型对其他测试数据进行预测,只需提供其他测试数据即可,而不是 prdata.head()。例如,您可以使用该模型对 prdata 中的所有样本进行预测,只需删除限制 DataFrame 为前 5 行的 .head() 即可(但您刚刚使用这些数据来训练模型,这只是一个例子)。

请记住,您仍然需要一个模型来进行预测。通常,您会训练一个模型,然后将其提供给测试数据。更改所有引用 train 的地方为 test 是行不通的,因为除非您已经从训练中保存并恢复了模型,否则您将没有一个用于基于测试数据进行预测的模型。

在您的代码中,实际上使用了您的 test.csv 数据文件来 训练 模型,因为您将数据传递给了 model.fit 方法。通常情况下,您不会使用旨在进行测试的数据来训练模型。


哦,是的。我简直不敢相信自己有多么愚蠢,竟然在测试数据上调用了model.fit()。现在我只需要使用model.predict(test.head())就可以了,这样它就可以正常工作了。但是当我使用model.predict(test)时似乎无法正常工作,会出现错误,但是使用head时却没有问题。 - Sohaib Asim Syed
你在呈现给模型之前是否只包含了相同的列? - tdube
是的,除了SalePrice之外,它是我的目标变量。 - Sohaib Asim Syed
请提供更多上下文以帮助解决错误(例如,发布代码/错误)。 - tdube

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