# 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试试看