如何同时使用缩放和对数转换?

机器算法验证 Python 数据转换
2022-04-13 09:41:28

在继续使用更先进的技术之前,我正在创建一个常规线性回归模型来建立基线。我将我的数据缩放如下:

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train_std=pd.DataFrame(sc.fit_transform(X_train), columns=data.columns)
X_test_std=pd.DataFrame(sc.transform(X_test), columns=data.columns)

然而,这些变量大多有一个极端的偏斜(右尾),但我不知道如何对它们应用对数变换。

我会将日志转换应用于 X_train 和 X_test 数据集中的变量吗?在应用缩放之前我需要这样做吗?在将预测应用于 X_test 集方面,我只是想不出正确的方法来解决这个问题。有任何想法吗?

2个回答

您可以形成管道并随后应用标准缩放和日志转换。这样,您只需在训练数据上训练流水线回归器,然后在测试数据上使用它。对于每个输入,流水线回归器将在进行预测之前对输入进行标准化和对数转换。

import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import FunctionTransformer
from imblearn.pipeline import Pipeline

def log_transform(x):
    print(x)
    return np.log(x + 1)


scaler = StandardScaler()
transformer = FunctionTransformer(log_transform)
pipe = Pipeline(steps=[('scaler', scaler), ('transformer', transformer), ('regressor', your_regressor)], memory='sklearn_tmp_memory')

pipe.fit(X_train, y_train)
pipe.score(X_test, y_test)

要应用对数转换,您将使用 numpy. Numpy 作为 scikit-learn 和 pandas 的依赖项,因此它已经被安装。

import numpy as np

X_train = np.log(X_train)
X_test = np.log(X_test)

在将数据拆分为训练集和测试集之前,您可能还对在管道中更早地应用该转换感兴趣。

# Assumes X and y have already been defined

import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

X = np.log(X)

X_train, X_test, y_train, y_test = train_test_split(X, y)

sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

```