在机器学习项目中,数据处理和模型训练是两个核心步骤。scikit-learn作为Python中广泛使用的机器学习库,提供了丰富的数据处理和模型训练工具。其中,pandas库的DataFrame格式因其灵活性和易用性,成为数据科学家的首选数据结构。本文将介绍如何在scikit-learn中使用set_output方法,将模型的输出配置为pandas DataFrame格式。
首先,通过加载iris数据集来演示set_output API的使用。iris数据集是一个经典的多类分类数据集,包含了150个样本,每个样本有4个特征。将使用sklearn库中的load_iris函数来加载数据,并将其转换为DataFrame格式。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# 加载iris数据集并转换为DataFrame格式
X, y = load_iris(as_frame=True, return_X_y=True)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=0)
# 查看训练集的前几行数据
print(X_train.head())
接下来,将介绍如何配置预处理步骤,使其输出为DataFrame格式。以StandardScaler为例,这是一个常用的数据标准化工具,可以将数据缩放到均值为0,方差为1的标准正态分布。通过调用set_output方法,并传入transform参数为"pandas",可以将StandardScaler的输出配置为DataFrame格式。
from sklearn.preprocessing import StandardScaler
# 创建StandardScaler实例并配置输出为DataFrame格式
scaler = StandardScaler().set_output(transform="pandas")
# 训练模型并转换测试集数据
scaler.fit(X_train)
X_test_scaled = scaler.transform(X_test)
# 查看转换后的数据
print(X_test_scaled.head())
在实际应用中,经常需要将多个预处理步骤组合成一个pipeline。通过使用sklearn库中的make_pipeline函数,可以轻松地将多个预处理步骤和模型训练步骤组合在一起。在pipeline中,同样可以使用set_output方法来配置所有步骤的输出为DataFrame格式。
from sklearn.feature_selection import SelectPercentile
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import make_pipeline
# 创建一个包含数据标准化、特征选择和逻辑回归的pipeline
clf = make_pipeline(StandardScaler(), SelectPercentile(percentile=75), LogisticRegression())
# 配置pipeline的所有步骤输出为DataFrame格式
clf.set_output(transform="pandas")
# 训练模型并评估测试集性能
clf.fit(X_train, y_train)
print(clf.score(X_test, y_test))
除了在单个模型或pipeline中配置输出格式外,scikit-learn还提供了全局配置的方法。通过调用set_config函数,并传入transform_output参数为"pandas",可以将全局的输出格式配置为DataFrame。这样,在后续的所有模型训练和预测过程中,输出都将默认为DataFrame格式。
from sklearn import set_config
# 全局配置输出格式为DataFrame
set_config(transform_output="pandas")
# 在全局配置下训练模型
clf.fit(X_train, y_train)
print(clf.score(X_test, y_test))
需要注意的是,如果在配置了输出格式后,使用了set_params方法来修改模型的参数,那么模型的输出格式可能会被重置为默认值。为了避免这种情况,需要在修改参数之前,先使用set_output方法来重新配置输出格式。
# 修改模型参数前,先重新配置输出格式
scaler = StandardScaler().set_output(transform="pandas")
clf.set_params(standardscaler=scaler)
# 训练模型并评估测试集性能
clf.fit(X_train, y_train)
print(clf.score(X_test, y_test))