在本文中,我将解释如何使用Scikit-Learn类创建一个根据我们的处理需求进行转换的转换器。
数据预处理是数据科学生命周期中最重要的步骤之一。作为非常流行的机器学习库,Scikit-Learn具有许多预定义的转换器,帮助我们将数据转换为所需的格式。
然而,有时候我们可能需要执行一些处理操作,而Scikit-Learn没有合适的转换器。幸运的是,我们可以非常容易地使用一些Scikit-Learn类创建自己的转换器,以满足我们的预处理需求。而且,为什么有人要经历创建自定义转换器的过程(因为我们也可以在没有转换器的情况下进行自定义操作)的原因是使用Scikit-Learn类创建的自定义转换器非常适用于Scikit-Learn的功能,如管道,这使得我们的工作非常容易。如果您想了解更多关于Scikit-Learn管道的内容,请查看我的其他文章。
使用Scikit-Learn管道自动化机器学习模型训练和预测
在本文中,我将尝试解释使用一个编码示例来说明Scikit-Learn管道类的理论和用法…
VoAGI.com
让我们看看如何使用Scikit-Learn类创建自定义转换器。
首先,让我们了解一下理论。要创建一个自定义转换器,只需要实现三个方法:fit()、transform()和fit_transform()。
如果自定义转换器类有一个名为TransformerMixin的基类,则可以免费获得fit_transform()方法。此外,通过将BaseEstimator类作为自定义转换器的基类,我们可以获得两个方法get_params()和set_params(),在超参数调优操作后非常有用。
现在,让我们了解一下fit()和transform()方法在自定义转换器中的作用。fit()方法用于计算数据处理操作所需的参数。fit()方法计算所需的参数,然后返回self(类实例)。transform()方法是使用fit()方法中计算的参数对数据进行转换的地方。该方法返回转换后的数据。fit()和transform()方法接受三个参数:
- self
- X(独立特征值)
- y(依赖特征值)
为了在我们的脑海中确立这个想法,让我们举个例子。
假设我们想创建一个从数据中删除异常值的转换器。为了执行此操作,我们需要知道Q1(第一四分位数)、Q3(第三四分位数)和四分位距(即Q3 – Q1)的值。这些值在fit()方法中计算。在实现fit()方法后,在transform()方法中使用fit()方法中计算的参数找到异常值。
另一种方法是只在transform()方法中计算参数并执行转换。在这种情况下,fit()方法只会返回self(类实例)。
让我们尝试自己创建一个自定义转换器。让我们以上述异常值的示例为例。我们将在代码中做一个小改变。我们将不完全删除异常值,而是用数据的中位数替换它们。
## 创建一个自定义转换器以处理数据中的异常值from sklearn.base import BaseEstimator, TransformerMixinclass Outlier_Remover(BaseEstimator, TransformerMixin): def __init__(self,list_of_feature_names = notable_num_feat): self.list_of_feature_names = list_of_feature_names def fit(self, X, y=None): return self def transform(self, X, y=None): quantiles = X[notable_num_feat].quantile(np.arange(0,1,0.25)).T quantiles = quantiles.rename(columns={0.25:'Q1', 0.50: 'Q2', 0.75:'Q3'}) quantiles['IQR'] = quantiles['Q3'] - quantiles['Q1'] quantiles['Lower_Limit'] = quantiles['Q1'] - 1.5*quantiles['IQR'] quantiles['Upper_Limit'] = quantiles['Q3'] + 1.5*quantiles['IQR'] for feature in notable_num_feat: X[feature] = np.where((X[feature] < quantiles.loc[feature,'Lower_Limit']) | (X[feature] > quantiles.loc[feature,'Upper_Limit']) & (X[feature] is not np.nan), X[feature].median(), X[feature]) return X
让我们逐行理解上面的代码。
- 我们的自定义转换器命名为Outlier_Remover,它有两个基类,即BaseEstimator和TransformerMixin。
- 我们使用init方法将数字特征的名称列表作为输入传递给自定义转换器类。这是因为我们将仅在数字特征中找到离群值。
- 在fit()方法中我们不做任何操作。
- 所有与离群值相关的工作都在transform方法中完成。首先,我们找到了quartile1、quartile2和quartile3的值。接下来,使用找到的值,我们计算了四分位距。
- 现在,我们有了quartile1、quartile3和四分位距的值,我们将用数据的中位数替换大于(quartile3 + 1.5 x 四分位距)和小于(quartile1–1.5 x 四分位距)的离群值。
- 最后,我们返回转换后的数据,即X。
让我们再举一个例子:我们将创建一个自定义转换器来从我们的数据中删除无用的特征(也称为列)。
## 创建一个自定义转换器来删除无用的特征class Remove_Useless_Features(BaseEstimator, TransformerMixin): def __init__(self): pass def fit(self, X, y=None): return self def transform(self, X, y=None): X.drop(columns=['Alley','PoolQC'], axis=1, inplace=True) return X
同样,让我们逐行理解这段代码。
- 我们的自定义转换器命名为Remove_Useless_Features,它有两个基类,即BaseEstimator和TransformerMixin。这将使我们能够使用fit_transform()、get_params()和set_params()方法。
- 在这种情况下,init和fit()方法中都不需要实现任何内容。
- transform()方法使用pandas的drop()方法从数据集中删除无用的特征,并返回转换后的数据集。
我希望上述示例能让您对自定义转换器的概念有所了解。如果您有任何疑问,请随时评论。此外,如果您想了解如何在Scikit-Learn管道中使用这些自定义转换器,请查看我的其他文章。
本文中的代码来自我的Kaggle账号代码。查看完整代码:
房价预测 – sklearn管道
使用Kaggle Notebooks探索和运行机器学习代码 | 使用房价数据 – 高级回归…
www.kaggle.com
结束语
希望您喜欢本文。关注我在VoAGI上阅读更多类似文章。
与我联系
网站
发送邮件至shivamshinde92722@gmail.com