python - sklearn DictVectorizer(sparse=False) 具有不同的默认值,估算一个常数

标签 python pandas dataframe machine-learning scikit-learn

我正在构建一个以生成稀疏矩阵的 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.fillnadictionarieslist 转换为 pandas dataframe 后,您可以用 0 填充 NaN如图:

df = pd.DataFrame(dict_data)
df.fillna(0, inplace=True)

为了将其用作流水线估算器中的步骤,您可以自己编写一个实现 fittransform 方法的自定义类,如下所示:

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/

相关文章:

pandas groupby 聚合,总和在底部

python - 如何将 oseti 中的情绪值附加到 pandas 数据框?

python - 比较两个列表并找到唯一值

python - 如何在pydantic中更改日期格式

python - Python 中的数独检查器

python - 向行值添加尾随零以确保有 10 位数字

python - 如何用两点画一条线,然后用opencv,python画线直到到达轮廓点?

python - 从另一个 DataFrame 初始化一个新的 DataFrame 时 dtypes 改变了

python - 将数据框一分为二并使用代字号 ~ 作为变量

r - 将向量列表转换为数据框