# linear_model.LogisticRegression 逻辑回归回归分类器(又叫logit回归,最大熵分类器) # linear_model.LogisticRegressionCV 带交叉验证的逻辑回归分类器 # linear_model.logistic_regression_path 计算Logistic回归模型以获得正则化参数的列表 # linear_model.SGDClassifier 利用梯度下降求解的线性分类器(SVM,逻辑回归等等) # linear_model.SGDRegressor 利用梯度下降最小化正则化后的损失函数的线性回归模型 # metrics.log_loss 对数损失,又称逻辑损失或交叉熵损失 # 【在sklearn0.21版本中即将被移除】 # linear_model.RandomizedLogisticRegression 随机的逻辑回归 # 其他会涉及的类 说明 # metrics.confusion_matrix 混淆矩阵,模型评估指标之一 # metrics.roc_auc_score ROC曲线,模型评估指标之一 # metrics.accuracy_score 精确性,模型评估指标之 # todo 1: linear_model.LogisticRegression # 使用损失函数这个评估指标 # 衡量参数0 的优劣的评估指标,用来求解最优参数的工具 # 损失函数小,模型在训练集上表现优异,拟合充分,参数优秀 # 反之 # sklearn.linear_model.LogisticRegression(penalty='l2', # 正则化 可以输入"l1"或"l2"来指定使用哪一种正则化方式,不填写默认"l2" # # L1正则化会将参数压缩为0,L2正则化只会让参数尽量小,不会取到0。 # # 特征量很大,数据维度很高,我们会倾向于使用L1正则化 # # 如果我们的主要目的只是为了防止过拟合,选择L2正则化就足够了。但 # # 是如果选择L2正则化后还是过拟合,模型在未知数据集上的效果表现很差,就可以考虑L1正则化 # # (稀疏(越多参数为0))若选择"l1"正则化,参数solver仅能够使用”liblinear"和“saga” # # (稠密) 若使用“l2”正则化,参数solver中所有的求解方式都可以使用 # dual=False, # tol=0.0001, # C=1.0, # C正则化强度的倒数,必须是一个大于0的浮点数,不填写默认1.0,即默认一倍正则项 # # C越小,对损失函数的惩罚越重,正则化的效力越强,参数0会逐渐被压缩得越来越小。 # fit_intercept=True, # intercept_scaling=1, # class_weight=None, # random_state=None, # solver='warn', # max_iter=100, # multi_class='warn', # verbose=0, # warm_start=False, # n_jobs=None) from sklearn.linear_model import LogisticRegression as LR from sklearn.datasets import load_breast_cancer # 乳腺癌数据集 import numpy as np import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 精确性分数 data = load_breast_cancer() X = data.data y = data.target lrl1 = LR(penalty="l1", solver="liblinear", C=0.5, max_iter=1000) lrl2 = LR(penalty="l2", solver="liblinear", C=0.5, max_iter=1000) # todo: 逻辑回归的 重要属性 lrl1 = lrl1.fit(X, y) ###### lrl1.coef_ num_=(lrl1.coef_!=0).sum(axis=1) # [10] 不为0的特征 共十个 lrl2 = lrl2.fit(X, y) num_2=(lrl2.coef_!=0).sum(axis=1) # 发现全部都不为0,l2追求就是让每个特征对模型都有贡献 # todo: 探究 l1和l2 哪一个更好,建 c的学习曲线 l1 = [] l2 = [] l1test = [] l2test = [] Xtrain, Xtest, Ytrain, Ytest = train_test_split(X,y,test_size=0.3,random_state=420) for i in np.linspace(0.05, 1, 19): lrl1 = LR(penalty="l1", solver="liblinear", C=i, max_iter=1000) lrl2 = LR(penalty="l2", solver="liblinear", C=i, max_iter=1000) lrl1 = lrl1.fit(Xtrain, Ytrain) # accuracy_score # 对预算的和真实的比较然后 打分 # lrl1.predict(Xtrain) 对模型的预测值 l1.append(accuracy_score(lrl1.predict(Xtrain), Ytrain)) l1test.append(accuracy_score(lrl1.predict(Xtest), Ytest)) lrl2 = lrl2.fit(Xtrain, Ytrain) l2.append(accuracy_score(lrl2.predict(Xtrain), Ytrain)) l2test.append(accuracy_score(lrl2.predict(Xtest), Ytest)) graph = [l1, l2, l1test, l2test] color = ["green", "black", "lightgreen", "gray"] label = ["L1", "L2", "L1test", "L2test"] plt.figure(figsize=(6, 6)) for i in range(len(graph)): plt.plot(np.linspace(0.05, 1, 19), graph[i], color[i], label=label[i]) plt.legend(loc=4) # 图例的位置在哪里?4表示,右下角 plt.show() # 可见,至少在我们的乳腺癌数据集下,两种正则化的结果区别不大。但随着C的逐渐变大,正则化的强度越来越 # 小,模型在训练集和测试集上的表现都呈上升趋势,直到C=0.8左右,训练集上的表现依然在走高,但模型在未知 # 数据集上的表现开始下跌,这时候就是出现了过拟合。我们可以认为,C设定为0.9会比较好。在实际使用时,基本 # 就默认使用l2正则化,如果感觉到模型的效果不好,那就换L1试试看
day 8.5 逻辑回归-正则化参数
最新推荐文章于 2022-07-11 07:30:00 发布