python逻辑回归 - patsy设计矩阵和分类数据

时间:2016-09-22 13:37:59

标签: python scikit-learn patsy

python和机器学习的新手。

我正在尝试建立一个逻辑回归模型。我曾在R中工作以获得lambda并使用交叉验证来找到最好的模型,现在我将它转移到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)

1 个答案:

答案 0 :(得分: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的系数完全对应。 1}}按照X中的相同顺序显示。