2016-09-22 66 views
1

python和机器学习颇为新颖。python逻辑回归 - patsy设计矩阵和分类数据

我想建立一个逻辑回归模型。我曾在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

首先我会用你的代码修复一个错误,然后我会回答你的问题。

您的代码: 您的train_model函数不会返回您认为它返回的内容。目前,它不会返回任何内容,并且您希望它返回您的模型和培训分数。当你适合一个模型时,你需要定义训练分数的含义 - 默认情况下,模型不会返回任何东西给你。现在让我们回到你训练的模型。当您要确定对应什么变量,model.coef_回报你所有的决策函数的系数,尺寸(n_classes, n_features)

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 

现在:

所以,你应该作如下更新您的train_model功能。系数的顺序对应于您的功能被传递到.fit()方法的顺序。因此,在您的情况下,X_trans是尺寸为(n_samples, n_features)的设计矩阵,因此model.coef_中的每个系数与X中的每个n_features的系数都正好对应,它们与X中显示的顺序相同。

+0

感谢您的调试。好吧,他们出来的时候和他们一样。但是因为我传递的是分类数据,所以不应该有一个类别变成虚拟变量,然后消失? – tosh1611

+0

假设'item_number'取值从1到5,那么在'C(item_number)'之后,你会得到4个假人(需要0,1)。如果你真的关心系数和虚拟名称之间的匹配,你真的需要首先标记你的数据集,你可以返回数据帧而不是矩阵,而是设置'return_type ='dataframe''。并使用x.head(),x.columns等来查找变量名称。 – Nicholas