Scikit-learn: роль весов в ридж-регрессии

Я использую библиотеку scikit-learn для выполнения гребенчатой ​​регрессии с весами на отдельных образцах. Это может быть сделано: esimator.fit(X, y, sample_weight=some_array). Интуитивно я ожидаю, что большие веса означают большую релевантность для соответствующей выборки.

Однако я протестировал описанный выше метод на следующем двумерном примере:

    from sklearn import linear_model
    import numpy
    import matplotlib.pyplot as plt

    #Data
    x= numpy.array([[0], [1],[2]])
    y= numpy.array([[0], [2],[2]])
    sample_weight = numpy.array([1,1, 1])
    #Ridge regression
    clf = linear_model.Ridge(alpha = 0.1)
    clf.fit(x, y, sample_weight = sample_weight)
    #Plot
    xp = numpy.linspace(-1,3)
    yp=list()
    for x_i in xp:    
        yp.append(clf.predict(x_i)[0,0])
    plt.plot(xp,yp)
    plt.hold(True)
    x = list(x)
    y = list(y)
    plt.plot(x,y,'or')

Я запускаю этот код и запускаю его снова, удваивая вес первого образца:

sample_weight = numpy.array([2,1, 1])

Полученные линии уходят от выборки, которая имеет больший вес. Это противоречит здравому смыслу, поскольку я ожидаю, что выборка с большим весом будет иметь большее значение.

Я неправильно использую библиотеку или в ней есть ошибка?


person Marco    schedule 12.07.2013    source источник
comment
А вы пробовали сделать наоборот? Возможно, веса перепутаны. Я нашел похожие вещи в классе логистической регрессии. Попробуйте установить его на numpy.array([0.5,1,1]).   -  person Alex S    schedule 15.07.2013
comment
Спасибо, это то, что я планирую сделать. Однако я хотел бы понять, почему веса перевернуты.   -  person Marco    schedule 15.07.2013
comment
Ну вот так же. Документация для многих методов в sklearn обескураживающе проста.   -  person Alex S    schedule 16.07.2013


Ответы (1)


Веса не перевернуты. Возможно, вы допустили глупую ошибку, или в sklearn была ошибка, которая теперь исправлена. Код

from sklearn import linear_model
import numpy
import matplotlib.pyplot as plt

#Data
x = numpy.array([[0], [1],[2]])
y = numpy.array([[0], [2],[2]])
sample_weight1 = numpy.array([1, 1, 1])
sample_weight2 = numpy.array([2, 1, 1])

#Ridge regressions
clf1 = linear_model.Ridge(alpha = 0.1).fit(x, y, sample_weight = sample_weight1)
clf2 = linear_model.Ridge(alpha = 0.1).fit(x, y, sample_weight = sample_weight2)

#Plot
plt.scatter(x,y)
xp = numpy.linspace(-1,3)
plt.plot(xp,clf1.predict(xp.reshape(-1, 1)))
plt.plot(xp,clf2.predict(xp.reshape(-1, 1)))
plt.legend(['equal weights', 'first obs weights more'])
plt.title('Increasing weight of the first obs moves the line closer to it');

строит мне этот график, где вторая линия (с увеличенным первым весом) ближе к первому наблюдению:

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

person David Dale    schedule 23.11.2017