使⽤Python编程实现对数⼏率回归模型(不调⽤现成的对数⼏率回归函数),
并对Iris数据。。。
使⽤Python编程实现对数⼏率回归模型(不调⽤现成的对数⼏率回归函数),并对Iris数据集进⾏分类以验证模型的效能
导⼊数据集
利⽤sklern.datasets已有的load_iris()导⼊鸢尾花数据集。
这个数据集⼀共有150个样本,包含三种类型的花,各50个样本。
每个样本有四个属性值,⼀个标签值,三种类型的标签分别⽤0、1、2表⽰。因为本次实验我们只讨论⼆分类问题,所以只需要保留两类花的样本。为了⽅便,我直接截取前100个样本,也就是选取前两类花。
from sklearn.datasets import load_iris;
iris=load_iris();
attributes=iris.data[0:100];#导⼊数据集的属性列表,前100项,两类花
#print(attributes);
target=iris.target[0:100];#导⼊数据集的标签列表,前100项,两类花
#print(target);
数据划分
1、利⽤del_selection的train_test_split()可以进⾏数据集的划分。
2、train_test_split()需要四个参数,通过该函数可以返回划分好的训练集和测试集的属性数组和标签数组。
train_test_split(attributes,target,test_size=0.5,random_state=1)
attributes:数据集的属性数组
target:数据集的标签数组
test_size:测试集的规模。0.5表⽰测试集在数据集⾥占50%
random_state:取1表⽰在其他参数赋值相同的情况下,调⽤该函数划分数据集的得到的是相同的训练集和测试集,如果取的是0或者不填,则表⽰即使其他参数赋值相同,调⽤该函数划分出来的训练集和测试集是不同的。
训练模型
对数⼏率回归模型的关键点在于要尽可能地求出最优的向量w和数值b。
这个尽可能最优指的是训练出来的模型可以让样本属于其真实标记的概率尽可能地最⼤。
教材上式⼦3.25是利⽤“极⼤似然法”估计这个尽可能最优的向量w,和数值b。
所以,最⼤化式⼦3.25即是我们的⽬标。
教材指的是周志华的西⽠书。具体公式⼤家可以⾃⾏翻阅。
教材上通过推导得到,最⼤化式⼦3.25即是最⼩化3.27。
java调用python模型于是通过梯度下降算法,可以迭代求得较优的向量w:
W=W-α*(式⼦3.27的⼀阶导)
其中α是精度,指的是真实权重和计算得到的w的偏差,⼀般⼈为指定,在本次实现过程中,我将α指定为0.0001。
def iterater(data,label):#梯度下降法求出最优的w向量
losslist=[];
dataMatrix_tmp=numpy.matrix(data);
#print(dataMatrix_tmp);
n=dataMatrix_tmp.shape[0];
a = s(n).transpose();
dataMatrix=numpy.c_[a,dataMatrix_tmp];#给数据集属性矩阵添加⼀列全1,为了直接得出b值
labelMatrix=numpy.matrix(label).transpose();
alpha=0.00001;#精度,⾃⼰凭经验选择
maxCycles=2000;#迭代次数
w = s((5,1));#初始化w向量,第⼀个元素为b值
p1 =sigmoid(numpy.matmul(dataMatrix, w));
for k in range(maxCycles):
error=(labelMatrix-p1);
w=w+numpy.dot(alpha,numpy.anspose(),error));#迭代计算w向量
p1 =sigmoid(numpy.matmul(dataMatrix, w));
losslist.append(loss(label, p1));
#print(losslist);
#损失函数曲线图
my_x_ticks=numpy.arange(1,maxCycles+1,1);#横坐标的刻度
plt.figure("loss fuction");
a();
ax.set_title("loss fuction");
ax.set_xlabel("times");
ax.set_ylabel("loss");
ax.plot(my_x_ticks,losslist,color='b',linewidth=1,alpha=0.6);
plt.show();
return w;
初始化W向量元素为全1。
注:在处理数据的时候将数值b加⼊到向量w中,
并且在训练集的属性矩阵添加⼀列全1。这样就不需要再额外去求数值b。
⽆论是计算p(y=1|x)时还是计算预测的y值时,sigmoid()函数需要传⼊的参数都是的z值。
因为花的属性是四维的,所以向量W有四个元素。
为了更简单地表⽰z值以及计算出b值,在向量W中增加⼀个w0元素,表⽰b值,同时也要在数据集的属性矩阵第⼀列增加⼀列,数值全为1。
即z=w0+w1x1+w2x2+w3x3+w4x4=X*W
n = dataMatrix_tmp.shape[0];
a = s(n).transpose();
dataMatrix = numpy.c_[a, dataMatrix_tmp];#在属性矩阵第⼀列添加⼀列全1,为了便于与w向量相乘
y =sigmoid(numpy.matmul(dataMatrix, w)).tolist();#由学习到的w向量得出预测的y值
加⼯X属性矩阵这个操作是在训练模型的iterater()函数和计算正确率的函数accuracy()中进⾏的,前者对训练集的属性矩阵添加全1列,后者对测试集的属性矩阵添加全1列。
损失函数
随着迭代次数增加,得到的向量W也在不断变化。
为了知晓迭代次数对模型的影响,引⼊了损失函数来描述这⼀过程。
刚开始很容易误以为对数⼏率回归模型的损失函数是平⽅损失,其实不然。
因为逻辑回归并没有求似然函数的极值,⽽是把极⼤化当作⼀种思想,
推导出最⼩化负的似然函数。从损失函数的视⾓来看,这是⼀种log损失函数。
形式:J=-()/m
(p1=p(y=1|x))
当真实标签yi=1时,Ji=-(log p1)/m
当真实标签yi=0时,Ji=-(log (1-p1))/m
m为训练样本标签数量。
def loss(label,p):#损失函数
a=0;
for k in range(0,len(label)):
if label[k]==1:
a=a+numpy.log(numpy.array(p)[k]);
else:
a=a+numpy.log(1-numpy.array(p)[k]);
a=-a/len(label);
return float(a);
结果展⽰
1. 将数据集的 50%作为训练集,50%作为测试集,检验模型在测试集上的分类正确率。输出的W向量的值及正确率:
2.将数据集的 70%作为训练集,30%作为测试集,检验模型在测试集上的分类正确率。
向量W及其正确率:
3.将数据集的 90%作为训练集,10%作为测试集,检验模型在测试集上的分类正确率。
W向量及其正确率:
源码分享
#!/usr/bin/python
# -*- coding: utf-8-*-
import numpy;
import matplotlib.pyplot as plt;
from sklearn.datasets import load_iris;
iris=load_iris();
attributes=iris.data[0:100];#导⼊数据集的属性列表,前100项,两类花
#print(attributes);
target=iris.target[0:100];#导⼊数据集的标签列表,前100项,两类花
#print(target);
def sigmoid(x):#对数⼏率函数(替代函数)
return1./(p(-x));
def loss(label,p):#损失函数
a=0;
for k in range(0,len(label)):
if label[k]==1:
a=a+numpy.log(numpy.array(p)[k]);
else:
a=a+numpy.log(1-numpy.array(p)[k]);
a=-a/len(label);
return float(a);
def iterater(data,label):#梯度下降法求出最优的w向量
losslist=[];
dataMatrix_tmp=numpy.matrix(data);
#print(dataMatrix_tmp);
n=dataMatrix_tmp.shape[0];
a = s(n).transpose();
dataMatrix=numpy.c_[a,dataMatrix_tmp];#给数据集属性矩阵添加⼀列全1,为了直接得出b值 labelMatrix=numpy.matrix(label).transpose();
alpha=0.00001;#精度,⾃⼰凭经验选择
maxCycles=2000;#迭代次数
w = s((5,1));#初始化w向量,第⼀个元素为b值
p1 =sigmoid(numpy.matmul(dataMatrix, w));
for k in range(maxCycles):
error=(labelMatrix-p1);
w=w+numpy.dot(alpha,numpy.anspose(),error));#迭代计算w向量
p1 =sigmoid(numpy.matmul(dataMatrix, w));
losslist.append(loss(label, p1));
#print(losslist);
#损失函数曲线图
my_x_ticks=numpy.arange(1,maxCycles+1,1);#横坐标的刻度
plt.figure("loss fuction");
a();
ax.set_title("loss fuction");
ax.set_xlabel("times");
ax.set_ylabel("loss");
ax.plot(my_x_ticks,losslist,color='b',linewidth=1,alpha=0.6);
plt.show();
return w;
def accuracy(w,datatest,labeltest):#测试模型的正确率
count=0;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论