回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>这个问题并不像有人建议的那样。为什么?因为在那个例子中,所有可能的值都是已知的。在本例中,它们不是。此外,除了对未知值使用自定义转换器之外,这个问题还特别询问如何以与初始转换相同的方式执行转换。我可以再次告诉你,我最终会回答我自己的问题。</p>
<hr/>
<p>在创建自定义scikit learn transformer时,如何保证或“强制”transform方法只输出它原来安装的列?</p>
<p>下面举例说明。这是我的例子变压器。</p>
<pre><code>import numpy as np
import pandas as pd
from sklearn.base import TransformerMixin
from sklearn.linear_model import LogisticRegression
class DFTransformer(TransformerMixin):
def fit(self, df, y=None, **fit_params):
return self
def transform(self, df, **trans_params):
self.df = df
self.STACKER = pd.DataFrame()
for col in self.df:
dtype = self.df[col].dtype.name
if dtype == 'object':
self.STACKER = pd.concat([self.STACKER, self.get_dummies(col)], axis=1)
elif dtype == 'int64':
self.STACKER = pd.concat([self.STACKER, self.cut_it(col)], axis=1)
return self.STACKER
def get_dummies(self, name):
return pd.get_dummies(self.df[name], prefix=name)
def cut_it(self, name, bins=5):
s = self.df[name].copy()
return pd.get_dummies(pd.cut(s, bins), prefix=name)
</code></pre>
<p>这是一些假数据。我的一个方法使用<code>pd.cut</code>来处理大范围的int或float。另一个方法使用<code>pd.get_dummies</code>将唯一值转换为列。</p>
<pre><code>df = pd.DataFrame({'integers': np.random.randint(2000, 20000, 30, dtype='int64'),
'categorical': np.random.choice(list('ABCDEFGHIJKLMNOP'), 30)},
columns=['integers', 'categorical'])
trans = DFTransformer()
X = trans.fit_transform(df)
y = np.random.binomial(1, 0.5, 30)
lr = LogisticRegression()
lr.fit(X, y)
X_test = pd.DataFrame({'integers': np.random.randint(2000, 60000, 30, dtype='int64'),
'categorical': np.random.choice(list('ABGIOPXYZ'), 30)},
columns=['integers', 'categorical'])
lr.predict(trans.transform(X_test))
</code></pre>
<p>我遇到的问题是,当我去转换“测试”数据(我想对其进行预测的数据)时,由于不同的分类值,转换很可能不会输出相同的列(例如:可能出现一次的模糊值,以后再也看不到或听不到)。</p>
<p>例如,上述代码会产生此错误:</p>
<pre><code>Traceback (most recent call last):
File "C:/Users/myname/Downloads/SO009949884.py", line 44, in <module>
lr.predict(trans.transform(X_test))
File "C:\python36\lib\site-packages\sklearn\linear_model\base.py", line 324, in predict
scores = self.decision_function(X)
File "C:\python36\lib\site-packages\sklearn\linear_model\base.py", line 305, in decision_function
% (X.shape[1], n_features))
ValueError: X has 14 features per sample; expecting 20
</code></pre>
<p><strong>问题</strong>:如何确保转换方法以相同的方式转换测试数据?</p>
<p>我能想到的一个糟糕的解决方案是:转换训练数据、转换测试数据、查看列相交的位置、修改转换函数以将输出限制到这些列。或者,为缺少的部分填写空白列。这是不可扩展的。肯定有更好的办法?我不想在hand之前知道输出列必须是什么。</p>
<p><strong>我的总体目标是在列车和测试数据集之间以一致的方式转换分类变量。我有150多根柱子要改造!</p>