логистическая регрессия python - матрица дизайна patsy и категориальные данные

Совершенно новичок в python и машинном обучении.

Я пытаюсь построить модель логистической регрессии. Я работал в R, чтобы получить лямбда, и использовал перекрестную проверку, чтобы найти лучшую модель, и теперь переношу ее в python.

Здесь я создал матрицу дизайна и сделал ее разреженной. Затем запустили логистическую регрессию. Кажется, это работает.

Мой вопрос в том, что, поскольку я заявил, что мой термин item_number является категорией, как мне узнать, какая из них стала фиктивной переменной? И как узнать, какой коэффициент соответствует названию каждой категории?

from patsy import dmatrices
from sklearn.linear_model import LogisticRegression
from sklearn import preprocessing


def train_model (data, frm, Rlambda):
    y, X = dmatrices(frm , data, return_type="matrix")
    y = np.ravel(y)

    scaler = sklearn.preprocessing.MaxAbsScaler(copy=False)
    X_trans = scaler.fit_transform(X)

    model = LogisticRegression(penalty ='l2', C=1/Rlambda)
    model = model.fit(X_trans, y)

frm = 'purchase ~ price + C(item_number)'
Rlambda = 0.01
model, train_score = train_model(data1,frm,Rlambda)

person tosh1611    schedule 22.09.2016    source источник


Ответы (1)


Сначала я исправлю ошибку с вашим кодом, а затем отвечу на ваш вопрос.

Ваш код: ваша функция train_model не вернет то, что вы думаете. В настоящее время он ничего не возвращает, и вы хотите, чтобы он возвращал и вашу модель, и оценку обучения. Когда вы подбираете модель, вам нужно определить, что вы подразумеваете под оценкой обучения — по умолчанию модель ничего вам не вернет. А пока давайте просто вернем модель, которую вы обучили.

Поэтому вы должны обновить свою функцию train_model следующим образом:

def train_model (data, frm, Rlambda):
    y, X = dmatrices(frm , data, return_type="matrix")
    y = np.ravel(y)

    scaler = sklearn.preprocessing.MaxAbsScaler(copy=False)
    X_trans = scaler.fit_transform(X)

    model = LogisticRegression(penalty ='l2', C=1/Rlambda)

    # model.fit() operates in-place
    model.fit(X_trans, y)

    return model

Теперь, когда вы хотите определить, какие переменные соответствуют, model.coef_ возвращает вам все коэффициенты решающей функции размера (n_classes, n_features). Порядок коэффициентов соответствует порядку, в котором ваши признаки были переданы в метод .fit(). Таким образом, в вашем случае X_trans является матрицей проектирования размером (n_samples, n_features), поэтому каждый из коэффициентов в model.coef_ точно соответствует коэффициентам для каждого из n_features в X в том же порядке, в котором они представлены в X.

person mprat    schedule 22.09.2016
comment
Спасибо за отладку. Итак, они выходят так же, как и вошли. Но поскольку я передаю категориальные данные, не должна ли одна из категорий стать фиктивной переменной, а затем исчезнуть? - person tosh1611; 22.09.2016
comment
Допустим, item_number принимает значения от 1 до 5, тогда после C(item_number) вы получаете 4 пустышки (принимает 0, 1). Если вас действительно волнует соответствие между именами коэффициентов и манекенов, вам действительно нужно сначала пометить свой набор данных, вы можете вернуть кадр данных, а не матрицу, вместо этого установите return_type='dataframe'. И используйте x.head(), x.columns и т. д. для поиска имен переменных. - person Nicholas; 22.09.2016