当前位置: 首页 > 知识库问答 >
问题:

在训练和测试数据中保持相同的虚拟变量

沈宇定
2023-03-14

我正在用python构建一个预测模型,其中包含两个独立的训练集和测试集。培训数据包含数字类型分类变量,例如邮政编码[915212315112355,…],以及字符串分类变量,例如,城市[‘芝加哥’、‘纽约’、‘洛杉矶’、…]。

为了训练数据,我首先使用“pd”。获取_dummies'以获取这些变量的虚拟变量,然后用转换后的训练数据拟合模型。

我对测试数据进行同样的转换,并使用经过训练的模型预测结果。然而,我得到了错误

ValueError: Number of features of the model must  match the input. Model n_features is 1487 and  input n_features is 1345

原因是测试数据中的虚拟变量较少,因为它的“城市”和“zipcode”较少。

我怎样才能解决这个问题?例如,“OneHotEncoder”将只对所有数字类型的分类变量进行编码DictVectorizer()将只对所有字符串类型的分类变量进行编码。我在网上搜索,看到了一些类似的问题,但没有一个真正解决了我的问题。

使用Scikit学习处理分类特征

https://www.quora.com/If-the-training-dataset-has-more-variables-than-the-test-dataset-what-does-one-do

https://www.quora.com/What-is-the-best-way-to-do-a-binary-one-hot-one-of-K-coding-in-Python

共有3个答案

贺浩漫
2023-03-14
train2,test2 = train.align(test, join='outer', axis=1, fill_value=0)

train2和test2具有相同的列。Fill_value指示用于缺失列的值。

费凯康
2023-03-14

假设在训练和测试数据集中有相同的功能名称。您可以从训练和测试中生成串联数据集,从串联数据集中获取假人,并将其拆分为训练和测试。

您可以这样做:

import pandas as pd
train = pd.DataFrame(data = [['a', 123, 'ab'], ['b', 234, 'bc']],
                     columns=['col1', 'col2', 'col3'])
test = pd.DataFrame(data = [['c', 345, 'ab'], ['b', 456, 'ab']],
                     columns=['col1', 'col2', 'col3'])
train_objs_num = len(train)
dataset = pd.concat(objs=[train, test], axis=0)
dataset_preprocessed = pd.get_dummies(dataset)
train_preprocessed = dataset_preprocessed[:train_objs_num]
test_preprocessed = dataset_preprocessed[train_objs_num:]

结果,您的训练数据集和测试数据集具有相同数量的特征。

凌长恨
2023-03-14

您也可以只获取缺失的列并将其添加到测试数据集:

# Get missing columns in the training test
missing_cols = set( train.columns ) - set( test.columns )
# Add a missing column in test set with default value equal to 0
for c in missing_cols:
    test[c] = 0
# Ensure the order of column in the test set is in the same order than in train set
test = test[train.columns]

此代码还确保从测试数据集中的类别中产生但在训练数据集中不存在的列将被删除

 类似资料:
  • 为了评估我们的监督模型的泛化能力,我们可以将数据分成训练和测试集: from sklearn.datasets import load_iris iris = load_iris() X, y = iris.data, iris.target 考虑如何正常执行机器学习,训练/测试分割的想法是有道理的。真实世界系统根据他们拥有的数据进行训练,当其他数据进入时(来自客户,传感器或其他来源),经过训

  • 问题内容: 我像这样使用scikit-learn的SVM: 我的问题是,当我使用分类器预测训练集成员的班级时,即使在scikit- learns实现中,分类器也可能是错误的。(例如) 问题答案: 是的,可以运行以下代码,例如: 分数是0.61,因此将近40%的训练数据被错误分类。部分原因是,即使默认内核是(理论上也应该能够对任何训练数据集进行完美分类,只要您没有两个带有不同标签的相同训练点),也可

  • 我正试图用汽车预测时间序列。阿里玛。我需要的是分割训练和测试数据,以查看模型指标。我的日期范围是2016年12月至2020年1月。我需要2018年12月之前的列车数据,以及之后的测试。 除此之外,我还需要每个id的指标RMSE和MSE。这是我的数据的一个例子: 我尝试使用dplyr: 但我不知道如何添加训练和测试的步骤以及指标。有人知道怎么解决吗?谢谢

  • 本文向大家介绍python 划分数据集为训练集和测试集的方法,包括了python 划分数据集为训练集和测试集的方法的使用技巧和注意事项,需要的朋友参考一下 sklearn的cross_validation包中含有将数据集按照一定的比例,随机划分为训练集和测试集的函数train_test_split 得到的x_train,y_train(x_test,y_test)的index对应的是x,y中被抽取

  • 问题内容: 我有一个很大的数据集,想将其分为训练(50%)和测试集(50%)。 假设我有100个示例存储了输入文件,每一行包含一个示例。我需要选择50条线作为训练集和50条线测试集。 我的想法是首先生成一个长度为100(值范围从1到100)的随机列表,然后将前50个元素用作50个训练示例的行号。与测试集相同。 这可以在Matlab中轻松实现 但是如何在Python中完成此功能?我是Python的新

  • 问题内容: 因此,我对此有疑问,一直在寻找答案。所以问题是我何时使用 这之后,我将训练和测试模型(,作为特征,如标签),并得到一些准确度得分。现在我的疑问是,当我必须预测新数据集的标签时会发生什么。说, 因为当我规范化列时,和的值将根据新数据而不是将在其上训练模型的数据来更改。因此,现在将是下面的数据准备步骤之后的数据。 的价值和将关于改变和价值。的数据准备是关于的。 有关不同数字的数据准备如何有