【问题标题】:How to not standarize target data in scikit learn regression如何在 scikit 学习回归中不标准化目标数据
【发布时间】:2023-03-17 12:15:01
【问题描述】:

我正在尝试在 csv 格式的铜矿企业数据集中预测未来的利润数据。

我读取了数据:

data = pd.read_csv('data.csv')

我拆分数据:

data_target = data[target].astype(float)
data_used = data.drop(['Periodo', 'utilidad_operativa_dolar'], axis=1)
x_train, x_test, y_train, y_test = train_test_split(data_used, data_target, test_size=0.4,random_state=33)

创建一个 svr 预测器:

clf_svr= svm.SVR(kernel='rbf')

标准化数据:

from sklearn.preprocessing import StandardScaler
scalerX = StandardScaler().fit(x_train)
scalery = StandardScaler().fit(y_train)

x_train = scalerX.transform(x_train)
y_train = scalery.transform(y_train)
x_test = scalerX.transform(x_test)
y_test = scalery.transform(y_test)

print np.max(x_train), np.min(x_train), np.mean(x_train), np.max(y_train), np.min(y_train), np.mean(y_train)

然后预测:

y_pred=clf.predict(x_test)

并且预测数据也是标准化的。我希望预测数据为原始格式,我该怎么做?

【问题讨论】:

    标签: python machine-learning scikit-learn svm predict


    【解决方案1】:

    您可能希望使用 y 缩放器的 inverse_transform 方法。请注意,您可以使用管道更简洁地完成所有这些操作,如下所示

    from sklearn.pipeline import Pipeline
    from sklearn.preprocessing import StandardScaler
    from sklearn.svm import SVR
    
    pipeline = Pipeline([('scaler', StandardScaler()), ('estimator', SVR(kernel="rbf"))])
    
    y_scaler = StandardScaler()
    y_train = y_scaler.fit_transform(y_train)
    pipeline.fit(x_train, y_train)
    y_pred = y_scaler.inverse_transform(pipeline.predict(x_test))
    

    许多人只会在全球范围内缩放目标,然后在没有太多过度拟合的情况下逃脱。但你做得很好,没有为此而堕落。如代码所示,AFAIK 对 y 数据使用单独的缩放器是唯一的方法。

    【讨论】:

    • 谢谢!我没有把目光放在 inverse_transform() 上,真丢脸。
    • 使用未用于特征的不同缩放器缩放目标是否至关重要?
    • 一个已经适合特征的缩放器,假设有多个特征,在缩放一个目标时会出错,因为它期望n_features维度
    【解决方案2】:

    我知道这个问题很老,当时答案是正确的,但现在有一种 scikit-learn 方法可以做到这一点。

    http://scikit-learn.org/dev/modules/compose.html#transforming-target-in-regression

    【讨论】:

      【解决方案3】:

      正如其他人已经提到的,您应该使用inverse_transform() 方法从之前应用的相应转换中检索原始数据。 另一个需要思考的问题是,如果我们的意图是预测 Real Target 'y' 值,为什么需要转换 Target y_test, y_train?我们还不如在预测期间保持其原始状态。

      另外(在 Python 3.7.3 中,sklearn 0.20.3 中),当您像上面所做的那样标准化像 y_test, y_train 这样的单列行时,您会无意中接收到作为 numpy 数组的输出,这对 Dataframe 操作没有帮助;

      例如:

      当您确实指定输出应类似于单列数据框时,您可能会遇到更多问题;

      例如:

      解决方案:您必须使用正确的子集选择运算符 (.loc/.iloc) 在 列表 中明确声明您的目标列名称/索引。 p>

      例如:

      注意:在实时 ML 项目中,测试数据是在您的模型准备好在生产阶段进行调整时在未来到达或实时收集的数据。

      X_train, X_test 这样的标准化训练-测试特征集有助于轻松比较特征与均值的差异,并且对于要求正则化主成分分析技术很有用特征变量的标准化。

      【讨论】:

      • 你是如何找到“解决方案”的?
      • @paradoxlover 我只是想确保生成的数据结构是“DataFrame”,因此使用 pandas .iloc/.loc 函数对“y_train”进行子集化。
      猜你喜欢
      • 2021-09-22
      • 2016-10-01
      • 1970-01-01
      • 2013-01-29
      • 2016-01-19
      • 2021-05-03
      • 2016-03-12
      • 2014-03-31
      • 2015-08-05
      相关资源
      最近更新 更多