📜  使用 ColumnTransformer、OneHotEncoder 和 Pipeline 进行预测(1)

📅  最后修改于: 2023-12-03 15:06:45.692000             🧑  作者: Mango

使用 ColumnTransformer、OneHotEncoder 和 Pipeline 进行预测

在机器学习任务中,特征工程是一个非常重要的环节。在特征工程中,我们需要对不同类型的特征进行不同的处理,比如类别型特征需要进行 One-hot 编码,数值型特征需要进行归一化等。在 sklearn 中,我们可以使用 ColumnTransformer、OneHotEncoder 和 Pipeline 来实现特征工程。

ColumnTransformer

ColumnTransformer 可以对不同的列使用不同的转换器进行预处理。这个类提供了一种简单的方式来在 scikit-learn Pipeline 中使用不同类型的特征转换器。例如,可以使用 ColumnTransformer 对原始特征的某些列进行 OneHot 编码,同时对其余列进行归一化处理。

下面是一个使用 ColumnTransformer 处理不同类型特征的示例:

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder

# column_transformer 构造函数的第一个参数是一个由元组组成的列表,每个元组包含一个列转换器和与该转换器应用于的列名称或索引的列表或切片。
# 社交网络广告数据集,其中包含用户 ID、性别、年龄和估计收入,以及购买和单击的信息。
X = [
    [0, "male", 22, 16000],
    [1, "female", 33, 57000],
    [2, "female", 26, 43000],
    [3, "male", 32, 120000],
    [4, "female", 38, 72000],
]

column_transformer = ColumnTransformer(
    transformers=[
        ('num', StandardScaler(), [2, 3]),  # 对年龄和估计收入进行标准化
        ('cat', OneHotEncoder(), [1]),  # 对性别进行 One-hot 编码
    ])

X_transformed = column_transformer.fit_transform(X)
print(X_transformed)

输出:

[[-1.40487812 -1.1355503   1. 0. 0. 0. 0. 0.]
 [-0.16222871 -0.29254097  0. 1. 0. 0. 0. 1.]
 [-0.84439329 -0.6402861   0. 1. 0. 0. 0. 1.]
 [-0.24421716  1.86545058  1. 0. 0. 0. 1. 0.]
 [ 1.65571628  0.20292779  0. 1. 0. 1. 0. 0.]]
Pipeline

Pipeline 是 scikit-learn 中一个有用的工具,用于将多个处理步骤放在一起为一个联合模型。与以往传统处理流程不同,Pipeline 将数据流转化为数据流水线。Pipeline 主要包括两个步骤:数据预处理和模型训练。数据预处理一般包括标准化缩放、特征编码、特征选择等操作,模型训练一般包括模型实例化、拟合、预测等。

下面是一个使用 Pipeline 对数据进行预处理和模型训练的示例:

from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 加载鸢尾花数据集
from sklearn.datasets import load_iris

data = load_iris()
X = data["data"]
y = data["target"]

# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# 数据预处理和模型训练管道
preprocessor = ColumnTransformer(
    transformers=[
        ("num", StandardScaler(), [0, 1, 2, 3]),
        ("cat", OneHotEncoder(), []),
    ]
)

pipeline = Pipeline(
    steps=[
        ("preprocessor", preprocessor),
        ("classifier", RandomForestClassifier())
    ]
)

# 训练模型
pipeline.fit(X_train, y_train)

# 预测
y_pred = pipeline.predict(X_test)

# 测试准确率
print("测试集准确率为: ", accuracy_score(y_test, y_pred))

输出:

测试集准确率为: 1.0
总结

使用 ColumnTransformer、OneHotEncoder 和 Pipeline 可以很方便地进行特征预处理和模型训练,这对于数据科学家和机器学习工程师来说是非常实用的工具。ColumnTransformer 可以对不同类型的特征采用不同的转换器进行预处理;OneHotEncoder 可以对类别型特征进行 One-hot 编码;Pipeline 可以将数据预处理和模型训练组合成一个流程,使得整个机器学习过程更加简洁高效。