让我说我有一个熊猫数据框,我想在这个函数的帮助下,只规范化一些属性,而不是整个数据框:
preprocessing.normalize
我想将这些规范化的列放到我的数据框中。但我不能,因为它有不同的格式(numpy数组)。
我已经看过如何以其他方式进行规范化,例如我喜欢这样:
s0 = X.iloc[:,13:15]
X.iloc[:,13:15] = (s0 - s0.mean()) / (s0.max() - s0.min())
X.head()
但我真的需要使用sklearn来做。 谢谢,Stack!
答案 0 :(得分:3)
您正在做的是Min-max缩放。 scikit中的"normalize"
具有与您想要做的不同的含义。
试试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'])
现在假设您只希望min-max缩放列A和C:
from sklearn.preprocessing import MinMaxScaler
minmax = MinMaxScaler()
df[['A', 'C']] = minmax.fit_transform(df[['A', 'C']])
答案 1 :(得分:1)
(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以及所选的缩放器。