Logistic和LDA判别分析(Python实现)

1.Logistic(逻辑回归)

逻辑回归:一种线性回归算法,虽然名字叫做回归但是通常是一种用在分类任务当中的算法。且并不基于最小二乘法进行求解,因此多重共线性问题也无需着重考虑

举最简单的二分类任务为例:

        单位阶跃函数:一种X> 0Y=1X<0Y=0的一种函数,一种将Y转换为分类变量得到一种替代函数。但是因为其不连续,并不能用进真正的算法当中去,因此取另一个替代函数Sigmoid函数。它的表达式为y =\frac{1}{1+e^{-z}}

 下面实战使用Python实现逻辑回归:

import pandas as pd
import numpy as np
data = pd.read_csv('iris.data',names=['sepal_lengh_cm','sepal_width_cm','petal_length_cm','petal_width_cm','class'],sep=",",skiprows=1)#读取鸢尾花数据集
data.head(5)#查看前五行数据
data.info()#查看数据集有无缺失等问题
data['class'].value_counts() #查看有多少种分类,分布大致均匀
from sklearn.model_selection import train_test_split  #使用留出法划分训练集和测试集
train,test =train_test_split(data,test_size = 0.2 ,random_state  = 42)#test_sizze设置测试集大小,random_state设置随机数种子使得每次划分结果一至
from sklearn.model_selection import StratifiedShuffleSplit #使用分层抽样使得训练集和测试集保持和原来相似的数据分布
split = StratifiedShuffleSplit(n_splits=1,test_size=0.2,random_state=42) #X是原始数据的属性集,y是数据的类别
for train_index,test_index in split.split(data.values[:,0:-1],data["class"]): #.values将numpy库的切片嫁接到pandas库来
    train_set=data.values[train_index]
    test_set=data.values[test_index]     #上面两步都是划分训练集和验证集,两种方式大家任意选择即可
    
training_x = train_set[:,0:-1]
training_y = train_set[:,-1]
testing_x = test_set[:,0:-1]
testing_y = test_set[:,-1]
from sklearn.linear_model import LogisticRegression #引入逻辑回归算法 L1正则会会将某些自变量权重置0,而L2则相反
model1 = LogisticRegression(penalty ='l2',solver = 'sag' ,max_iter =1000,C=0.5 ) #solver求解器,,max_iter最大迭代次数
model2 = LogisticRegression(penalty ='l2',solver = 'saga',max_iter = 1000,C=0.5) #penalty是正则化参数,超参数C是介于0到1之间的数
model1 = model1.fit(training_x,training_y)
from sklearn.metrics import accuracy_score #这里是对模型的分类精度进行查看
accuracy_score(model1.predict(testing_x),testing_y)
mport matplotlib.pyplot as plt
NUMC=np.linspace(0.05,1,19)
C1 = []
ML1  =  []
ML1_training = []
for i  in NUMC:
    model1 = LogisticRegression(penalty = 'l2',C=i,solver = 'sag' ,max_iter= 100)
    model1 =model1.fit(training_x,training_y)
    C1.append(i)
    ML1.append(accuracy_score(model1.predict(testing_x),testing_y))
    ML1_training.append(accuracy_score(model1.predict(training_x),training_y))
plt.figure(figsize=(6,6)) #这里可以超参数C进行调参,同时借助此方法也可以对max_iter参数进行调参,借助网格搜索和随机搜索同样可以
plt.plot(C1,ML1,"green")
plt.plot(C1,ML1_training,"black")
plt.show()
#特征处理|对所有自变量进行选择 使用嵌入法embedded 与正则化相结合筛选出有效特征
from sklearn.feature_selection import SelectFromModel
from sklearn.model_selection import cross_val_score
LR = LogisticRegression(solver = "saga", max_iter = 200,random_state = 42)
LR= LR.fit(training_x,training_y)
cross_val_score(LR,data.values[:,0:-1],data["class"],cv = 3,scoring = "accuracy").mean()
X_embadded = SelectFromModel(LR,norm_order=1).fit_transform(data.values[:,0:-1],data["class"])
X_embadded.shape
data.shape#可以看出这个数据集被压缩了
cross_val_score(LR,X_embadded,data["class"],cv = 2,scoring = "accuracy").mean()

SelectFromModel参数解释:

        对于SelectFromModel这个函数有一个较为重要的参数 thresholed  可以对嵌入法特征选择的阈值进行调整,默认值为None.当此参数杯选择后就会类似l1正则化,就会有特征被遗弃。因此SelectFromModel中的参数threshold可以设置为coef_的阈值,即可以剔除系数小于 threshold中输入的数字的所有特征。

LogisticRegression参数解释:

        solver:是指逻辑回归用的求解器,有如下几类:

        multinomial:处理多分类的方法,有如下几类:"ovr", "multinomial", "auto"

        

 class_weight:样本不平衡参数

当样本中各类样本出现分布不均衡的情况时可以通过此参数解决,但是此参数不好用反正参数不好调,最好采用欠采样或者过采样的方法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

first青年危机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值