Результаты SageMaker для линейного обучения не точны?

У меня проблемы с результатами, которые я получаю от линейного ученика 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})

У вас есть какое-то объяснение наблюдаемым неточным результатам?

Спасибо Николас

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
564
1

Ответы 1

Две возможные причины, по которым вы не получаете точных результатов, - это стохастический градиентный спуск (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])

Другие вопросы по теме