【问题标题】:scaler.fit_transform return Incorrect informationscaler.fit_transform 返回不正确的信息
【发布时间】:2022-01-10 23:25:24
【问题描述】:

数据框样本来自:
https://pastebin.com/hQxWp9wZ

没有通过的测试是:

assert list(np.around(X_test_standard_scaled.max(axis=0), decimals=2)) == [1.61, 3.12, 3.3,
                                                                           2.97], 'Wrong scaled test values'

我得到的值:

[1.53, 3.12, 2.97, 2.89]

我不知道代码有什么问题:

def scale_test_features(X_test, scaler):
    if type(scaler) == type(MinMaxScaler(feature_range=(0, 1))):
        return scaler.fit_transform(X_test)
    if type(scaler) == type(StandardScaler()):
        return scaler.fit_transform(X_test)

在我不断得到的代码的测试集中 'Wrong scaled test values' 但一切都“按部就班”。即使在上述帮助下完成修复后,我仍然收到“错误缩放测试值”的错误。我使用的其他功能:

def scale_features(X_train, scale_type):
    if scale_type == 'minmax':
        min_max_scaler = MinMaxScaler(feature_range=(0, 1))
        X_train_scaled= min_max_scaler.fit_transform(X_train)
        return min_max_scaler,X_train_scaled
    if  scale_type == 'standard':
        scaler = StandardScaler()
        X_train_scaled = scaler.fit_transform(X_train)
        return scaler,X_train_scaled
def split_to_train_and_test(X, y, test_ratio, rand_state):
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_ratio, random_state=rand_state)
    return X_train, X_test, y_train, y_test
def load_dataset(file_name, label_column): 
    if len(file_name) != 0 and len(label_column) != 0:
        df = pd.read_csv(file_name)
        TRAINING_FEATURES = df.columns[df.columns != label_column]
        TARGET_FEATURE = label_column
        X = df[TRAINING_FEATURES]
        y = df[TARGET_FEATURE]
        return X,y

你能告诉我其余的是否有可能导致“错误缩放测试值”的特殊错误吗?

【问题讨论】:

  • 您到底想达到什么目的?检查type 是否指向同一个if 语句中定义的对象没有多大意义。另外,在评估类型时,首选方法是isinstance
  • 我想知道参数缩放器的类型(MinMaxScaler 或 StandardScaler)并按类型缩放 X_test
  • 请提供输入数据的示例以及错误的回溯。
  • @saiden 我添加了 DF 和我希​​望收到但没有收到的值

标签: python scikit-learn


【解决方案1】:

一种可能的方法如下。请注意,在探测对象的类时,首选方法是isinstance,而不是==

def scale_test_features(X_test, scaler):
    if isinstance(scaler, MinMaxScaler):
        print('Using the Min-Max scaler')
        return scaler.fit_transform(X_test)
    elif isinstance(scaler, StandardScaler):
        print('Using the standard scaler'):
        return scaler.fit_transform(X_test)

除此之外,由于您的代码缺乏可重复性,我将假设在调用拆分时您没有指定任何 random_state,这就是为什么每次调用该函数时,您的数据集最终可能会得到不同的值。即便如此,我也不会过多抱怨这些值不完全相同,因为它们已经足够接近了。

附带说明,您提供的代码过于复杂,这里有一些改进建议:

  • split_to_train_and_test 函数在 scikit-learn 中已经定义的 train_test_split 之上没有添加任何内容,您可以直接调用原始函数,有效提高可读性。
  • ALL_CAPS 变量名通常是为常量保留的,比如pi,参见pep8
  • 特征缩放拆分后通常不是一个好主意,因为您可能会根据拆分的方式对数据集产生偏差:在拆分之前进行。
  • scale_features 中也不需要缩放器,因为您只对缩放后的特征感兴趣。
  • 为了鼓励帮助,请(请)尝试发布一个问题,任何人都可以复制粘贴到他们的机器上进行调试,而不需要任何不必要的、浪费时间的逆向工程。

希望对你有帮助。

【讨论】:

  • 最后我意识到我的错误是什么,我写了return scaler.transform(X_test),我不得不写X_test_scaled = scaler.transform(X_test) return X_test_scaled 有趣的是为什么它这么重要?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多