【问题标题】:Normalization sklearn标准化sklearn
【发布时间】:2018-04-16 19:22:43
【问题描述】:

假设我有一个 pandas 数据框,我想借助此函数仅规范化一些属性,而不是整个数据框:

preprocessing.normalize

我想将这些规范化的列替换到我的数据框中。但我不能,因为它有不同的格式(numpy 数组)。

我已经看到了如何通过其他方式进行标准化,例如我这样做了:

s0 = X.iloc[:,13:15] 
X.iloc[:,13:15] = (s0 - s0.mean()) / (s0.max() - s0.min())
X.head()

但我真的需要使用 sklearn 来完成。 谢谢,堆栈!

【问题讨论】:

  • 您是指s0 - s0.min() 还是s0 - s0.mean()?前者是最小/最大比例,后者是什么?

标签: python python-3.x pandas scikit-learn normalization


【解决方案1】:

您正在做的是最小-最大缩放。 "normalize" 在 scikit 中的含义与您想要做的不同。

试试MinMaxScaler

大多数 sklearn 转换器仅输出 numpy 数组。对于数据框,您可以简单地将列重新分配给数据框,如下例所示:

import pandas as pd
import numpy as np

df = pd.DataFrame(data=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), columns=['A', 'B', 'C'])

现在假设您只想最小-最大缩放 A 和 C 列:

from sklearn.preprocessing import MinMaxScaler
minmax = MinMaxScaler()
df[['A', 'C']] = minmax.fit_transform(df[['A', 'C']])

【讨论】:

    【解决方案2】:

    (s0 - s0.mean()) / (s0.max() - s0.min()) 被称为平均归一化,据我所知,Scikit-learn 中没有转换器来执行此操作转型。

    MinMaxScaler 按照以下公式进行转换:(s0 - s0.min()) / (s0.max() - s0.min())

    您可以使用 scikit-learn 对选定的变量进行转换,如下所示:

    肮脏的方式:

    scaler = MinMaxScaler() # or any other scaler from sklearn
    scaler.fit(X[[var1, var2, var20]])
    X_transf[[var1, var2, var20]] = scaler.transform(X[[var1, var2, var20]])
    

    使用 ColumnTransfomer 的更好方法:

    features_numerical = [var1, var2, var20]
    numeric_transformer = Pipeline(steps=[('scaler', StandardScaler())])
    preprocessor = ColumnTransformer(
        transformers=[('numerical', numeric_transformer, features_numerical)], remainder='passthrough'}) # to keep all other features in the data set
    preprocessor.fit_transform(X)
    

    返回的变量是一个numpy数组,所以需要重新转换成pandas数据框并添加变量名。

    更多关于如何使用列转换器的信息来自 sklearn here

    您需要从 sklearn 导入 ColumnTransformer 和 Pipeline,以及选择的缩放器。

    【讨论】:

      猜你喜欢
      • 2018-08-02
      • 2019-05-30
      • 2021-08-04
      • 2017-11-10
      • 2021-05-03
      • 1970-01-01
      • 1970-01-01
      • 2021-03-17
      • 2018-07-14
      相关资源
      最近更新 更多