sklearn.linear_model.LogisticRegression-逻辑回归分类器

发布时间 2023-04-12 21:32:39作者: yayagogogo

语法格式

class sklearn.linear_model.LogisticRegression(penalty='l2'*dual=Falsetol=0.0001C=1.0fit_intercept=Trueintercept_scaling=1class_weight=Nonerandom_state=Nonesolver='lbfgs'max_iter=100multi_class='auto'verbose=0warm_start=Falsen_jobs=Nonel1_ratio=None)

常用参数解释:

  • penalty: 指定正则项,也称惩罚项,接受"l1", "l2","elasticnet"(添加"l1""l2"罚分), "None"(不添加罚分)。默认为"l2"
  • solver: 在逻辑回归损失函数的优化问题中使用的算法,接受‘lbfgs’, ‘liblinear’, ‘newton-cg’, ‘newton-cholesky’, ‘sag’, ‘saga’, default="lbfgs"对于小数据集,选择"liblinear"合适,对于大数据集,选择"sag" "saga" 更快;对于多类问题,仅"newton-cg""sag", "saga""lbfgs"处理多项损失;"liblinear"则仅限于 one-versus-rest 方案;‘newton-cholesky’对于n_samples >> n_features的情况是一个很好的选择,特别是对于具有稀有类别的one-hot encoded分类特征,它仅限于二元分类和多类分类的one-versus-rest reduction。注:算法的选择取决于所选择的penalty。"liblinear""saga"支持"l1""newton-cg", "sag","liblinear","saga""newton-cholesky""lbfgs"支持"l2""saga"支持"elasticnet";"newton-cg", "sag","saga","newton-cholesky""lbfgs"支持“None”。只有在具有大致相同scale的特征上,“sag”“saga”才能实现快速收敛。
  • dual: 接受布尔值,表示是否选择对偶。默认为False。dual公式仅适用于使用 liblinearl2惩罚选项。当n_samples > n_features时选择dual=False更优。
  • tol: 接受float, default=1e-4。表示迭代终止的误差阈值。
  • C: float,表示正则化系数的倒数。 default=1.0,表示损失函数与正则项的比例为1:1。C值越小,表明正则化越强。
  • random_state: 接受int, RandomState instance, default=None,用来设置随机数种子。当 solver == "sag", "saga"或"liblinear"时,使用此参数来洗牌数据。

代码示例

penalty和C

from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_breast_cancer
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt

#导入数据
mydata = load_breast_cancer()
X = mydata.data
print(X.shape)
y = mydata.target
print(y.sum())

#选择训练集和测试集
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=100,stratify=y)
print(y_test.sum())

#使用逻辑回归模型进行二分类
#L1正则化
LR_classifier_l1 = LogisticRegression(penalty="l1",solver="liblinear",random_state=200,max_iter=1000)
LR_classifier_l1 = LR_classifier_l1.fit(X_train,y_train)
print(LR_classifier_l1.coef_) #查看每个特征对应的参数
print((LR_classifier_l1.coef_ != 0).sum(axis=1)) #特征不为0的数目
#L2正则化,并确实合适的C值
LR_train_L2 = []
LR_test_L2 = []
for i in np.linspace(0.05,1.5,19):
    LR_classifier_l2 = LogisticRegression(penalty="l2",solver="liblinear",random_state=200,C=i,max_iter=1000)
    LR_classifier_l2 = LR_classifier_l2.fit(X_train,y_train)
    LR_classifier_l2.coef_ #查看每个特征对应的参数
    (LR_classifier_l2.coef_ != 0).sum(axis=1) #特征不为0的数目
    LR_train_L2.append(accuracy_score(LR_classifier_l2.predict(X_train),y_train))
    LR_test_L2.append(accuracy_score(LR_classifier_l2.predict(X_test),y_test))

graph = [LR_train_L2,LR_test_L2]
label = ["LR_train_L2","LR_test_L2"]
color = ["black","red"]
plt.figure(figsize=(5,5))
for i in range(len(graph)):
    plt.plot(np.linspace(0.05,2,19),graph[i],color[i],label=label[i])
plt.legend(loc=2)
plt.show()

输出结果

(569, 30)
357
107
[[ 6.14368826  0.03201005 -0.43422785 -0.00929713  0.          0.
   0.          0.          0.          0.          0.          0.
   0.3325014  -0.06415746  0.          0.          0.          0.
   0.          0.          0.         -0.27739672 -0.138606   -0.02189744
   0.          0.         -1.20617611  0.          0.          0.        ]]
[10]

从上图可以看到,随着C值的增大,模型在训练集上的准确率呈逐渐增高趋势,但模型在测试集上则是先增高再下降,下降趋势的出现表明模型出现了过拟合。所以,C值应该选在0.8附近较合适。