Пути коэффициентов для гребневой регрессии в scikit-learn

Начиная с pandas DataFrame, d_train (774 строки):

введите здесь описание изображения

Идея состоит в том, чтобы следовать примеру здесь, чтобы исследовать пути коэффициента Риджа.

В этом примере, вот типы переменных:

X, y, w = make_regression(n_samples=10, n_features=10, coef=True,
                          random_state=1, bias=3.5)
print X.shape, type(X), y.shape, type(y), w.shape, type(w)

>> (10, 10) <type 'numpy.ndarray'> (10,) <type 'numpy.ndarray'> (10,) <type'numpy.ndarray'>

Чтобы избежать проблемы, упомянутой в этом обсуждении stackoverflow, я преобразовываю все в пустые массивы:

predictors = ['p1', 'p2', 'p3', 'p4']
target = ['target_bins']
X = d_train[predictors].as_matrix()
### X = np.transpose(d_train[predictors].as_matrix())
y = d_train['target_bins'].as_matrix()
w = numpy.full((774,), 3, dtype=float)
print X.shape, type(X), y.shape, type(y), w.shape, type(w)
>> (774, 4) <type 'numpy.ndarray'> y_shape: (774,) <type 'numpy.ndarray'>     w_shape: (774,) <type 'numpy.ndarray'>

А затем я просто запустил (а) точный код в примере, (б) добавил параметры fit_intercept = True, normalize = True в вызов ridge (мои данные не масштабируются), чтобы получить то же сообщение об ошибке:

my_ridge = Ridge()
coefs = []
errors = []
alphas = np.logspace(-6, 6, 200)

for a in alphas:
    my_ridge.set_params(alpha=a, fit_intercept = True, normalize = True)
    my_ridge.fit(X, y)
    coefs.append(my_ridge.coef_)
    errors.append(mean_squared_error(my_ridge.coef_, w))
>> ValueError: Found input variables with inconsistent numbers of samples: [4, 774]

Как видно из закомментированного раздела кода, я также попробовал «тот же самый» код, но с транспонированной X-матрицей. Я также пытался масштабировать данные перед созданием файла X matrix. Получил такое же сообщение об ошибке.

Наконец, я сделал то же самое, используя «RidgeClassifier», и мне удалось получить другое сообщение об ошибке.

>> Found input variables with inconsistent numbers of samples: [1, 774]

Вопрос: я понятия не имею, что здесь происходит. Не могли бы вы помочь?

Использование Python 2.7 на Canopy 1.7.4.3348 (64-разрядная версия) с scikit-learn 18.01-3 и pandas 0.19.2-2

Спасибо.


person user2738815    schedule 03.02.2017    source источник


Ответы (1)


Вам нужно иметь столько весов w, сколько у вас есть функций (поскольку вы изучаете один вес для каждой функции), но в вашем коде размер вектора весов равен 774 (это количество строк в обучающем наборе данных), это почему это не сработало. Измените код на следующий (вместо этого иметь 4 веса), и все будет работать:

w = np.full((4,), 3, dtype=float) # number of features = 4, namely p1, p2, p3, p4
print X.shape, type(X), y.shape, type(y), w.shape, type(w)
#(774L, 4L) <type 'numpy.ndarray'> (774L,) <type 'numpy.ndarray'> (4L,) <type 'numpy.ndarray'>

Теперь вы можете запустить остальной код из http://scikit-learn.org/stable/auto_examples/linear_model/plot_ridge_coeffs.html#sphx-glr-auto-examples-linear-model-plot-ridge.-coeffs-py, чтобы увидеть, как веса и ошибки меняются в зависимости от параметра регуляризации alpha с поиском по сетке, и получить следующие цифры

введите здесь описание изображения

person Sandipan Dey    schedule 22.02.2017