逻辑回归专题01

1.linear_model.LogisticRegression

1.1.参数C和penalty学习曲线

1、导入所需要的库
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
2、导入数据集(乳腺癌数据)
data = load_breast_cancer()
x = data.data   #特征
y = data.target #标签
data.data.shape  #(569,30)
#区分正则化参数的区别
lrl1 = LR(penalty='l1' , solver= 'liblinear' , C= 0.5 , max_iter= 1000)
lrl2 = LR(penalty='l2' , solver= 'liblinear' , C= 0.5 , max_iter= 1000)
#逻辑回归的属性coef_,查看每个特征所对应的参数
lrl1 = lrl1.fit(x,y)
lrl1.coef_
(lrl1.coef_ != 0).sum(axis = 1) #查看特征参数不为0的总数
#培养训练关于参数C和penalty学习曲线
l1 = []
l2 = []
l1test = []
l2test = []
Xtrain , Xtest , Ytrain , Ytest = train_test_split(x , y,test_size= 0.3 , random_state = 0)
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)
    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)#图例的位置将位于右下角
plt.show()

结论:随着C的逐渐增大,正则化强度越来越小,训练集和测试集的表现呈上升趋势,到最高点C= 0.8,可简单认为C设定0.8较好。
在这里插入图片描述

1.2.max_iter的学习曲线

l2 = []
l2test = []
Xtrain , Xtest , Ytrain , Ytest = train_test_split(x,y,test_size = 0.3,random_state = 0)
for i in np.arange(1,201,10):
    lrl2 = LR(penalty='l2' , solver= 'liblinear' ,C = 0.9,max_iter= i)
    lrl2 = lrl2.fit(Xtrain , Ytrain)
    l2.append(accuracy_score(lrl2.predict(Xtrain),Ytrain))
    l2test.append(accuracy_score(lrl2.predict(Xtest),Ytest))
graph = [l2 , l2test]
color = ['black','gray']
label = ['l2' , 'l2test']
plt.figure(figsize=(20,5))
for i in range(len(graph)):
    plt.plot(np.arange(1,201,10),graph[i],color[i],label = label[i])
plt.legend(loc = 4)
plt.xticks(np.arange(1,201,10))
plt.show()

在这里插入图片描述

1.3.逻辑回归的特征工程

逻辑回归的特征工程(嵌入法模块SelectFromModel)
1、导入所需要的库(再上面的库基础上)
from sklearn.model_selection import cross_val_score
from sklearn.feature_selection import SelectFromModel
2、导入数据集(乳腺癌数据)
data = load_breast_cancer()
data.data.shape  #(569,30)
3、基本的逻辑回归训练
LR_ = LR(solver= 'liblinear',C = 0.9 , random_state= 0)
cross_val_score(LR_ , data.data , data.target , cv = 10).mean() #结果约为0.9508
x_embedded = SelectFromModel(LR_ , norm_order= 1).fit_transform(data.data , data.target) #嵌入化且特征范式为L!
x_embedded.shape #(569,9)
cross_val_score(LR_ , x_embedded , data.target , cv=10).mean()#结果约为0.9368

结论:特征数量降低为个位数,但模型的效果却没有下降很多

画出threshold的学习曲线
fullx = []
fsx = []
threshold = np.linspace(0,abs((LR_.fit(data.data , data.target).coef_)).max(),20)
k = 0 #定义全局变量
for i in threshold:
    x_embedded = SelectFromModel(LR_ ,threshold= i).fit_transform(data.data , data.target)
    fullx.append(cross_val_score(LR_ , data.data , data.target , cv= 10).mean())
    fsx.append(cross_val_score(LR_ , x_embedded , data.target ,cv = 10).mean())
    print(threshold[k] , x_embedded.shape[1])
    k += 1
plt.figure(figsize=(20,5))
plt.plot(threshold , fullx ,label='full')
plt.plot(threshold , fsx ,label='feature selection')
plt.xticks(threshold)
plt.legend()
plt.show()    

