实验目的
了解logistic regression的原理及在sklearn中的使用
实验数据
鸢尾花数据集是由杰出的统计学家R.A.Fisher在20世纪30年代中期创建的,它被公认为用于数据挖掘的最著名的数据集。它包含3种植物种类(Iris setosa、Iris versicolor和Iris virginica),每种各有50个样本。
下载地址:http://archive.ics.uci.edu/ml/datasets/Iris
LogisticRegression 主要参数介绍
class sklearn.linear_model.LogisticRegression(penalty=’l2’, dual=False, tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1, class_weight=None, random_state=None, solver=’liblinear’, max_iter=100, multi_class=’ovr’, verbose=0, warm_start=False, n_jobs=1)
- penalty:正则化选择参数(惩罚项的种类): str, ‘l1’ or ‘l2’, default: ‘l2’
LogisticRegression默认带了正则化项。penalty参数可选择的值为"l1"和"l2".分别对应L1的正则化和L2的正则化,默认是L2的正则化。 - class_weight :类型权重参数:(考虑误分类代价敏感、分类类型不平衡的问题)
- class_weight参数用于表示分类模型中各种类型的权重,可以不输入,即不考虑权重,或者说所有类型的权重一样。如果选择输入的话,可以选择balanced让类库自己计算类型权重,或者我们自己输入各个类型的权重,比如对于0,1的二元模型,我们可以定义class_weight={0:0.9, 1:0.1},这样类型0的权重为90%,而类型1的权重为10%。
- 如果class_weight选择balanced,那么类库会根据训练样本量来计算权重。某种类型样本量越多,则权重越低,样本量越少,则权重越高。当class_weight为balanced时,类权重计算方法如下:n_samples / (n_classes * np.bincount(y))。n_samples为样本数,n_classes为类别数量,np.bincount(y)会输出每个类的样本数,例如y=[1,0,0,1,1],则np.bincount(y)=[2,3]
- solver:优化算法选择参数default: ‘liblinear’
solver参数决定了我们对逻辑回归损失函数的优化方法,有四种算法可以选择,分别是:- liblinear:使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数。
- lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
- newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
- sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度
总结几种优化算法适用情况
正则参数 | 算法 | 介绍 |
---|---|---|
L1 | liblinear | liblinear适用于小数据集;如果选择L2正则化发现还是过拟合,即预测效果差的时候,就可以考虑L1正则化;如果模型的特征非常多,希望一些不重要的特征系数归零,从而让模型系数稀疏化的话,也可以使用L1正则化。 |
L2 | liblinear | libniear只支持多元逻辑回归的OvR,不支持MvM,但MVM相对精确。 |
L2 | lbfgs/newton-cg/sag | 较大数据集,支持one-vs-rest(OvR)和many-vs-many(MvM)两种多元逻辑回归。 |
L2 | sag | 如果样本量非常大,比如大于10万,sag是第一选择;但不能用于L1正则化。 |
- multi_class :分类方式选择参数default: ‘ovr’
OvR相对简单,但分类效果相对略差(这里指大多数样本分布情况,某些样本分布下OvR可能更好)。而MvM分类相对精确,但是分类速度没有OvR快。如果选择了ovr,则4种损失函数的优化方法liblinear,newton-cg,lbfgs和sag都可以选择。但是如果选择了multinomial,则只能选择newton-cg, lbfgs和sag了
实验过程
数据分析
该数据集共包括 150 行,每行为 1 个样本。每个样本有 5 个字段,凾别是:花萼长度 (单
位 cm)、花萼宽度(单位:cm)、花瓣长度(单位:cm)、花瓣宽度(单位:cm)、类别(共 3
类,分别是:Iris Setosa、Iris Versicolour、Iris Virginica)
实验代码
- 导入相关包
### 导入相关包
import pandas as pd
from sklearn.linear_model import LogisticRegression
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn import metrics
- 读取数据
data = pd.read_csv('./iris.csv',header=None)
x = data.values[:,:4]
y = data.values[:,4]
- 分离测试集与训练集
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.3,random_state=0)
- 构造逻辑回归对象并预测
cls = LogisticRegression(penalty='l2',solver='newton-cg',multi_class='multinomial')
cls.fit(x_train,y_train)
y_pred = cls.predict(x_test)
- 测试准确率
accuracy_score = metrics.accuracy_score(y_test,y_pred) #错误率,也就是np.average(y_test==y_pred)
accuracy_score
结果分析
- 针对不同的分类方式选择参数与优化算法参数可以得到不同的结果,有的结果甚至相差很多
分类方式选择参数 | 优化算法参数 | 准确率 |
---|---|---|
multinomial | lbfgs | 0.977 |
multinomial | newton-cg | 0.977 |
multinomial | sag | 0.955 |
ovr(默认) | liblinear(默认) | 0.888 |
ovr | newton-cg | 0.955 |
ovr | lbfgs | 0.955 |
ovr | sag | 0.933 |