1.Logistic(逻辑回归)
逻辑回归:一种线性回归算法,虽然名字叫做回归但是通常是一种用在分类任务当中的算法。且并不基于最小二乘法进行求解,因此多重共线性问题也无需着重考虑。
举最简单的二分类任务为例:
单位阶跃函数:一种则
而
则
的一种函数,一种将Y转换为分类变量得到一种替代函数。但是因为其不连续,并不能用进真正的算法当中去,因此取另一个替代函数
函数。它的表达式为
下面实战使用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:样本不平衡参数
当样本中各类样本出现分布不均衡的情况时可以通过此参数解决,但是此参数不好用反正参数不好调,最好采用欠采样或者过采样的方法。