sklearn 转换器和预估器

        刚学习sklearn时,没分清转换器的fit()和模型训练的fit(),还以为是一个,结果学完了回过头来,才发现这些差异。再此记录一下。

一、 sklearn 转换器和预估器

  1. 转换器(Transformers)

    • 定义:转换器是一种可以对数据进行某种转换的对象。例如,标准化、归一化、PCA等都是转换器的例子。
    • 主要方法
      • fit(X, y=None):在数据集X上训练转换器,这可以让转换器学习数据的一些统计特性。
      • transform(X):使用学习到的转换在新的数据集X上执行转换。
      • fit_transform(X, y=None):这是fittransform的组合。它首先在X上训练转换器,然后在同一个数据上执行转换。
    • 用途:转换器主要用于数据预处理,比如缺失值填充、特征缩放、编码分类特征等。
  2. 预估器(Estimators)

    • 定义:预估器是一种可以估计某些参数的对象。在sklearn中,几乎所有的学习算法都是预估器,包括分类、回归、聚类等。
    • 主要方法
      • fit(X, y):用数据X和标签y训练预估器。
      • predict(X):对新的数据集X进行预测。
      • score(X, y):评估预估器在数据X和标签y上的性能。
    • 用途:预估器主要用于执行实际的学习任务,如分类、回归、聚类等。

总结

  • 转换器主要用于改变数据的形式或结构,而预估器用于基于数据进行预测或决策。
  • 转换器和预估器都有fit方法,用于从数据中学习参数。
  • 转换器用于数据预处理阶段,预估器则用于模型的训练和预测阶段。

二、转换器中的fit和模型训练中的fit区别

尽管它们都被称为fit,但它们在转换器和模型(预估器)之间的作用有所不同。

  1. 转换器中的fit

    • 作用:在转换器中,fit方法用于学习数据的某些特性。例如,如果使用标准化转换器,fit方法会计算特征的均值和标准差。
    • 目的:目的是理解数据的结构和分布,以便可以将相同的转换应用于训练数据和未来的数据。
    • 输出fit方法通常不返回转换后的数据,而是将学习到的参数存储在转换器对象中。
  2. 模型训练中的fit(预估器的fit

    • 作用:在预估器(例如分类器或回归器)中,fit方法用于从带标签的数据中学习模型的参数。例如,线性回归中的fit方法将找到最佳拟合线的斜率和截距。
    • 目的:目的是找到可以用于预测未来数据的模型参数。
    • 输出:与转换器不同,预估器的fit方法将修改对象本身,使其准备好进行预测。

总的来说,转换器的fit方法与预估器的fit方法的主要区别在于它们的目标和作用:

  • 转换器的fit主要用于理解数据的特性,并为将来的转换做准备。
  • 预估器的fit用于学习模型的参数,以便对新数据进行预测。

特征工程:标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)

实际中,我们经常写上述代码,fit_transform其实可以理解为先fit后transfrom,先训练出模型,然后根据模型进行转换。本质上上述代码等价于:

transfer = StandardScaler()

transfer.fit(x_train)
x_train = transfer.transform(x_train)
x_test = transfer.transform(x_test)

三、案例分析

案例:房价预测

假设有一个包含各种特征的房屋数据集,例如面积、卧室数量、地段等,以及房价的标签。目标是根据这些特征预测房价。

步骤1:数据预处理(使用转换器)

首先,需要对一些特征进行标准化,使其具有均值为0和标准差为1。

from sklearn.preprocessing import StandardScaler

# 假设 X_train 是训练特征
scaler = StandardScaler()
scaler.fit(X_train)  # 用fit方法学习训练数据的均值和标准差

# 使用转换器对训练和测试数据进行转换
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)  # 注意:使用训练数据的均值和标准差转换测试数据

在这里,fit方法用于学习训练数据的均值和标准差。然后,使用transform方法将这些参数应用于训练和测试数据。

步骤2:训练模型(使用预估器)

使用预估器,例如线性回归模型,对房价进行预测。

from sklearn.linear_model import LinearRegression

# 创建线性回归模型
model = LinearRegression()

# 使用标准化后的训练数据和房价标签来训练模型
model.fit(X_train_scaled, y_train)

# 使用训练后的模型预测测试集的房价
y_pred = model.predict(X_test_scaled)

在这里,预估器的fit方法用于从训练数据中学习模型参数,以便可以用于对新数据进行预测。

总结

  • 转换器的fit用于学习数据的特性(例如均值和标准差),以便以后可以对新数据应用相同的转换。
  • 预估器的fit用于从带标签的训练数据中学习模型参数,以便可以用于预测。

完整案例:波士顿房价预测

步骤1:加载数据

from sklearn.datasets import load_boston

boston = load_boston()
X = boston.data
y = boston.target

步骤2:划分训练集和测试集

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

步骤3:创建预处理

from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline

preprocessing_pipeline = Pipeline([
    ('scaler', StandardScaler()),
])
preprocessing_pipeline.fit(X_train)
X_train_scaled = preprocessing_pipeline.transform(X_train)
X_test_scaled = preprocessing_pipeline.transform(X_test)

步骤4:选择和配置预估器

from sklearn.linear_model import LinearRegression

model = LinearRegression()

步骤5:拟合预估器

model.fit(X_train_scaled, y_train)

步骤6:预测

y_pred = model.predict(X_test_scaled)

步骤7:评估

from sklearn.metrics import mean_squared_error

mse = mean_squared_error(y_test, y_pred)
print(f'Mean Squared Error: {mse}')

参考:黑马机器学习视频。

你可能感兴趣的:(机器学习,sklearn,人工智能,python)