详解 Scikit-learn 的 compose.ColumnTransformer函数:对不同列应用不同的转换器

  • Post category:Python

sklearn.compose.ColumnTransformer 是 scikit-learn 库中的一个函数,主要用于对不同数据列应用不同的数据预处理方法,常见于数据预处理过程中。它可以针对输入的列,对每一列采用不同的操作,将数据预处理流水线串联起来。

sklearn.compose.ColumnTransformer 的主要参数和用法如下:

sklearn.compose.ColumnTransformer(
        transformers, 
        remainder='drop', 
        sparse_threshold=0.3,
        n_jobs=None, 
        transformer_weights=None, 
        verbose=False
)
  • transformers:一个列表,列表中的每个元素代表一列数据需要做的数据预处理操作。每个元素是一个二元祖,定义了需要处理的特征列和该特征列需要应用的操作。
  • remainder:默认值是 ‘drop’。如果设置为 ‘passthrough’,它可以将未被处理过的属性直接“通行”。如果设置为 ‘drop’,则会删除未被处理的属性。
  • sparse_threshold:默认值是 0.3。该参数的意义是如果预处理后的数据在数据稠密度低于这个值时转换为稀疏矩阵,否则转换为稠密矩阵。如果设置为 None,则始终使用稠密矩阵。
  • n_jobs:线程数。可以在 fit_transform 加速和计算特征等方面发挥作用。
  • transformer_weights:每个转换器对应的权重。例如,如果您想要对某个转换器实例的变换属性给予更多的重要性,则可以这样做。
  • verbose:如果 verbose > 0,则表示输出详细信息。

下面我们通过两个实例来展示该函数的使用:

实例1:对不同类型数据列应用不同的预处理方法

假设我们需要对一个包含数值型、类别型以及文本型数据的数据集进行预处理,其中数值型数据需要进行标准化处理,类别型数据需要进行 One-Hot 编码,文本型数据需要进行 Tf-idf 计算。

import pandas as pd
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LinearRegression

# 构建数据集
df = pd.DataFrame({
    'col1': [0, 1, 2, 3], 
    'col2': ['cat', 'dog', 'cat', 'fish'], 
    'col3': ['I love deep learning', 'Machine learning is fun', 
             'I love deep learning too!', 'Hello World'], 
    'target': [1.0, 1.5, 2.0, 2.5]
})

# 数据预处理流水线
numeric_transformer = Pipeline(steps=[
    ('scaler', StandardScaler())
])

categorical_transformer = Pipeline(steps=[
    ('onehot', OneHotEncoder())
])

text_transformer = Pipeline(steps=[
    ('tfidf', TfidfVectorizer())
])

preprocessor = ColumnTransformer(
    transformers=[
        ('num', numeric_transformer, ['col1']),
        ('cat', categorical_transformer, ['col2']),
        ('text', text_transformer, ['col3'])
    ]
)

# 模型训练流水线
regressor = LinearRegression()

clf = Pipeline(steps=[
    ('preprocessor', preprocessor),
    ('regressor', regressor)
])

X = df.drop('target', axis=1)  # 特征矩阵
y = df['target']  # 标签向量

# 模型训练
clf.fit(X, y)

# 模型预测
clf.predict(pd.DataFrame({
    'col1': [4],
    'col2': ['cat'],
    'col3': ['I love deep learning!']
}))

实例2:对不同类型的数据列,构建多项式特征

假设我们有如下的一个数据集,有两个特征,其中一个为整形,另一个为浮点型。

import pandas as pd
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
import numpy as np

# 构建数据集
np.random.seed(0)
df = pd.DataFrame({
    'col1': np.random.randint(0, 10, size=5),
    'col2': np.random.rand(5)
})

在实际情况中,我们经常会遇到需要构建多项式特征的问题,这一过程可以通过 sklearn.compose.ColumnTransformer 实现。我们可以针对特征类型单独进行处理,用 数值转换器 和 多项式特征 转换器对不同类型数据列进行不同的操作。

# 数据预处理流水线
numeric_transformer = Pipeline(steps=[
    ('poly', PolynomialFeatures(degree=2))
])

preprocessor = ColumnTransformer(
    transformers=[
        ('num', numeric_transformer, ['col1', 'col2'])
    ]
)

# 模型训练流水线
regressor = LinearRegression()

clf = Pipeline(steps=[
    ('preprocessor', preprocessor),
    ('regressor', regressor)
])

X = df.drop('target', axis=1)  # 特征矩阵
y = np.random.rand(5)  # 标签向量

# 模型训练
clf.fit(X, y)

# 模型预测
clf.predict(pd.DataFrame({
    'col1': [4],
    'col2': [0.5]
}))

以上就是对 sklearn.compose.ColumnTransformer 函数的详细讲解和使用方法的完整攻略。