2016-12-26 7 views
8

私は、2つの別々のトレーニングとテストセットを使って、Pythonで予測モデルを構築しています。トレーニングデータには、数値型のカテゴリ変数(例:郵便番号[91521,23151,12355、...])と、市区町村[市区町村[ニューヨーク市]、[ロサンゼルス市] ...]。トレーニングとテストのデータに同じダミー変数を残す

データを訓練するには、まず「pd.get_dummies」を使用してこれらの変数のダミー変数を取得し、モデルに変換されたトレーニングデータをフィットさせます。

私はテストデータで同じ変換を行い、訓練されたモデルを使用して結果を予測します。しかし、エラーが発生しました'ValueError:モデルのフィーチャの数が入力と一致している必要があります。モデルn_featuresは1487であり、入力n_featuresは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は、欠落している列に使用する値を示します。

関連する問題