导入数据集
利用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、利用sklearn.model_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。
于是通过梯度下降算法,可以迭代求得较优的向量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 = numpy.ones(n).transpose();
dataMatrix=numpy.c_[a,dataMatrix_tmp];#给数据集属性矩阵添加一列全1,为了直接得出b值
labelMatrix=numpy.matrix(label).transpose();
alpha=0.00001;#精度,自己凭经验选择
maxCycles=2000;#迭代次数
w = numpy.ones((5,1));#初始化w向量,第一个元素为b值
p1 = sigmoid(numpy.matmul(dataMatrix, w));
for k in range(maxCycles):
error=(labelMatrix-p1);
w=w+numpy.dot(alpha,numpy.matmul(dataMatrix.transpose(),error));#迭代计算w向量
p1 = sigmoid(numpy.matmul(dataMatrix, w));
losslist.append(loss(label, p1));
#print(losslist);
#损失函数曲线图
my_x_ticks=numpy.arange