【问题标题】:Partial fit multivariate SGDRegressor部分拟合多元 SGDRegressor
【发布时间】:2014-05-19 20:30:18
【问题描述】:

我目前正在尝试使用来自 scikits learn 的 SGDRegressor 来解决大型数据集 X ~= (10^6,10^4) 上的多变量目标问题。因此,我使用以下代码部分生成设计矩阵 (X),其中每次迭代都会产生大约 (10^3,10^4) 的批次:

design = self.__iterX__(events)
reglins = [linear_model.SGDRegressor(fit_intercept=True) for i in range(nTargets)]

for X,times in design:
    for i in range(nTargets):
        reglins[i].partial_fit(X,y.ix[times].values[:,i])

但是我得到以下堆栈跟踪:

File ".../Enthought/Canopy_64bit/User/lib/python2.7/site-    packages/sklearn/linear_model/stochastic_gradient.py", line 841, in partial_fit
    coef_init=None, intercept_init=None)
File ".../Enthought/Canopy_64bit/User/lib/python2.7/site-packages/sklearn/linear_model/stochastic_gradient.py", line 812, in _partial_fit
    sample_weight, n_iter)
File ".../Enthought/Canopy_64bit/User/lib/python2.7/site-packages/sklearn/linear_model/stochastic_gradient.py", line 948, in _fit_regressor
    intercept_decay)
File "sgd_fast.pyx", line 508, in sklearn.linear_model.sgd_fast.plain_sgd (sklearn/linear_model/sgd_fast.c:8651)
    ValueError: floating-point under-/overflow occurred.

环顾四周,这似乎是由于没有正确规范化 X 造成的。我知道 scikits learn 对此有多种功能,但是鉴于我以块为单位生成 X,是否足以简单地标准化每个块,或者我需要找出一种方法来一次标准化整个列?

顺便说一句,partial_fit 函数不允许多变量目标是否有特殊原因?

【问题讨论】:

  • “简单地标准化每个块就足够了吗”——取决于。 StandardScaler 需要适合数据,然后应用于其他数据。 Normalizer 是无状态的,因此无需拟合即可应用,但它比高斯特征更适合频率数据。

标签: machine-learning scikit-learn regression


【解决方案1】:

你可以适应一个块并应用到其他块:

from sklearn import preprocessing
scaler = preprocessing.StandardScaler()
x1 = scalar.fit_transform(X_block_1)
xn = scalar.transform(X_block_n)

您可以选择其他归一化方法from this page

【讨论】:

  • 感谢初楠的回复。不幸的是,我认为这只有在第一个块(或任何单个块)的统计数据代表整个数据时才有效。在我的例子中情况并非如此。现在我只是运行整个 X 代来计算平均值和标准,然后在我第二次的路上计算 zscore。不是最好的解决方案。
猜你喜欢
  • 2015-10-03
  • 2018-11-06
  • 2017-02-03
  • 2022-01-25
  • 1970-01-01
  • 2021-07-20
  • 2014-08-28
  • 2017-06-28
  • 2015-08-23
相关资源
最近更新 更多