day 8.5 逻辑回归-正则化参数

# 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试试看
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值