擅长:python、mysql、java
<p>这是处理分类数据时非常常见的问题。关于如何最好地处理这个问题,人们有不同的意见。</p>
<p>一种可能的方法是将函数应用于限制可能选项集的分类特征。例如,如果您的功能包含字母表中的字母,则可以对A、B、C、D和“其他/未知”的功能进行编码。这样,您就可以在测试时应用相同的函数并从问题中抽象出来。当然,一个明显的缺点是,通过减少特性空间,可能会丢失有意义的信息。</p>
<p>另一种方法是根据训练数据构建模型,使用自然创建的任何一个虚拟对象,并将其作为模型的基线。当您在测试时使用模型进行预测时,您将按照转换训练数据的方式转换测试数据。例如,如果训练集的某个特征中包含字母表的字母,而测试集中的同一个特征包含值“a a”,则在进行预测时将忽略该值。这与你目前的情况相反,但前提是一样的。您需要动态创建缺少的功能。当然,这种方法也有缺点。</p>
<p>第二种方法是你在问题中提到的,所以我将用<code>pandas</code>来说明。</p>
<p>通过使用<code>get_dummies</code>,您将分类功能编码为多个一个热编码功能。您可以使用<code>reindex</code>强制测试数据与训练数据匹配,如下所示:</p>
<pre><code>test_encoded = pd.get_dummies(test_data, columns=['your columns'])
test_encoded_for_model = test_encoded.reindex(columns = training_encoded.columns,
fill_value=0)
</code></pre>
<p>这将以与训练数据相同的方式对测试数据进行编码,对于不是通过编码测试数据创建的、而是在训练过程中创建的虚拟功能,请填写0。</p>
<p>你可以把它包装成一个函数,然后动态地应用到你的测试数据中。如果创建列名数组或列表,则不需要内存中的编码训练数据(我使用<code>training_encoded.columns</code>访问这些数据)。</p>