Нормализация гребня питона

Я генерирую простую линейную модель, в которой переменные X (размерности D) являются мультинормальными с 0 ковариациями. Только первые 10 переменных имеют истинные коэффициенты 1, остальные имеют коэффициенты 0. Следовательно, теоретически результаты регрессии гребня должны быть истинными коэффициентами, деленными на (1+C), где C - штрафная константа.

import numpy as np
from sklearn import linear_model
def generate_data(n):
    d = 100
    w = np.zeros(d)
    for i in range(0,10):
        w[i] = 1.0

    trainx = np.random.normal(size=(n,d))
    e = np.random.normal(size=(n))
    trainy = np.dot(trainx, w) + e

    return trainx, trainy

Тогда я использую:

n = 200
x,y = generate_data(n)
regr = linear_model.Ridge(alpha=4,normalize=True)
regr.fit(x, y)
print(regr.coef_[0:20])

При нормализации = True, я получаю, что первые 10 коэффициентов находятся где-то в 20% (т.е. 1/(1+4)) от истинного значения 1. Когда normalize = False, я получаю первые 10 коэффициентов, чтобы быть около 1, что те же результаты, что и простая модель линейной регрессии. Более того, поскольку я генерирую данные со средним значением = 0 и стандартным значением = 1, normalize = True не должен ничего делать, поскольку данные уже "нормализованы". Может кто-нибудь объяснить мне, что здесь происходит? Спасибо!

2 ответа

Решение

Важно понимать, что нормализация и стандартизация - это не одно и то же, и оба не могут быть выполнены одновременно. Вы можете либо нормализовать, либо стандартизировать.

Часто стандартизация относится к преобразованию данных таким образом, чтобы они имели среднее значение 0 и единицу (1) дисперсию. Например, это может быть достигнуто путем удаления среднего значения и деления на стандартное отклонение. В этом случае это будет функция (столбец).

Обычно нормализация относится к преобразованию значений данных в диапазон от 0 до 1. Например, это может быть достигнуто путем деления на длину вектора. Но это не значит, что среднее будет 0, а дисперсия 1.

После генерации trainx, trainy они еще не нормализованы. Может быть, распечатать его, чтобы увидеть ваши результаты.

  • Так когда normalize=True, trainx будет нормализовано путем вычитания среднего значения и деления на l2-норму (согласно sklearn).
  • когда normalize=False, trainx останется как есть.

Если вы делаете normalize=True, каждый столбец признаков делится на свою норму L2, другими словами, величина каждого столбца признаков уменьшается, что приводит к тому, что оценочные коэффициенты становятся больше (βX должен быть более или менее постоянным; чем меньше X, больше β). Когда коэффициенты больше, налагается больший штраф L2. Таким образом, функция уделяет больше внимания штрафу L2, а не линейной части (Xβ). В результате оценки коэффициентов линейной части не столь точны по сравнению с чистой линейной регрессией.

Напротив, если normalize=False, X больше, β меньше. Учитывая ту же альфу, штраф L2 незначителен. Больше внимания уделяется линейной части — результат близок к чистой линейной регрессии.

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