我是一名机器学习的初学者,目前正在参与泰坦尼克号竞赛。起初,我的模型给出了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文件中。然后你又将训练数据再次分成train
和val
,其中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的原因。你给它提供了测试的答案。)