前言:
如今小伙伴们对“python逻辑回归模型训练”大概比较讲究,朋友们都需要剖析一些“python逻辑回归模型训练”的相关知识。那么小编同时在网络上收集了一些关于“python逻辑回归模型训练””的相关文章,希望大家能喜欢,你们一起来了解一下吧!专栏推荐
前面一篇文章是逻辑回归不带正则项,因为数据是线性可分的,只用一条直线作为决策边界就可以将类别基本分出,所以我们直接使用现成的x1,x2两个特征就可以拟合出一条直线,效果如下所示。
但是有的数据简单的靠一条之间是无法拟合出决策边界能把数据类别区分开来
如图我们只有两个特征x1和x2,如果靠这两个特征来拟合出一条直线,那么结果显而易见不可能,所以此时就说这个数据不是线性可分的,所以我们需要一条曲线作为决策边界,所以简单的两个特征x1,x2是无法完成曲线任务的,所以此时我们需要更多的特征和更高的特征阶数来组成多项式来拟合这个数据,但是有可能出现过拟合的现象,所以我们需要在这种情况下来使用正则化项来平衡代价函数,防止出现过拟合的现象。
我们现在有一个这样的数据集data2.txt,它的数据以散点图形式显示就是上面的这样,下面我们就通过逻辑回归的带正则项的形式来拟合出一条决策边界,来分开这两个样本。
这个是逻辑回归带正则项的假设函数和代价函数。其中costfunction中的参数reg表示lambda
这个函数的作用就是我们将我们的训练集数据传递给它,它会以散点图的形式来给画出来。
这两个函数,一个是预测函数,预测函数我们只需要将我们训练好的theta和要预测的数据代入既可以得到此时训练模型下的预测结果,gradientReg函数是梯度下降函数,我们可以不断调用它来实现梯度下降,它的返回值为梯度下降完成之后的theta。
现在所有的函数都已经准备好了,我们下面的就是调用这些函数来完成操作
第一步就是处理数据,将data2.txt分成两个部分,一部分是训练样本x,一部分是标签y。
data2 = np.loadtxt('data2.txt', delimiter=',')y = np.c_[data2[:,2]]#标注X = data2[:,0:2]#样本
然后因为我们的data2.txt初始只有两个特征,但是两个特征肯定不能完成这种非线性的拟合,所以我们要通过某种方式来增加特征,形成多项式的假设,来拟合这个非线性数据。
poly = PolynomialFeatures(6)#最高阶数XX = poly.fit_transform(data2[:,0:2])#将data2的0到1列转换成转化成多项式
# PolynomialFeatures方法分别为三个参数degree=2, interaction_only=False, include_bias=True#这个方法就是专门用来生成多项式的,第一个参数的意思是生成多项式的最高阶数,默认为2#第二个参数是多项式包含的是否是相互影响的特征集,true是相互影响#第三个参数是是否包含偏差列
我们在生成多项式的时候最高阶数为6,所以我们最终的XX实际上一共有28列,也就是我们此时的样本有28维,新特征XX有了之后,我们就根据新特征的数量来设置初始参数的维度
initial_theta = np.zeros(XX.shape[1])
现在我们的初始化参数theta已经有了,然后样本数据已经有了,标注也有了,我们训练我们的模型不用使用梯度下降,直接使用已经封装好的minimize来训练我们的数据,并且得到最终的训练模型theta。
但是现在还有一个参数需要我们来确定就是lambda,对于它究竟为什么值能够让我们的模型不过拟合,也不欠拟合,我们的做法就是试,做法是这样的从0开始,也就是不使用lambda,然后到1,然后到10,然后100,以10倍开始来变化。最终找到一个最合适的。
为此我们可以使用一个for循环,分别为lambda=0,1,10,100,然后分别调用minimize方法,我们可以得出四个模型,按照吴恩达老师的说法是,用测试集分别测试这些数据,这里我们不测试了,直接画出此时训练出来的模型的决策边界,我们可以直观的看出来哪些模型是过拟合哪些模型是欠拟合的。
enumerate(【0,1,10,100】)返回两个值,其中一个是
# i表示【0,1,100.0】中的索引0,1,2# C表示【0,1,100.0】中的值0,1.0.100.0
这个就是训练模型,并且画出决策边界的代码,我们for循环,分别训练四种不同的lambda的情况,计算不同情况下训练出来的训练数据拟合的准确率,毫无疑问准确率越高说明模型和训练数据拟合的越好,但是拟合越好很有可能出现过拟合的情况。
下面的代码就是画出决策边界,那么效果就如下所示:
我们可以看出这四个图分别对应四种lambda的情况,分别是0,1,10,100可以看出准确率分别是91%,83%,74%,61%,我们也可以看出来0的时候准确率太高,看图像也可以看出来它是过拟合,而100的时候,准确率太低就是欠拟合,中间两个还不错,综合考虑还是lamda=1比较好。
Lambda = 0 : 就是没有正则化,这样的话,就过拟合咯
Lambda = 1 : 这才是正确的打开方式
Lambda = 10:还算可以
Lambda = 100 : 卧槽,正则化项太激进,导致基本就没拟合出决策边界
标签: #python逻辑回归模型训练