python-3.x - 将 FunctionTransformer 与 sklearn Pipeline 和 ColumnTransformer 一起使用 - 错误 : invalid type promotion

标签 python-3.x machine-learning scikit-learn

我正在使用管道来预处理数据。这是我的代码。我想将字符串列转换为日期时间并用 np.nan 替换空字符串 (' '), "N.A"对于其他一些列。我正在尝试使用 FunctionTransformer在我的管道步骤中。

df = pd.DataFrame({'categoric1':['Apple', '  ', 'Cherry', 'Apple', 'Cherry', 'Cherry', 'Orange'],                    
                   'numeric1':[1, 2, 3, 4, 5, 6, 7],                                      
                   'numeric2':[7,8,9,"N.A", np.nan, '  ', 12],
                   'date1': ['20001103','20011109', '19910929', '19920929', '20051107', '20081103', '20101105']})
cat_features = ['categoric1']
num_features = ['numeric1', 'numeric2']
date_features = ['date1']

print(df.head(7))

def replace_with_nan(X):
    X_copy = X.copy()       
    X_copy[X_copy == '  '] = np.nan
    X_copy[X_copy == 'N.A'] = np.nan
    return X_copy.values

def square_values(X):
    return X**2

def convert_to_datetime(df):
    df['date1'] = pd.to_datetime(df['date1'], errors='raise') #df['date1'].astype(str) + "Z"
    return df

cat_transformer = Pipeline(steps=[
    ('ft_replace_nan', FunctionTransformer(replace_with_nan, validate=False)),    
    ('imputer', SimpleImputer(missing_values=np.nan, strategy='most_frequent')),   
    ('encoder', OneHotEncoder(categories=[['Apple', 'Orange', 'Cherry']], handle_unknown='error'))     
])

num_transformer = Pipeline(steps=[    
    ('ft_replace_nan', FunctionTransformer(replace_with_nan, validate=False)),
#     ('ft_square_values', FunctionTransformer(square_values, validate=False)),    #Another FunctionTransformer -----1
    ('imputer', SimpleImputer(missing_values=np.nan, strategy='median')),
    ('scaler', StandardScaler())
])

date_transformer = Pipeline(steps=[    
    ('convert_to_datetime', FunctionTransformer(convert_to_datetime, validate=False))
])

preprocessor = ColumnTransformer(remainder='passthrough', transformers = [
    ('num', num_transformer, num_features),
    ('cat', cat_transformer, cat_features),
    ('date', date_transformer, date_features)
])

# ft_fill_nan = FunctionTransformer(replace_with_nan, validate=False)
# transformed_data = ft_fill_nan.fit_transform(df)
# print(transformed_data)

# ft_convert_datetime = FunctionTransformer(convert_to_datetime, validate=False)
# transformed_data = ft_convert_datetime.fit_transform(df)
# print(transformed_data)

transformed_data = preprocessor.fit_transform(df)
print(transformed_data)

enter image description here

问题:
  • 当我尝试执行 preprocessor.fit_transform(df) 时, 我越来越
    错误如下。你能帮我解决这个问题吗?
  • 如果我想在同一管道中执行另一个 FunctionTranformer 以进行平方怎么办
    取消注释行 #Another FunctionTransformer -----1 的值.是否可以?如果是这样,如何?
  • 我不想改变里面实际数据的状态convert_to_datetime(df)方法同上。我还想让它通用而不访问实际 date1柱子。我怎样才能做到这一点?

  • enter image description here

    最佳答案

  • 您收到 invalid type promotion错误,因为异构数据类型。 Sklearn 试图在内部使用 numpy 结构数组进行连接。解决方案是从日期中提取必要的特征,例如给定日期的月份。

  • 您只需要更改 convert_to_datetime
    def convert_to_datetime(data):
        return data.apply(lambda x: [pd.to_datetime(date,  format="%Y%m%d").month for date in x])
    

    通过这种方式,您不必在函数内对列名进行硬编码。

    结果:

    enter image description here
  • 您可以轻松添加更多功能变压器,试试这个!
  •     ('ft_square_values', FunctionTransformer(lambda x: x*2, validate=False)),    #Another FunctionTransformer -----1
    
  • 通过采用第 1 点中提到的解决方案,您也可以摆脱这个问题。
  • 关于python-3.x - 将 FunctionTransformer 与 sklearn Pipeline 和 ColumnTransformer 一起使用 - 错误 : invalid type promotion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58202430/

    相关文章:

    python - 抓取谷歌财经(BeautifulSoup)

    python - 从 3d 数组中提取 2d 面片

    python - scikit 管道中的链接转换

    machine-learning - 需要帮助选择损失函数

    hadoop - 如何解决二十个新闻组分类示例上的加载主类MahoutDriver错误

    python-2.7 - Python lightgbm feature_importance() 错误?

    scikit-learn - SciKit 的 make_blobs 中的 "n_features"和 "centers"参数是什么意思?

    python - 使用 *args 而不将参数放入元组中?

    python - 制作数据长度不足的numpy矩阵

    python - PySpark 数据帧 : Full Outer Join with a condition