如何找到 MinMaxScaler 对象中的行数和列数?

问题描述

我制作了一个 csv 文件的数据帧并将其传递给 train_test_split,然后使用 MinMaxScaler 缩放整个 X 和 Y 数据帧,但现在我想知道行和列的基本数量,但不能。

df=pd.read_csv("cancer_classification.csv")
from sklearn.model_selection import train_test_split
X = df.drop("benign_0__mal_1",axis=1).values
y = df["benign_0__mal_1"].values
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.33,random_state=42)
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_train = scaler.fit(X_train)
X_test = scaler.fit(X_test)
X_train.shape

这是抛出以下错误

AttributeError Traceback(最近一次调用最后一次) 在 () ----> 1 X_train.shape

AttributeError: 'MinMaxScaler' 对象没有属性 'shape'

我阅读了文档并且能够使用 scale_ 找到行数,但无法找到列。 这就是答案的样子,但我找不到可以提供帮助的属性

enter image description here

解决方法

MinMaxScaler 是一个对象,它可以fit 自身到某些数据,也可以transform 该数据。有

  • fit 方法使缩放器的参数适合该数据。然后它返回 MinMaxScaler 对象
  • transforms 方法根据缩放器的拟合参数转换数据。然后返回转换后的数据。
  • fit_transform 方法首先使缩放器适合该数据,然后对其进行转换并返回数据的转换版本。

在您的示例中,您将 MinMaxScaler 对象本身视为数据! (见第一个要点)

同一个 MinMaxScaler 不应该在不同的数据集上拟合两次,因为它的内部值会改变。您永远不应该在测试数据集上安装 minmaxscaler,因为这是将测试数据泄漏到模型中的一种方式。您应该在训练数据上执行 fit_transform(),在测试数据上执行 transform()

这里的答案也可能有助于解释:fit-transform on training data and transform on test data

当您调用 StandardScaler.fit(X_train) 时,它所做的是根据 X_train 中的值计算均值和方差。然后调用 .transform() 将通过减去均值并除以方差来转换所有特征。为方便起见,可以使用 fit_transform() 一步完成这两个函数调用。

您想仅使用训练数据来拟合缩放器的原因是,您不希望使用来自测试数据的信息来偏向模型。

如果您将 fit() 用于测试数据,您将计算每个特征的新均值和方差。理论上,如果您的测试集和训练集具有相同的分布,这些值可能非常相似,但在实践中通常并非如此。

相反,您只想使用在训练数据上计算的参数来转换测试数据。