【问题标题】:Normalization of the data for regression analysis回归分析的数据归一化
【发布时间】:2019-06-13 14:24:27
【问题描述】:

我有 pandas Dataframe,我正在使用它进行一些回归分析。我使用以下方法对数据进行了标准化:

working_df = df.div(np.sqrt(np.sum(np.power(df.values, 2), axis=1)), axis=0)

这个Dataframe包含35列作为特征,所以我选择数据集如下:

X = working_df.iloc[:, 0:35]
y = target_df['target_property']

然后我使用 Sklearn 进行训练 - 测试拆分:

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0) 
sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)

我的问题是: 我真的需要执行 sc.transform(X_train) 和 sc.transform(X_test),因为我的数据已经在数据帧中标准化了吗?如果是这样,我是否需要在执行 sc.transform(X_train) 之前在 X_train 中执行 sc.fit,如果不是,为什么?通过这样做,我获得了线性回归的 R2 为 0.46,核岭回归的 R2 为 -0.21,学习率为 0.3 的梯度增强回归器的 R2 为 0.62。这些结果似乎有些令人困惑,您能帮我理解一下吗?

【问题讨论】:

    标签: machine-learning linear-regression


    【解决方案1】:

    我真的需要执行 sc.transform(X_train) 和 sc.transform(X_test),因为我的数据已经在数据帧中标准化了吗?

    两者有很大的不同。在您的数据框中,您所做的是 l2 标准化。也就是说,每一行都被认为是一个向量,然后 l2-norm 被减少到 1。来自 sklearn 的 StandardScaler 对每一行进行正常缩放,它减去它的平均值,然后除以它的方差。如果行数据来自高斯分布,它将其转换为具有 0 均值和单位方差的适当正态分布。

    至于你应该为回归做哪些转换——我认为没有任何通用的方法。 L2 归一化和标准缩放是一般数据转换,可能会或可能不会提高回归性能,只能凭经验回答。关于它们是应该结合使用还是只使用其中一个的问题也是如此。

    【讨论】:

      猜你喜欢
      • 2017-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-17
      • 2018-09-16
      • 2018-12-26
      • 2023-03-12
      • 2018-01-06
      相关资源
      最近更新 更多