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

nim*_*ing 30 python prediction dataframe scikit-learn dummy-variable

我正在使用两个单独的培训和测试集在python中构建预测模型.训练数据包含数字类型分类变量,例如邮政编码,[91521,23151,12355,...],以及字符串分类变量,例如,城市['芝加哥','纽约','洛杉矶', ...].

为了训练数据,我首先使用'pd.get_dummies'来获取这些变量的虚拟变量,然后使用转换的训练数据拟合模型.

我对测试数据进行相同的转换,并使用训练模型预测结果.但是,我收到错误'ValueError:模型的功能数必须与输入匹配.模型n_features为1487,输入n_features为1345'.原因是测试数据中的虚拟变量较少,因为它具有较少的"城市"和"邮政编码".

我怎么解决这个问题?例如,'OneHotEncoder'将仅编码所有数字类型的分类变量.'DictVectorizer()'只会编码所有字符串类型的分类变量.我在线搜索并看到一些类似的问题,但没有一个真正解决我的问题.

使用scikit-learn处理分类功能

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

Thi*_*ent 50

您还可以获取缺少的列并将其添加到测试数据集中:

# 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]
Run Code Online (Sandbox Code Playgroud)

此代码还确保将删除测试数据集中的类别但未显示在训练数据集中的列

  • 如果训练是使用获取虚拟变量完成的,并且保存了模型,则稍后我们加载模型和新的测试数据(仅一条记录),这时如何根据其值在测试数据中获取新的列名 (3认同)
  • 除了最后一行,您还可以使用`train,test = train.align(test,axis = 1)` (2认同)

Edu*_*sov 23

假设您在train和test数据集中具有相同的功能名称.您可以从火车和测试生成连锁数据集,从连锁数据集中获取虚拟对象并将其拆分为训练和测试.

你可以这样做:

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:]
Run Code Online (Sandbox Code Playgroud)

结果,您具有相同数量的训练和测试数据集的功能.

  • 那看不见的测试数据呢?连接并重新训练模型?似乎不是一个可行的选择 (5认同)

use*_*030 11

train2,test2 = train.align(test, join='outer', axis=1, fill_value=0)
Run Code Online (Sandbox Code Playgroud)

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


dem*_*lem 6

我过去在火车和测试集上运行 get_dummies 后遇到过这个

X_test = X_test.reindex(columns = X_train.columns, fill_value=0)
Run Code Online (Sandbox Code Playgroud)

显然,针对个别情况进行了一些调整。但是,它会丢弃测试集中的新值,并填充测试中缺失的值,在本例中全部为零。