将 sklearn 的 FunctionTransformer 与字符串数据一起使用?

pei*_*aqi 3 python machine-learning pandas scikit-learn

我正在使用 sklearn 的 FunctionTransformer 来预处理我的一些数据,这些数据是日期字符串,例如“2015-01-01 11:09:15”。

我的自定义函数将一个字符串作为输入,但我发现 FunctionTransformer 无法处理字符串,因为在它没有实现 fit_transform 的源代码中。因此,调用被路由到父类:

     57     def fit(self, X, y=None):
     58         if self.validate:
---> 59             check_array(X, self.accept_sparse)
     60         return self
Run Code Online (Sandbox Code Playgroud)

check_array 似乎只适用于数字 ndarrays。现在我当然可以在 Pandas 领域做任何事情,但我想知道在 sklearn 中是否有更好的方法来处理这个问题——尤其是。鉴于我将来可能会使用管道?

谢谢!

Mar*_* V. 6

好像validate参数就是你要找的:http : //scikit-learn.org/stable/modules/generated/sklearn.preprocessing.FunctionTransformer.html

这是一个示例,其中将其保留为字符串而不是像注释中提到的那样转换为浮点数可能是有意义的。假设您想在日期字符串中添加时区信息:

import pandas as pd

def add_TZ(df):
    df['date'] = df['date'].astype(str) + "Z"

data = {  'date' : ["2015-01-01 11:00:00", "2015-01-01 11:15:00", "2015-01-01 11:30:00"],
        'value' : [4., 3., 2.]}

df = pd.DataFrame(data)
Run Code Online (Sandbox Code Playgroud)

由于检查,这将失败,正如您所指出的:

ft = FunctionTransformer(func=add_TZ)
ft.fit_transform(df)
Run Code Online (Sandbox Code Playgroud)

输出:

ValueError: could not convert string to float: '2015-01-01 11:30:00'
Run Code Online (Sandbox Code Playgroud)

这有效:

ft = FunctionTransformer(func=add_TZ, validate=False)
ft.fit_transform(df)
Run Code Online (Sandbox Code Playgroud)

输出:

    date                    value
0   2015-01-01 11:00:00Z    4.0
1   2015-01-01 11:15:00Z    3.0
2   2015-01-01 11:30:00Z    2.0
Run Code Online (Sandbox Code Playgroud)