- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试为 x 的线性函数回归做一个简单的测试用例,但是 SGDRegressor 给了我一个错误的结果
import numpy as np
from sklearn.linear_model import SGDRegressor
from random import random
X = np.array(range(1000))
y = np.array([x + random() for x in X])
X = X.reshape(1000,1)
sgd = SGDRegressor()
sgd.fit(X, y)
print [sgd.intercept_, sgd.coef_]
[array([ -4.13761484e+08]), array([ -9.66320825e+10])]
最佳答案
我认为这与以下事实有关:将 random()
添加到 0 - 1000 的 int 对 int 的影响很小,因为它们会变大。使用 StandardScaler
作为预处理步骤的特征缩放可能会有所帮助。
根据 Sklearn 的实际使用提示:
Stochastic Gradient Descent is sensitive to feature scaling, so it is highly recommended to scale your data.
在修改您的示例并且不使用特征缩放之后,我注意到产生差异的参数组合是:loss、n_iter、eta0 和 power_t 是值得关注的 - eta0
是主要参数。 SGDRegressor 默认值对于这个问题来说太高了。
import numpy as np
from sklearn.linear_model import SGDRegressor
from random import random
import matplotlib.pyplot as plt
import itertools
X = np.array(range(1000))
y = np.array([x + random() for x in X])
X = X.reshape(-1,1)
fig,ax = plt.subplots(2, 2, figsize=(8,6))
coords = itertools.product([0,1], repeat=2)
for coord,loss in zip(coords, ['huber', 'epsilon_insensitive',
'squared_epsilon_insensitive', 'squared_loss']):
row,col = coord
ax[row][col].plot(X, y, 'k:', label='actual', linewidth=2)
for iteration in [5, 500, 1000, 5000]: # or try range(1, 11)
sgd = SGDRegressor(loss=loss, n_iter=iteration, eta0=0.00001, power_t=0.15)
sgd.fit(X, y)
y_pred = sgd.intercept_[0] + (sgd.coef_[0] * X)
print('Loss:', loss, 'n_iter:', iteration, 'intercept, coef:',
[sgd.intercept_[0], sgd.coef_[0]], 'SSE:', ((y - sgd.predict(X))**2).sum())
ax[row][col].plot(X, y_pred, label='n_iter: '+str(iteration))
ax[row][col].legend()
ax[row][col].set_title(loss)
plt.setp(ax[row][col].legend_.get_texts(), fontsize='xx-small')
plt.tight_layout()
plt.show()
这是打印出来的内容:
Loss: huber n_iter: 5 intercept, coef: [0.001638952911639975, 0.81740614500327669] SSE: 11185831.2597
Loss: huber n_iter: 500 intercept, coef: [0.021493133105072931, 1.0006662185561777] SSE: 137.574163486
Loss: huber n_iter: 1000 intercept, coef: [0.037047745354150396, 1.0006161110073943] SSE: 134.784858635
Loss: huber n_iter: 5000 intercept, coef: [0.12718334969902309, 1.0006005570641865] SSE: 116.13213201
Loss: epsilon_insensitive n_iter: 5 intercept, coef: [0.0046948965851395814, 1.0005010438267816] SSE: 157.935817311
Loss: epsilon_insensitive n_iter: 500 intercept, coef: [0.15261696111333306, 0.99963762449395877] SSE: 359.657749786
Loss: epsilon_insensitive n_iter: 1000 intercept, coef: [0.24224930972696881, 1.0006671880072746] SSE: 126.805962732
Loss: epsilon_insensitive n_iter: 5000 intercept, coef: [0.45888370500803022, 1.0003153040071979] SSE: 106.091573864
Loss: squared_epsilon_insensitive n_iter: 5 intercept, coef: [1774329.1447094907, -113423.55986319004] SSE: 4.08404355317e+18
Loss: squared_epsilon_insensitive n_iter: 500 intercept, coef: [42274920.182269663, -104909.90969312852] SSE: 1.01976866207e+18
Loss: squared_epsilon_insensitive n_iter: 1000 intercept, coef: [22843691.320190568, -37289.079052061767] SSE: 1.33664638821e+17
Loss: squared_epsilon_insensitive n_iter: 5000 intercept, coef: [3165399.5624849019, -3391.4406385053994] SSE: 3.12252668162e+15
Loss: squared_loss n_iter: 5 intercept, coef: [0.29805062264896459, 1.0006351157532956] SSE: 131.697873311
Loss: squared_loss n_iter: 500 intercept, coef: [0.66256539671809789, 1.0001831768155882] SSE: 154.277820955
Loss: squared_loss n_iter: 1000 intercept, coef: [0.13753387481588603, 1.0006362052460742] SSE: 117.151466521
Loss: squared_loss n_iter: 5000 intercept, coef: [0.38191334428572482, 1.0000364177730059] SSE: 89.3183008079
这是绘制出来的样子(注意:每次重新运行时都会发生变化,因此您的输出可能与我的不同):
值得注意的是,squared_epsilon_insensitive
的 y 轴突然消失,而其他三个损失函数仍在预期范围内。
为了好玩,将 power_t
从 0.15 更改为 0.5。这会产生影响的原因是默认的 learning_rate
参数是 'invscaling'
由 eta = eta0/pow(t, power_t)
计算的p>
关于python - SGDRegressor 无意义的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31443840/
我的 SGDRegressor 的模型拟合在大约 20'000 个训练记录后不会增加或减少其在验证集(测试)上的性能。即使我尝试将 penalty、early_stopping (True/False
我尝试为 x 的线性函数回归做一个简单的测试用例,但是 SGDRegressor 给了我一个错误的结果 import numpy as np from sklearn.linear_model imp
对于机器学习任务,我需要处理相当大的数据集。结果,我无法在我的算法中一次拟合整个数据集。我正在寻找一种方法来在数据集上部分训练我的算法,简单地提供新 block 是行不通的,因为我的算法将只是 ret
我目前正在尝试使用 scikits learn 中的 SGDRegressor 来解决大型数据集 X ~= (10^6,10^4) 上的多变量目标问题。因此,我使用以下代码部分生成设计矩阵 (X),其
您好,我正在尝试使用 scilearn 拟合一小组数据。 import numpy as np from sklearn import linear_model, model_selection X
我是 scikit-learn 的新手,但它满足了我的期望。现在,令人抓狂的是,唯一剩下的问题是我找不到如何打印(或者更好的是,写入一个小文本文件)它估计的所有系数,它选择的所有特征。有什么方法可以做
据我了解,scikit-learn 中的 LinearRegression 类和 SGDRegressor 类都执行线性回归。但是,只有 SGDRegressor 使用梯度下降作为优化算法。 那么Li
我正在尝试了解如何正确使用 scikit-learn 的 SGDRegressor 模型。为了适应数据集,我需要调用一个function fit(X,y),其中x 是一个形状为 (n_samples,
我正在租赁数据集上使用 scikit-learn 的 SGDRegressor 算法实现梯度下降,以根据面积预测租金,但得到奇怪的系数和截距,因此对租金的预测很奇怪。租赁数据集:rentals.csv
我正在 Kaggle 中解决一个标签为正数的知识问题。我尝试在 scikit-learn 中使用 SGDRegressor 来训练和测试模型。然而,学习模型的一些预测是否定的。 因此,我想知道是否有一
我是一名优秀的程序员,十分优秀!