在处理表格数据时,常常需要对一个或多个列进行转换以使它们更适合于分析或建模。在许多情况下,可以使用 Pandas 库轻松完成这些转换。然而,在处理大型数据集或构建机器学习管道时,使用 scikit-learn 的 ColumnTransformer 类来将转换应用于数据的特定列可能更有效。
这里,我们将演示如何使用自定义转换器与 scikit-learn 的 ColumnTransformer 来转换 Pandas DataFrame 的一个或多个列。
示例1:转换 NumPy 数组
让我们从一个简单的示例开始,我们有一个具有三个列的 NumPy 数组,并且我们希望将前两列转换为两个新列。
import numpy as np
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
class CustomTransformer(BaseEstimator, TransformerMixin):
def __init__(self):
pass
def transform(self, X):
# 这里,X 是一个二维的 NumPy 数组或 Pandas DataFrame
# 将第0列和第1列转换成多列
transformed_cols = np.column_stack([X[:, 0]**2, np.sqrt(X[:, 1])])
# 将转换后的列作为二维 NumPy 数组返回
return transformed_cols
def fit(self, X, y=None):
return self
# 示例用法
X = np.array([[1, 4, 7], [2, 9, 8], [3, 16, 9]])
transformer = ColumnTransformer(
transformers=[('custom', CustomTransformer(), [0, 1])],
remainder='passthrough')
# 'remainder' 参数保留未转换的任何列
transformed_X = transformer.fit_transform(X)
print(transformed_X)
在这个例子中,CustomTransformer 类接受两个输入列并将它们转换为两个输出列。ColumnTransformer 将这个转换器应用到输入数据的第0列和第1列,并保留第2列。“passthrough” 选项被用来保留其原始形式的其余列。
示例2:转换 Pandas DataFrames
现在,让我们修改之前的示例,使其适用于 Pandas DataFrame 而不是 NumPy 数组。
import pandas as pd
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
class CustomTransformer(BaseEstimator, TransformerMixin):
def __init__(self):
pass
def transform(self, X):
# Here, X is a pandas DataFrame
# Transform columns 'A' and 'B' into multiple columns
transformed_cols = pd.DataFrame({'A_squared': X['A']**2,
'B_sqrt': X['B']**0.5})
# Return the transformed columns as a pandas DataFrame
return transformed_cols
def fit(self, X, y=None):
return self
# Example usage
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 9, 16], 'C': [7, 8, 9]})
transformer = ColumnTransformer(
transformers=[('custom', CustomTransformer(), ['A', 'B'])],
remainder='passthrough')
# The 'remainder' parameter preserves any columns not transformed
transformed_df = transformer.fit_transform(df)
print(transformed_df)
在此示例中,CustomTransformer 类采用两个输入列(“A”和“B”)并将它们转换为 pandas DataFrame 中的两个输出列(“A_squared”和“B_sqrt”)。 ColumnTransformer 将此转换器应用于输入数据的“A”列和“B”列,并保留“C”列。 “passthrough”选项已用于以其原始形式保留剩余的列“C”。
英文链接
最后的话
AI日新月异,但是万丈高楼拔地起,离不开良好的基础。您是否有兴趣了解人工智能的原理和实践? 不要再观望! 我们关于 AI 原则和实践的书是任何想要深入了解 AI 世界的人的完美资源。 由该领域的领先专家撰写,这本综合指南涵盖了从机器学习的基础知识到构建智能系统的高级技术的所有内容。 无论您是初学者还是经验丰富的 AI 从业者,本书都能满足您的需求。 那为什么还要等? 立即下单,开始以一种易于访问、引人入胜且实用的方式学习 AI。