找回密码
 立即注册
搜索

机器学习算法实战:逻辑回归算法的实际和完成,附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 : 卧槽,正则化项太激进,导致基本就没拟合出决策边界

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

大神点评3

围观 围观 沙发在哪里!!!
回复

使用道具 举报

百姓二手车 2019-8-19 17:17:52 显示全部楼层
众里寻他千百度,蓦然回首在这里!
回复

使用道具 举报

流苏鹿晗 2019-8-20 17:44:43 显示全部楼层
顶一个,顶一个,顶一个
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies