2016-12-26 89 views
8

我正在使用兩個單獨的訓練和測試集建立python中的預測模型。訓練數據包含數字類型的分類變量,例如郵政編碼[91521,23151,12355,...],以及字符串分類變量,例如城市['芝加哥','紐約','洛杉磯' ...]。爲了訓練數據,我首先使用'pd.get_dummies'來獲得這些變量的虛擬變量,然後用變換後的訓練數據擬合模型。在訓練和測試數據中保持相同的虛擬變量

我對測試數據做了相同的轉換,並使用訓練好的模型預測結果。但是,我得到了錯誤'ValueError:模型的特徵數量必須與輸入匹配。模型n_特徵是1487,輸入n_特徵是1345'。原因是測試數據中的虛擬變量較少,因爲它具有較少的「城市」和「郵編」。

我該如何解決這個問題?例如,'OneHotEncoder'將只編碼所有數字類型的分類變量。 'DictVectorizer()'將只編碼所有字符串類型的分類變量。我在網上搜索,看到一些類似的問題,但沒有一個真正解決我的問題。

Handling categorical features using 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

回答

10

假設你有相同功能的火車和測試數據集的名稱。您可以從火車和測試中生成連接的數據集,從連接的數據集中獲取虛擬模型並將其拆分爲訓練和測試。

你可以這樣來做:

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:] 

在結果,你有特點的訓練和測試數據集數目相等。

11

你也可以得到缺少的列,並將其添加到測試數據集:

# 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] 

此代碼還確保測試數據集的類別,但在訓練數據集不存在導致該列將被刪除

1
train2,test2 = train.align(test, join='outer', axis=1, fill_value=0) 

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

相關問題