在Python中,sklearn库无疑是机器学习领域最有用的库之一。它包含了大量高效的工具,用于机器学习和统计建模,涵盖分类、回归、聚类和降维等多种任务。本文将带深入了解sklearn中的不同类型对象,以及它们在机器学习流程中的功能和使用时机。
sklearn的设计中主要包括三种类型的对象:
接下来,将探讨fit()、transform()、fit_transform()和predict()这些重要方法的用途。
fit()方法用于在训练数据上计算初始参数,并将其保存为内部对象状态。例如,该方法可以计算参数μ(均值)和σ(标准差)并将其保存为内部对象。这是一个只进行计算而不返回任何结果的黑盒过程。
transform()方法使用上述计算出的初始值,并返回修改后的训练数据作为输出。使用相同的参数,该方法可以转换特定数据集。它用于建模前的预处理。
fit_transform()方法结合了上述两个步骤。它首先调用fit(),然后对同一数据调用transform()。它用于训练数据,以便可以对训练数据进行缩放,并学习缩放参数。这里构建的模型将学习训练集特征的均值和方差。然后,这些学习到的参数进一步用于缩放测试数据。
fit()方法用于在训练数据上计算参数或权重(例如线性回归中的coef()返回的参数),并将其保存为内部对象状态。predict()方法使用上述计算出的权重对测试数据进行预测。
让通过一个例子来理解这些方法的区别。假设有一个数组arr = [1,2,3,y,5],并且有一个sklearn类FillMyArray来填充数组。当声明类的实例:
my_filler = FillMyArray()
手头有fit()、transform()和fit_transform()方法。
fit(): my_filler.fit(arr)
将计算要分配给x的值以填充数组,并将其存储在实例my_filler中。
transform(): 在之前的.fit()阶段计算并存储值之后,可以调用my_filler.transform(arr)
,它将返回填充后的数组[1,2,3,4,5]。
fit_transform(): 如果执行my_filler.fit_transform(arr)
,可以省略一行代码,并直接返回计算并分配给填充数组的值。
这里的关键问题是“数据泄露”。fit_transform()进行某些计算后进行转换,假设从某些数据中计算列的均值或平均值,然后根据它替换缺失值。对于训练集,需要进行计算然后转换。
然而,对于测试集,机器学习基于训练集的学习进行预测,因此它不需要执行计算,只需要进行转换。如果甚至在测试数据上执行fit()方法,将计算一个新的均值和方差,这将是一个天真的规模,适用于每个特征,并将允许模型在测试数据上学习。然而,将不再能够将其作为对模型的惊喜,并且它将无法给一个关于模型在未见数据上性能的好估计,这当然是最终目标。
这是在构建机器学习模型时对数据进行缩放的一般程序。这样模型就不会对特定特征产生偏见,同时防止模型学习测试数据的趋势。
以下是在文章的前半部分学习的所有功能的实现。
# 步骤1: 导入必要的Python库,然后读取并加载“TITANIC”数据集。
import pandas as pd
df = pd.read_csv('titanic.csv', usecols=['Pclass','Age','Fare','Survived'])
print(df.head())
# 步骤2: 计算每列的缺失值数量。
df.isnull().sum()
# 步骤3: 用它们的中位数填充“Age”列的缺失值。
df['Age'].fillna(df.Age.median(),inplace=True)
# 步骤4: 再次检查是否有任何列存在缺失值。
df.isnull().sum()
# 步骤5: 定义独立(预测器)和依赖(响应)变量。
X = df.iloc[:,1:]
y = df.iloc[:,0]
# 步骤6: 将数据集分割成训练和测试子集。
fromsklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=42)
# 步骤7: 使用标准缩放器,首先拟合然后转换数据集。
fromsklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_fit = scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)
pd.DataFrame(X_train_scaled)
# 步骤8: 直接使用fit_transform()函数并验证结果。
X_train_scaled = scaler.fit_transform(X_train)
pd.DataFrame(X_train_scaled)
# 步骤9: 转换测试数据。
X_test_scaled = scaler.transform(X_test)
pd.DataFrame(X_test_scaled)
在这里,观察到fit_transform()函数给出的结果与分别使用fit()和transform()函数的结果相同。transform()函数作用于测试数据,predict()函数作用于测试数据。
感谢阅读!如果喜欢这篇文章,并且想了解更多,请点击链接访问关于数据科学和机器学习的其他文章。
请随时通过LinkedIn或电子邮件与联系。