刚学习sklearn时,没分清转换器的fit()和模型训练的fit(),还以为是一个,结果学完了回过头来,才发现这些差异。再此记录一下。
一、 sklearn 转换器和预估器
-
转换器(Transformers):
- 定义:转换器是一种可以对数据进行某种转换的对象。例如,标准化、归一化、PCA等都是转换器的例子。
- 主要方法:
fit(X, y=None)
:在数据集X
上训练转换器,这可以让转换器学习数据的一些统计特性。transform(X)
:使用学习到的转换在新的数据集X
上执行转换。fit_transform(X, y=None)
:这是fit
和transform
的组合。它首先在X
上训练转换器,然后在同一个数据上执行转换。
- 用途:转换器主要用于数据预处理,比如缺失值填充、特征缩放、编码分类特征等。
-
预估器(Estimators):
- 定义:预估器是一种可以估计某些参数的对象。在
sklearn
中,几乎所有的学习算法都是预估器,包括分类、回归、聚类等。 - 主要方法:
fit(X, y)
:用数据X
和标签y
训练预估器。predict(X)
:对新的数据集X
进行预测。score(X, y)
:评估预估器在数据X
和标签y
上的性能。
- 用途:预估器主要用于执行实际的学习任务,如分类、回归、聚类等。
- 定义:预估器是一种可以估计某些参数的对象。在
总结:
- 转换器主要用于改变数据的形式或结构,而预估器用于基于数据进行预测或决策。
- 转换器和预估器都有
fit
方法,用于从数据中学习参数。- 转换器用于数据预处理阶段,预估器则用于模型的训练和预测阶段。
二、转换器中的fit和模型训练中的fit区别
尽管它们都被称为fit
,但它们在转换器和模型(预估器)之间的作用有所不同。
-
转换器中的
fit
:- 作用:在转换器中,
fit
方法用于学习数据的某些特性。例如,如果使用标准化转换器,fit
方法会计算特征的均值和标准差。 - 目的:目的是理解数据的结构和分布,以便可以将相同的转换应用于训练数据和未来的数据。
- 输出:
fit
方法通常不返回转换后的数据,而是将学习到的参数存储在转换器对象中。
- 作用:在转换器中,
-
模型训练中的
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}')
参考:黑马机器学习视频。