我正在构建一个以生成稀疏矩阵的 DictVectorizer
开头的管道。指定 sparse=True
会将输出从 scipy 稀疏矩阵更改为 numpy 稠密矩阵,这很好,但管道中的下一阶段会提示 NaN
值,这是我们显而易见的在我的案例中使用 DictVectorizer
的结果。我希望管道将缺少的字典值视为不可用,而是视为零。
Imputer
对我没有帮助,因为我想用一个常量值而不是依赖于列的其他值的统计值来“估算”。
以下是我一直在使用的代码:
vectorize = skl.feature_extraction.DictVectorizer(sparse=False)
variance = skl.feature_selection.VarianceThreshold()
knn = skl.neighbors.KNeighborsClassifier(4, weights='distance', p=1)
pipe = skl.pipeline.Pipeline([('vectorize', vectorize),
# here be dragons ('fillna', ),
('variance', variance),
('knn', knn)])
pipe.fit(dict_data, labels)
还有一些模拟字典:
dict_data = [{'city': 'Dubai', 'temperature': 33., 'assume_zero_when_missing': 7},
{'city': 'London', 'temperature': 12.},
{'city': 'San Fransisco', 'temperature': 18.}]
请注意,在此示例中,大多数词典中都缺少 assume_zero_when_missing
,这将导致后来的估算器提示 NaN
值:
ValueError: Input contains NaN, infinity or a value too large for dtype('float64').
虽然我希望的结果是 NaN
值将替换为 0
。
最佳答案
使用 DF.fillna
将 dictionaries
的 list
转换为 pandas dataframe
后,您可以用 0 填充 NaN
如图:
df = pd.DataFrame(dict_data)
df.fillna(0, inplace=True)
为了将其用作流水线估算器中的步骤,您可以自己编写一个实现 fit
和 transform
方法的自定义类,如下所示:
class FillingNans(object):
'''
Custom function for assembling into the pipeline object
'''
def transform(self, X):
nans_replaced = X.fillna(0)
return nans_replaced
def fit(self, X, y=None):
return self
然后,您可以修改管道中的手动特征选择步骤,如下所示:
pipe = skl.pipeline.Pipeline([('vectorize', vectorize),
('fill_nans', FillingNans()),
('variance', variance),
('knn', knn)])
关于python - sklearn DictVectorizer(sparse=False) 具有不同的默认值,估算一个常数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39437687/