У меня проблемы с результатами, которые я получаю от линейного ученика AWS (SageMaker).
А именно, я пытался воспроизвести результаты, которые я получил от R, SAS или Knime (с использованием линейной регрессии), но, к сожалению, то, что я получаю от линейного ученика, отличается от упомянутых трех других способов его вычисления.
Я пробовал разные гиперпараметры и конфигурации, но получаю неточные результаты регрессии даже в очень тривиальном случае синтетически сгенерированных данных, удовлетворяющих соотношению
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})
У вас есть какое-то объяснение наблюдаемым неточным результатам?
Спасибо Николас






Две возможные причины, по которым вы не получаете точных результатов, - это стохастический градиентный спуск (SGD) и регуляризация, которые используются в Linear Learner. SGD и регуляризация - это то, что нужно делать для многих реальных проблем машинного обучения, но в этом игрушечном примере они приводят к неточным результатам.
SGD - это метод оптимизации, который, помимо других преимуществ, хорошо масштабируется с большими наборами данных. Он хорошо масштабируется по мере увеличения количества примеров и размеров. SGD плохо подходит для очень мелких задач. Для очень больших наборов данных SGD - единственное эффективное решение. С большими, средними и маленькими наборами данных SGD в Linear Learner работает так же, как и другие решатели, благодаря оптимизации, встроенной в алгоритм, такой как параллельное исследование нескольких настроек скорости обучения и других гиперпараметров. Но для этого примера набора данных, который имеет нулевой шум (связь между функциями и меткой детерминирована) и только 5 примеров, более точный и менее масштабируемый решатель подойдет лучше.
Регуляризация применяется по умолчанию в Linear Learner. Чтобы выключить, установите 'wd'=0.0 и 'l1'=0.0. Алгоритм исследует несколько значений регуляризации, включая отсутствие регуляризации, и выбирает модель с наилучшей точностью на наборе проверки или, если набор проверки отсутствует, наивысшей точностью на обучающих данных. Но из-за очень небольшого количества данных, доступных для изучения в этом случае, этот выбор, по сути, является случайным. Так что вполне вероятно, что окончательная модель использовала регуляризацию. Регуляризация приближает веса модели, но не смещение, к нулю, что может объяснить оценки параметров, упомянутые в сообщении: [0,91547656 1,9826275 3,023757] вместо [1,0 2,0 3,0]. Два веса были сдвинуты к нулю, и смещение было немного большим для компенсации.
Регуляризация чрезвычайно полезна в большинстве реальных приложений. Обучение модели с некоторой степенью регуляризации почти всегда является лучшим способом уменьшить ошибку обобщения, также известную как ошибка выборки. Использование регуляризации - это правильный выбор для реальных наборов данных, но он даст неточное решение в этом наборе данных, где нет шума и предположение о линейной модели совершенно верно.
Для точного решения проблемы линейной регрессии для небольшого набора данных используйте решатель, например QR-разложение. Примерами являются класс LinearRegression SKLearn или функция lm в R. Но имейте в виду, что эти методы будут иметь проблемы с масштабированием до больших наборов данных. И, что, возможно, более важно, мы должны отключить регуляризацию для точного решения в выборке, но точное решение обычно будет иметь худшую производительность для невидимых данных по сравнению с решением с регуляризацией.
В SKLearn реализовано несколько оптимизаторов, в том числе SGD. Вот пример применения решателя SGD в SKLearn к вашим данным примера. Регуляризация также включена по умолчанию в 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])