在这里插入图片描述但会发现模型在保持较好效率的时候特征数量为17

在嵌入范式L1的基础之上去调整C,并画出C的学习曲线
fullx = []
fsx = []
C = np.arange(0.01 , 10.01 , 0.5)
for i in C:
    LR_  = LR(solver= 'liblinear' , C = i ,random_state=0)
    fullx.append(cross_val_score(LR_ ,data.data , data.target ,cv = 10).mean())
    x_embedded = SelectFromModel(LR_ , norm_order= 1).fit_transform(data.data , data.target)
    fsx.append(cross_val_score(LR_ , x_embedded ,data.target , cv = 10).mean())
plt.figure(figsize=(20,5))
plt.plot(C , fullx ,label='full')
plt.plot(C , fsx ,label='feature selection')
plt.xticks(C)
plt.legend()
plt.show()

在这里插入图片描述

print(max(fsx),C[fsx.index(max(fsx))])
0.9563164376458386 7.017.01左右对C的学习曲线进行细化
fullx = []
fsx = []
C = np.arange(6.05 , 7.05 , 0.005)
for i in C:
    LR_  = LR(solver= 'liblinear' , C = i ,random_state=0)
    fullx.append(cross_val_score(LR_ ,data.data , data.target ,cv = 10).mean())
    x_embedded = SelectFromModel(LR_ , norm_order= 1).fit_transform(data.data , data.target)
    fsx.append(cross_val_score(LR_ , x_embedded ,data.target , cv = 10).mean())
plt.figure(figsize=(20,8))
plt.plot(C , fullx ,label='full')
plt.plot(C , fsx ,label='feature selection')
plt.xticks()
plt.legend()
plt.show()
print(max(fsx),C[fsx.index(max(fsx))])
0.9580405755768732 6.069999999999999

在这里插入图片描述

对特征工程中模型进行对比
1、特征工程降低维度之前
LR_ = LR(solver='liblinear' , C = 6.069999999999999 ,random_state= 0)
cross_val_score(LR_ , data.data , data.target , cv = 10).mean()
0.9491152450090743
data.data.shape (569,30)
2、特征工程降低维度之后
LR_ = LR(solver='liblinear' , C = 6.069999999999999 ,random_state= 0)
X_embedded = SelectFromModel(LR_ , norm_order= 1).fit_transform(data.data , data.target)
cross_val_score(LR_ ,X_embedded ,data.target , cv = 10).mean()
0.9580405755768732
X_embedded.shape (569,11)

2.逻辑回归的重要参数,属性

1、两个属性
A、coef_ #逻辑回归的重要属性,查看每个特征所对应的参数
B、n_iter_
#属性n_iter_来调用本次求解中实现真正的迭代次数
2、五个参数
LogisticRegression(penalty = 'l1'
				  ,solver = 'liblinear'
				  , C = 0.5
				  ,max_iter = 1000
				  ,multi_class ='over')
A、penalty
sklearn中提供了两个选择:l1和l2
|l1|会将参数压缩为0|
|l2|只会让参数尽量小,不会取到0|
B、solver
sklearn提供了多种选择,其中'liblinear'是二分类专用
C、C
C正则化强度的倒数,C越小,损失函数越小,模型对损失函数的惩罚越重,正则化效力越高。
D、max_iter
训练时候最长的迭代次数,其中当max_iter中限制的步数已经走完,但逻辑回归还没有找到损失函数的最小值时。
E、multi_class
sklearn中提供了三个选择:'over','multinomial''auto'
其中默认'auto',二分类为'auto',多分类为'multinomial'
3、逻辑回归的特征工程一个参数
SelectFromModel(LR , norm_order = 1)
由于L1正则化会使得部分特征对应的参数为0,因此L1正则化可以用来做特征选择,结合嵌入法的模块SelectFromModel.

参考:CDA课堂,直播课后的个人笔记总结,仅供参考,有不一样的想法的大佬们,请辩证地观看,如果有问题可以在评论区指出我再订正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值