web-dev-qa-db-ja.com

トレーニングデータとテストデータで同じダミー変数を保持する

pythonで2つの個別のトレーニングセットとテストセットを使用して予測モデルを構築しています。トレーニングデータには、Zip code、[91521,23151,12355、...]などの数値型カテゴリ変数が含まれています。 、また、都市['Chicago'、 'New York'、 'Los Angeles'、...]などの文字列カテゴリ変数。

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

テストデータに対して同じ変換を行い、トレーニングされたモデルを使用して結果を予測します。ただし、エラーが発生しました 'ValueError:モデルの機能の数は入力と一致する必要があります。モデルn_featuresは1487、入力n_featuresは1345 'です。理由は、「city」と「zipcode」が少ないため、テストデータのダミー変数が少ないためです。

この問題を解決するにはどうすればよいですか?たとえば、「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

28
nimning

不足している列を取得して、テストデータセットに追加することもできます。

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

また、このコードは、テストデータセットのカテゴリに起因するがトレーニングデータセットに存在しない列が削除されることを保証します

43

トレインデータセットとテストデータセットに同じフィーチャの名前があると仮定します。トレーニングとテストから連結されたデータセットを生成し、連結されたデータセットからダミーを取得し、それを分割してトレーニングとテストバックを行うことができます。

次の方法で実行できます。

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

その結果、トレーニングデータセットとテストデータセットのフィーチャの数が等しくなります。

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

train2とtest2の列は同じです。 Fill_valueは、欠落している列に使用する値を示します。

8
user1482030

これはかなり古い質問ですが、scikit Learn APIを使用する場合は、次のDummyEncoderクラスを使用できます: https://Gist.github.com/psinger/ef4592492dc8edf101130f0bf32f5ff9

ここで説明するように、dtypeカテゴリを使用して作成するダミーを指定します: パイプラインでダミーを作成し、列車とテストセットの異なるレベルで作成します

1
fsociety