python鸢尾花数据集_Python实现鸢尾花数据集分类问题——使用LogisticRegression分类器...
. 逻辑回归
逻辑回归(Logistic Regression)是用于处理因变量为分类变量的回归问题,常见的是二分类或二项分布问题,也可以处理多分类问题,它实际上是属于一种分类方法。
概率p与因变量往往是非线性的,为了解决该类问题,我们引入了logit变换,使得logit(p)与自变量之 间存在线性相关的关系,逻辑回归模型定义如下:
1 #Sigmoid曲线:
2 importmatplotlib.pyplot as plt3 importnumpy as np4
5 defSigmoid(x):6 return 1.0 / (1.0 + np.exp(-x))7
8 x= np.arange(-10, 10, 0.1)9 h = Sigmoid(x) #Sigmoid函数
10 plt.plot(x, h)11 plt.axvline(0.0, color='k') #坐标轴上加一条竖直的线(0位置)
12 plt.axhspan(0.0, 1.0, facecolor='1.0', alpha=1.0, ls='dotted')13 plt.axhline(y=0.5, ls='dotted', color='k') #在y=0.5的地方加上黑色虚线
14 plt.yticks([0.0, 0.5, 1.0]) #y轴标度
15 plt.ylim(-0.1, 1.1) #y轴范围
16 plt.show()
二、鸢尾花分类问题的思路分析
(1)选择使用LogisticRegression分类器,由于Iris数据集涉及到3个目标分类问题,而逻辑回归模型是二分类模型,用于二分类问题。因此,可以将其推广为多项逻辑回归模型(multi-nominal logistic regression model),用于多分类。
(2)根据多项逻辑回归模型,编写代码,输入数据集,训练得到相应参数并作出预测。
(3)对预测出的数据的分类结果和原始数据进行可视化展示。
三、多项逻辑回归模型的原理及推导过程
假设类别Y 的取值集合为 {1,2,...,K},那么多项逻辑回归模型是:
其似然函数为:
其中,
为模型在输入样本
时,将其判为类别k 的概率;
起到指示函数的作用,当K 等于样本
的标签类别时为1,其余均为0。
对似然函数取对数,然后取负,得到
(简记为:
),最终要训练出的模型参数要使得
的值取得最小。
的推导过程如下:
考虑到过拟合的发生,对
加上一个正则项:
则
可以写成:
对
关于
求梯度,得到:
在上式中,第一项
可以看成是类别k的后验期望值,第二项
视为类别k 的先验期望值,第三项是正则化项,用于缓解过拟合。
接下来使用梯度下降法对参数
进行修正更新即可:
四、实现步骤
4.1 读入数据文件
这里需要注意的是,在datas中取前两列作为特征(为了后期的可视化画图更加直观,故只取前两列特征值向量进行训练)
1 attributes=['SepalLength','SepalWidth','PetalLength','PetalWidth'] #鸢尾花的四个属性名
2
3 datas=[]4 labels=[]5
6 #with open('IRIS_dataset.txt','r') as f:
7 #for line in f:
8 #linedata=line.split(',')
9 #datas.append(linedata[:-1]) #前4列是4个属性的值
10 #labels.append(linedata[-1].replace('\n','')) #最后一列是类别
11
12 #读入数据集的数据:
13 data_file=open('IRIS_dataset.txt','r')14 for line indata_file.readlines():15 #print(line)
16 linedata = line.split(',')17 #datas.append(linedata[:-1]) # 前4列是4个属性的值(误判的样本的个数为:7
18 datas.append(linedata[:-3]) #前2列是2个属性的值(误判的样本的个数为:30
19 labels.append(linedata[-1].replace('\n', '')) #最后一列是类别
20
21 datas=np.array(datas)22 datas=datas.astype(float) #将二维的字符串数组转换成浮点数数组
23 labels=np.array(labels)24 kinds=list(set(labels)) #3个类别的名字列表
4.2编写代码实现LogisticRegression算法
1 #LogisticRegression算法,训练数据,传入参数为数据集(包括特征数据及标签数据),结果返回训练得到的参数 W
2 defLogRegressionAlgorithm(datas,labels):3 kinds = list(set(labels)) #3个类别的名字列表
4 means=datas.mean(axis=0) #各个属性的均值
5 stds=datas.std(axis=0) #各个属性的标准差
6 N,M= datas.shape[0],datas.shape[1]+1 #N是样本数,M是参数向量的维
7 K=3 #k=3是类别数
8
9 data=np.ones((N,M))10 data[:,1:]=(datas-means)/stds #对原始数据进行标准差归一化
11
12 W=np.zeros((K-1,M)) #存储参数矩阵
13 priorEs=np.array([1.0/N*np.sum(data[labels==kinds[i]],axis=0) for i in range(K-1)]) #各个属性的先验期望值
14
15 liklist=[]16 for it in range(1000):17 lik=0 #当前的对数似然函数值
18 for k in range(K-1): #似然函数值的第一部分
19 lik -= np.sum(np.dot(W[k],data[labels==kinds[k]].transpose()))20 lik +=1.0/N *np.sum(np.log(np.sum(np.exp(np.dot(W,data.transpose())),axis=0)+1)) #似然函数的第二部分
21 liklist.append(lik)22
23 wx=np.exp(np.dot(W,data.transpose()))24 probs=np.divide(wx,1+np.sum(wx,axis=0).transpose()) #K-1 *N的矩阵
25 posteriorEs=1.0/N*np.dot(probs,data) #各个属性的后验期望值
26 gradients=posteriorEs - priorEs +1.0/100 *W #梯度,最后一项是高斯项,防止过拟合
27 W -= gradients #对参数进行修正
28 print("输出W为:",W)29 return W
4.3 编写predict_fun()预测函数
根据训练得到的参数W和数据集,进行预测。输入参数为数据集和由LogisticRegression算法得到的参数W,返回值为预测的值。
1 #根据训练得到的参数W和数据集,进行预测。输入参数为数据集和由LogisticRegression算法得到的参数W,返回值为预测的值
2 defpredict_fun(datas,W):3 N, M = datas.shape[0], datas.shape[1] + 1 #N是样本数,M是参数向量的维
4 K = 3 #k=3是类别数
5 data =np.ones((N, M))6 means = datas.mean(axis=0) #各个属性的均值
7 stds = datas.std(axis=0) #各个属性的标准差
8 data[:, 1:] = (datas - means) / stds #对原始数据进行标准差归一化
9
10 #probM每行三个元素,分别表示data中对应样本被判给三个类别的概率
11 probM =np.ones((N, K))12 print("data.shape:", data.shape)13 print("datas.shape:", datas.shape)14 print("W.shape:", W.shape)15 print("probM.shape:", probM.shape)16 probM[:, :-1] =np.exp(np.dot(data, W.transpose()))17 probM /= np.array([np.sum(probM, axis=1)]).transpose() #得到概率
18
19 predict = np.argmax(probM, axis=1).astype(int) #取最大概率对应的类别
20 print("输出predict为:", predict)21 return predict
4.4绘制图像
(1)确定坐标轴范围,x,y轴分别表示两个特征
1 #1.确定坐标轴范围,x,y轴分别表示两个特征
2 x1_min, x1_max = datas[:, 0].min(), datas[:, 0].max() #第0列的范围
3 x2_min, x2_max = datas[:, 1].min(), datas[:, 1].max() #第1列的范围
4 x1, x2 = np.mgrid[x1_min:x1_max:150j, x2_min:x2_max:150j] #生成网格采样点,横轴为属性x1,纵轴为属性x2
5 grid_test = np.stack((x1.flat, x2.flat), axis=1) #测试点
6 #.flat 函数将两个矩阵都变成两个一维数组,调用stack函数组合成一个二维数组
7 print("grid_test = \n", grid_test)8
9 grid_hat = predict_fun(grid_test,W) #预测分类值
10 grid_hat = grid_hat.reshape(x1.shape) #使之与输入的形状相同
11 #grid_hat本来是一唯的,调用reshape()函数修改形状,将其grid_hat转换为两个特征(长度和宽度)
12 print("grid_hat = \n", grid_hat)13 print("grid_hat.shape: = \n", grid_hat.shape) #(150, 150)
(2)指定默认字体
1 #2.指定默认字体
2 mpl.rcParams['font.sans-serif'] = [u'SimHei']3 mpl.rcParams['axes.unicode_minus'] = False
(3)绘制图像
1 #3.绘制图像
2 cm_light = mpl.colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF'])3 cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b'])4
5 alpha = 0.5
6
7 plt.pcolormesh(x1, x2, grid_hat, cmap=plt.cm.Paired) #预测值的显示
8 #调用pcolormesh()函数将x1、x2两个网格矩阵和对应的预测结果grid_hat绘制在图片上
9 #可以发现输出为三个颜色区块,分布表示分类的三类区域。cmap=plt.cm.Paired/cmap=cm_light表示绘图样式选择Paired主题
10 #plt.scatter(datas[:, 0], datas[:, 1], c=labels, edgecolors='k', s=50, cmap=cm_dark) # 样本
11 plt.plot(datas[:, 0], datas[:, 1], 'o', alpha=alpha, color='blue', markeredgecolor='k')12 ##绘制散点图
13 plt.scatter(datas[:, 0], datas[:, 1], s=120, facecolors='none', zorder=10) #圈中测试集样本
14 plt.xlabel(u'花萼长度', fontsize=13) #X轴标签
15 plt.ylabel(u'花萼宽度', fontsize=13) #Y轴标签
16 plt.xlim(x1_min, x1_max) #x 轴范围
17 plt.ylim(x2_min, x2_max) #y 轴范围
18 plt.title(u'鸢尾花LogisticRegression二特征分类', fontsize=15)19 #plt.legend(loc=2) # 左上角绘制图标
20 #plt.grid()
21 plt.show()
五、实验结果
(1)运行程序输出的参数:
使用二个特征:
输出W为: [[-0.41462351 1.26263398 0.26536423]
[-1.07260354 -2.44478672 1.96448439]]
输出predict为: [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 0 0 0 2 0 2 0 2 0 2 2 2 2 2 2 0 2 2 2 2 2 2 2 2 0 0 0 0 2 2 2 2 2 2 2 0 0 2 2 2 2 2 2 2 2 2 2 0 2 2 0 2 0 0 0 0 2 0 0 0 0 0 0 2 2 0 0 0 0 2 0 2 0 0 0 0 2 2 0 0 0 0 0 0 2 0 0 0 2 0 0 0 2 0 0 0 2 0 0 2]
误判的样本的个数为:28
使用四个特征:
输出W为:
[[-0.09363942 -1.41359443 1.17376524 -2.3116611 -2.20018596]
[ 1.44071982 -0.05960463 -0.31391519 -0.87589944 -1.83255315]]
输出predict为: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]
误判的样本的个数为:8
(2)数据可视化结果如下:
六、结果分析与比较
由以上实验结果可以看出,使用了二特征的误判的样本个数为28(样本总数为150),而使用了四个特征的训练结果,误判的样本个数为8,在一定程度上可以解释使用的特征数过少的话,会导致欠拟合的情况发生。
为了后期的可视化画图更加直观,故只取前两列特征值向量进行训练。结果展示如上图所示。
完整实现代码详见:【GitHub 】
【Reference】
python鸢尾花数据集_Python实现鸢尾花数据集分类问题——使用LogisticRegression分类器...相关推荐
- python导入鸢尾花数据集_Python实现鸢尾花数据集分类问题——基于skearn的SVM
1 #!/usr/bin/env python 2 #encoding: utf-8 3 __author__ = 'Xiaolin Shen' 4 from sklearn importsvm5 i ...
- python数据统计_Python数据分析--Iris数据集实战
Apple iPhone 11 (A2223) 128GB 黑色 移动联通电信4G手机 双卡双待 4999元包邮 去购买 > 本次主要围绕Iris数据集进行一个简单的数据分析, 另外在数据的可视 ...
- python数据建模数据集_Python中的数据集
python数据建模数据集 There are useful Python packages that allow loading publicly available datasets with j ...
- python 数据归一化_python 实现对数据集的归一化的方法(0-1之间)
python 实现对数据集的归一化的方法(0-1之间) 多数情况下,需要对数据集进行归一化处理,再对数据进行分析 #首先,引入两个库 ,numpy,sklearn from sklearn.prepr ...
- python组合数据分类_Python 数据可视化:分类特征统计图
上一课已经体验到了 Seaborn 相对 Matplotlib 的优势,本课将要介绍的是 Seaborn 对分类数据的统计,也是它的长项. 针对分类数据的统计图,可以使用 sns.catplot 绘制 ...
- python画树林_python对随机森林分类结果绘制roc曲线
上图: 附上代码:一个函数,传入三个参数 .....传入参数,训练模型,然后: fit = model.fit(x_train, y_training) # ROC y_score = model.f ...
- python度量学习_Python的差异度量
python度量学习 Hi folks, welcome back to my new edition of the blog, thank you so much for your love and ...
- python的自带数据集_Python的Sklearn库中的数据集
一.Sklearn介绍 scikit-learn是Python语言开发的机器学习库,一般简称为sklearn,目前算是通用机器学习算法库中实现得比较完善的库了.其完善之处不仅在于实现的算法多,还包括大 ...
- Python机器学习日记2:鸢尾花分类(持续更新)
Python机器学习日记2:鸢尾花分类 一.书目与章节 二. 前言 1. 什么是机器学习 2. 熟悉任务和数据 3. 本文软件版本 4. scikit-learn参考资料 三. 问题类型 四. 鸢尾花 ...
最新文章
- 列表删除前面两个元素_第015篇:List列表 - 课程二
- 搭建hue遇到的错误 Couldn't find log associated with operation handle: OperationHandle
- 【深度学习】利用神网框架分割病理切片中的癌组织(胃)
- Qt Creator编写代码
- SQL执行效率提升几万倍的操作详解!
- 万张PubFig人脸数据实现基于python+OpenCV的人脸特征定位程序(1)
- Linux开发板移植minicom
- Excel数据分析的代码(包括列表的操作)
- layout中蛇形线和差分线的使用
- 混合颜料-python实现
- 两个自我的对话和博弈
- Python | 打印三角形图案(educoder)
- jQuery仿钉钉组织架构的选择部门功能,移动端完美树形图
- android杀死 后台服务,android怎么样做到相似于微信那样后台服务不会被杀死
- PHP规范PSR13(链接定义接口)介绍
- python利用server酱推送IP地址
- 安装rabbitmq图文详情记录
- Chakra UI Pro (Marketing + Application UI + ECommerce)
- Python制作GUI钢琴,几行代码完成一个游戏项目
- 20186-27编程素养练习