2016-09-22 116 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