簡體   English   中英

如何在 LogisticRegressionCV 中獲得混淆矩陣?

[英]How to get confusion matrix in LogisticRegressionCV?

我實現了兩個版本的邏輯回歸模型。 在第二個版本中,我的目標是找到最好的超參數 C,否則我對第一個版本沒問題。 我還需要平均值和標准。 開發最好的超參數 C 的混淆矩陣和系數矩陣。但我很困惑如何在 LogisticRegressionCV 第二版中獲得這些。

版本 1

    sss = RepeatedStratifiedKFold(n_splits=K_fold, n_repeats=n_repeats ,random_state=36851234)
    lambda_c=1.0
    cmn=[]
    coef=[]
    for train_index, test_index in sss.split(X,y):
        x_train,x_test=X[train_index],X[test_index]
        y_train,y_test=y[train_index],y[test_index]
        log_reg_model = LogisticRegression(max_iter=50000,C=lambda_c,penalty='l1',multi_class='ovr',class_weight='balanced',solver='liblinear')
        pipe=Pipeline([  ('polynomial_features',polynomial),   ('StandardScaler',StandardScaler()), ('logistic_regression',log_reg_model)])
        pipe.fit(x_train, y_train)
        y_pred=pipe.predict(x_test)
        y_prob = pipe.predict_proba(x_test)

        LR= pipe.named_steps['logistic_regression']
        coef.append(LR.coef_)
        cmn.append(confusion_matrix(y_test,y_pred,normalize='true'))

    cmn_std=np.std(np.array(cmn),axis=0)
    coef_std=np.std(np.array(coef),axis=0)
    cmn=np.mean(np.array(cmn),axis=0)
    coef=np.mean(np.array(coef),axis=0)

版本 2

    sss = RepeatedStratifiedKFold(n_splits=K_fold, n_repeats=n_repeats ,random_state=36851234)
    lambda_c=list(np.power(10.0, np.arange(-10, 3)))
    scoring='precision_weighted'
    log_reg_model = LogisticRegressionCV(max_iter=50000,fit_intercept=False,cv=sss,Cs=lambda_c,penalty='l1',multi_class='ovr',scoring=scoring,class_weight='balanced',solver='liblinear')
    pipe=Pipeline([  ('polynomial_features',polynomial),   ('StandardScaler',StandardScaler()), ('logistic_regression',log_reg_model)])
    pipe.fit(X,y)
    poly = pipe.named_steps['polynomial_features']
    LR= pipe.named_steps['logistic_regression']
    LR.coef_ # the shape is [3,6]; #class = 3 and #features = 6 
    LR.coefs_paths_  # the shape is [500,13,6]; #cv = 500, #C=13, #features=6  

如何獲得均值和標准差。 開發混淆矩陣和系數。 模型的第二個版本中的矩陣? 這對我來說不清楚。 我也看到 LR.C_=[100. 0.1 0.1] 在我的數據的輸出中有 3 個類。 為什么我們對每個類都有不同的超參數值。 這部分我也沒有完全理解。 謝謝。

如果是目標,這有效,

from sklearn.datasets import make_classification
import numpy as np
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.model_selection import cross_val_predict
from sklearn.linear_model import LogisticRegressionCV
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import PolynomialFeatures
from sklearn.metrics import confusion_matrix

cv = RepeatedStratifiedKFold(n_splits=5, n_repeats=10 ,random_state=36851234)

x, y = make_classification(100, 6, n_classes=3, n_informative = 3)
lambda_c=list(np.power(10.0, np.arange(-10, 3)))

scoring='precision_weighted'
log_reg_model = LogisticRegressionCV( max_iter=5000,
                                      fit_intercept=False,
                                      cv=cv,
                                      Cs=lambda_c,penalty='l1',
                                      multi_class='ovr',
                                      #scoring=scoring,
                                      class_weight='balanced',
                                      solver='liblinear')

polynomial = PolynomialFeatures(2)
pipe=Pipeline([  ('polynomial_features',polynomial),   ('StandardScaler',StandardScaler()), ('logistic_regression',log_reg_model)])

pipe.fit(x, y)

LR= pipe.named_steps['logistic_regression']

y_pred = cross_val_predict(pipe, x, y, cv=10)
conf_mat = confusion_matrix(y, y_pred)

print(conf_mat)
array([[17,  8,  9],
       [ 5, 28,  0],
       [ 3,  3, 27]])

您在 LR.C_ 中有三個值,因為您在邏輯回歸中使用了 multi_class='ovr' 選項。 根據 scikit-learn 文檔,它做了一個與其余的相比,即實際上你有 3 個分類器。 請參閱文檔sklearn.linear_model.LogisticRegression

在多類情況下,如果 'multi_class' 選項設置為 'ovr',則訓練算法使用 one-vs-rest (OvR) 方案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM