Press "Enter" to skip to content

使用Scikit-Learn类创建自定义转换器的简单方法

在本文中,我将解释如何使用Scikit-Learn类创建一个根据我们的处理需求进行转换的转换器。

Photo by Jeffery Ho on Unsplash

数据预处理是数据科学生命周期中最重要的步骤之一。作为非常流行的机器学习库,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()方法接受三个参数:

  1. self
  2. X(独立特征值)
  3. 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

让我们逐行理解上面的代码。

  1. 我们的自定义转换器命名为Outlier_Remover,它有两个基类,即BaseEstimator和TransformerMixin。
  2. 我们使用init方法将数字特征的名称列表作为输入传递给自定义转换器类。这是因为我们将仅在数字特征中找到离群值。
  3. 在fit()方法中我们不做任何操作。
  4. 所有与离群值相关的工作都在transform方法中完成。首先,我们找到了quartile1、quartile2和quartile3的值。接下来,使用找到的值,我们计算了四分位距。
  5. 现在,我们有了quartile1、quartile3和四分位距的值,我们将用数据的中位数替换大于(quartile3 + 1.5 x 四分位距)和小于(quartile1–1.5 x 四分位距)的离群值。
  6. 最后,我们返回转换后的数据,即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

同样,让我们逐行理解这段代码。

  1. 我们的自定义转换器命名为Remove_Useless_Features,它有两个基类,即BaseEstimator和TransformerMixin。这将使我们能够使用fit_transform()、get_params()和set_params()方法。
  2. 在这种情况下,init和fit()方法中都不需要实现任何内容。
  3. transform()方法使用pandas的drop()方法从数据集中删除无用的特征,并返回转换后的数据集。

我希望上述示例能让您对自定义转换器的概念有所了解。如果您有任何疑问,请随时评论。此外,如果您想了解如何在Scikit-Learn管道中使用这些自定义转换器,请查看我的其他文章。

本文中的代码来自我的Kaggle账号代码。查看完整代码:

房价预测 – sklearn管道

使用Kaggle Notebooks探索和运行机器学习代码 | 使用房价数据 – 高级回归…

www.kaggle.com

结束语

希望您喜欢本文。关注我在VoAGI上阅读更多类似文章。

与我联系

LinkedIn

网站

发送邮件至shivamshinde92722@gmail.com

Leave a Reply

Your email address will not be published. Required fields are marked *