Нормализация гребня питона
Я генерирую простую линейную модель, в которой переменные 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 незначителен. Больше внимания уделяется линейной части — результат близок к чистой линейной регрессии.