Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SageMaker线性学习者结果不准确?_Python_Amazon Web Services_Machine Learning_Linear Regression_Amazon Sagemaker - Fatal编程技术网

Python SageMaker线性学习者结果不准确?

Python SageMaker线性学习者结果不准确?,python,amazon-web-services,machine-learning,linear-regression,amazon-sagemaker,Python,Amazon Web Services,Machine Learning,Linear Regression,Amazon Sagemaker,我对AWS(SageMaker)线性学习者提供的结果有异议 也就是说,我试图复制我从R、SAS或Knime(使用线性回归)得到的结果,但不幸的是,我从线性学习者那里得到的结果与前面提到的3种其他计算方法不同 我尝试了不同的超参数和配置,但即使在合成生成的数据满足关系的非常小的情况下,我也得到了不精确的回归结果 Y=X1+2*X2+3 在这种情况下,精确回归系数等于1,2和截距3。与上述其他软件不同,SageMaker线性学习器返回的值甚至不接近正确的值 例如,在一次示例运行中,我得到[0.915

我对AWS(SageMaker)线性学习者提供的结果有异议

也就是说,我试图复制我从R、SAS或Knime(使用线性回归)得到的结果,但不幸的是,我从线性学习者那里得到的结果与前面提到的3种其他计算方法不同

我尝试了不同的超参数和配置,但即使在合成生成的数据满足关系的非常小的情况下,我也得到了不精确的回归结果

Y=X1+2*X2+3

在这种情况下,精确回归系数等于1,2和截距3。与上述其他软件不同,SageMaker线性学习器返回的值甚至不接近正确的值 例如,在一次示例运行中,我得到[0.91547656 1.9826275 3.023757],这根本不令人满意。 你可以在这里看到我代码的相关部分

study=((1.0,3.0,10.0),(2.0,3.0,11.0),(3.0,2.0,10.0),(4.0,7.0,21.0),(5.0,4.0,16.0))
a = np.array(study).astype('float32')
other_columns=a[:,[0,1]]
labels = a[:,2]
buf = io.BytesIO()
smac.write_numpy_to_dense_tensor(buf, other_columns, labels)
buf.seek(0)
key = 'my-training-data'
boto3.resource('s3').Bucket(bucket).Object(os.path.join(prefix, 'train', key)).upload_fileobj(buf)
s3_train_data = 's3://{}/{}/train/{}'.format(bucket, prefix, key)
output_location = 's3://{}/{}/output'.format(bucket, prefix)

container = get_image_uri(boto3.Session().region_name, 'linear-learner')

import boto3
sess = sagemaker.Session()
linear = sagemaker.estimator.Estimator(container,
                                       role, 
                                       train_instance_count=1, 
                                       train_instance_type='ml.c4.xlarge',                                       
                                       output_path=output_location,
                                       sagemaker_session=sess)
linear.set_hyperparameters(feature_dim=2,
                           predictor_type='regressor',
                           loss='squared_loss',
                           epochs=50,
                           early_stopping_patience=100,
                           mini_batch_size=4)
linear.fit({'train': s3_train_data})
你对观察到的不准确的结果有什么解释吗

谢谢
Nikolas

无法获得准确结果的两个可能原因是随机梯度下降(SGD)和正则化,这两种方法都用于线性学习器。SGD和正则化对于许多现实世界的机器学习问题来说是正确的,但是在这个例子中,它们会导致不精确的结果

SGD是一种优化技术,除其他优点外,它可以很好地扩展到大型数据集。它随着示例数量和维度的增加而扩展。SGD不适合处理非常小的问题。对于超大数据集,SGD是唯一有效的解决方案。对于大、中、小数据集,线性学习器中的SGD与其他解算器的性能一样好,因为算法内置了优化功能,例如并行探索学习率和其他超参数的多种设置。但是对于这个示例数据集,它具有零噪声(特征和标签之间的关系是确定的),并且只有5个示例,更精确和可伸缩性较差的解算器会做得更好

正则化默认应用于线性学习器。要关闭它,请设置
'wd'=0.0
'l1'=0.0
。该算法探索多个正则化值,包括无正则化,并选择在验证集上具有最佳精度的模型,或者如果没有验证集,则选择在训练数据上具有最佳精度的模型。但由于在这种情况下可供学习的数据量非常小,因此选择基本上是随机的。因此,最终的模型很可能使用了正则化。正则化将模型权重(而非偏差)推向零,因此这可以解释文章[0.91547656 1.9826275 3.023757]中提到的参数估计,而不是[1.0 2.0 3.0]。将两个权重推向零,为了进行补偿,偏差略高

正则化在大多数实际应用中非常有用。用一定量的正则化训练模型几乎总是减少泛化误差(即样本外误差)的最佳方法。对于真实数据集,使用正则化是正确的做法,但在没有噪声且线性模型假设完全正确的数据集中,它将给出不精确的解决方案

对于小数据集上线性回归问题的精确解,请使用解算器,如QR分解。例如SKLearn的
LinearRegression
类,或者R中的
lm
函数。但是请记住,这些方法在扩展到更大的数据集时会遇到困难。也许更重要的是,我们应该关闭样本内精确解的正则化,但与正则化解相比,精确解在看不见的数据上的性能通常更差

SKLearn实现了几个优化器,包括SGD。下面是一个将SKLearn中的SGD解算器应用于示例数据的示例。在SKLearn中,默认情况下也会启用正则化。由于上述原因,解决方案不精确

>>> from sklearn import linear_model
>>> import numpy as np
>>> study=((1.0,3.0,10.0),(2.0,3.0,11.0),(3.0,2.0,10.0),(4.0,7.0,21.0),(5.0,4.0,16.0))
>>> a = np.array(study).astype('float32')
>>> other_columns=a[:,[0,1]]
>>> labels = a[:,2]
>>> reg = linear_model.SGDRegressor(max_iter=50)
>>> reg.fit(other_columns, labels)
SGDRegressor(alpha=0.0001, average=False, epsilon=0.1, eta0=0.01,
       fit_intercept=True, l1_ratio=0.15, learning_rate='invscaling',
       loss='squared_loss', max_iter=50, n_iter=None, penalty='l2',
       power_t=0.25, random_state=None, shuffle=True, tol=None, verbose=0,
       warm_start=False)
>>> reg.coef_
array([1.39560259, 2.17536485])
>>> reg.intercept_
array([0.77972575])