在逻辑回归中使用多项式特征以及在sklearn中使用逻辑回归并添加多项式

在逻辑回归中使用多项式特征

在上面提到的直线划分中,很明显有个问题,当样本并没有很好地遵循直线划分(非线性分布)的时候,其预测的结果是不太准的,所以可以引用多项式项,从线性回归转换成多项式回归,同理,为逻辑回归添加多项式项,基于这基础,就可以对逻辑回归进行一个比较好的分类,可以使用将degree设置成各种大小来构建任意大小的决策边界

具体实现

(在notebook中)

熟悉的加载包环节,然后设置一个随机数,种子为666,生成X和y,x为两百个样本,每个样本为两个特征,是第一个特征的平方和第二个特征的平方相加小于1.5,小于1.5为1,大于为0,然后绘制图像

  import numpy as np
import matplotlib.pyplot as plt np.random.seed(666)
X = np.random.normal(0,1,size=(200,2))
y = np.array(X[:,0]**2 + X[:,1]**2 < 1.5,dtype='int') plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])

图像如下

使用逻辑回归,使用封装好的方法,进行实例化,然后fit操作

  from LogisticRegression import LogisticRegression

  log_reg = LogisticRegression()
log_reg.fit(X,y)

可以得到准确度

  log_reg.score(X,y)

结果如下

图像绘制函数:

from matplotlib.colors import ListedColormap
def plot_decision_boundary(model, axis): x0,x1 = np.meshgrid(
np.linspace(axis[0],axis[1],int((axis[1]-axis[0])*100)).reshape(-1,1),
np.linspace(axis[2],axis[3],int((axis[3]-axis[2])*100)).reshape(-1,1)
)
X_new = np.c_[x0.ravel(),x1.ravel()]
y_predict = model.predict(X_new)
zz = y_predict.reshape(x0.shape)
custom_cmap = ListedColormap(['#EF9A9A', '#FFF59D', '#90CAF9']) plt.contourf(x0, x1, zz, linewidth=5, cmap=custom_cmap)

绘制决策边界

  plot_decision_boundary(log_reg,axis=[-4,4,-4,4])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])

图像如下

添加多项式项,详细参照这里的思想

简要概述:做一个为逻辑回归添加多项式项的管道

  from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler def PolynomialLogisticRegression(degree):
return Pipeline([
('poly',PolynomialFeatures(degree=degree)),
('std_scaler',StandardScaler()),
('log_reg',LogisticRegression())
])

进行实例化,最后fit操作

  poly_log_reg = PolynomialLogisticRegression(degree=2)
poly_log_reg.fit(X,y)

结果如下

其准确率为

绘制图像:

  plot_decision_boundary(poly_log_reg,axis=[-4,4,-4,4])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])

图像如下

设置degree为20,再试验一下

  poly_log_reg2 = PolynomialLogisticRegression(degree=20)
poly_log_reg2.fit(X,y)

结果如下

绘制图像:

  plot_decision_boundary(poly_log_reg2,axis=[-4,4,-4,4])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])

图像如下

出现这种决策边界很奇怪的情况,估计就是degree太大了,导致了形状不太规则,显然发生了过拟合的形象,模型越复杂越容易产生过拟合的情况,此时就要解决过拟合的情况,使用模型正则化就可以很好的解决

在逻辑回归中使用正则化同时使用sklearn中的逻辑回归

为逻辑回归添加正则项

关于正则项,可以

点击这里

这里可以使用新的计算方式

这种方式的好处是,如果c越大,在优化损失函数的时候就可以更好更快的将前项减到最小,这种就是在sklearn中的使用的方式

具体实现

(在notebook中)

与上面不同的是,生成的测试用例不同,对第一个特征平方,第二个特征为正常,同样的使相加的和小于1.5,添加一些噪音,挑二十个点,将其强制变为分类结果为1

  np.random.seed(666)
X = np.random.normal(0,1,size=(200,2))
y = np.array(X[:,0]**2 + X[:,1] < 1.5,dtype='int')
for _ in range(20):
y[np.random.randint(200)] = 1 plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])

图像如下

使用sklearn来进行逻辑回归

首先还是分割数据集,要想使用sklearn中的逻辑回归,调用LogisticRegression即可,实例化以后在进行fit,传入训练集

  from sklearn.model_selection import train_test_split

  X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=666)

  from sklearn.linear_model import LogisticRegression

  log_reg = LogisticRegression()
log_reg.fit(X_train,y_train)

然后看一下在训练数据集上的模拟的准确度

  log_reg.score(X_train,y_train)

结果如下

再看一下在测试数据集上的结果

  log_reg.score(X_test,y_test)

结果如下

绘制函数:

  from matplotlib.colors import ListedColormap
def plot_decision_boundary(model, axis): x0,x1 = np.meshgrid(
np.linspace(axis[0],axis[1],int((axis[1]-axis[0])*100)).reshape(-1,1),
np.linspace(axis[2],axis[3],int((axis[3]-axis[2])*100)).reshape(-1,1)
)
X_new = np.c_[x0.ravel(),x1.ravel()]
y_predict = model.predict(X_new)
zz = y_predict.reshape(x0.shape)
custom_cmap = ListedColormap(['#EF9A9A', '#FFF59D', '#90CAF9']) plt.contourf(x0, x1, zz, linewidth=5, cmap=custom_cmap)

调用绘制函数以后绘制图像

  plot_decision_boundary(log_reg,axis=[-4,4,-4,4])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])

图像如下

和上面一样,使用管道来组合一个多项式逻辑回归方法

  from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler def PolynomialLogisticRegression(degree):
return Pipeline([
('poly',PolynomialFeatures(degree=degree)),
('std_scaler',StandardScaler()),
('log_reg',LogisticRegression())
])

然后进行实例化,设置degree为2,并进行fit操作

  poly_log_reg = PolynomialLogisticRegression(degree=2)
poly_log_reg.fit(X_train,y_train)

然后看一下在训练数据集上的模拟的准确度

  poly_log_reg.score(X_train,y_train)

结果如下

再看一下在测试数据集上的结果

  poly_log_reg.score(X_test,y_test)

结果如下

绘制决策边界

  plot_decision_boundary(poly_log_reg,axis=[-4,4,-4,4])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])

图像如下

设置degree为20

  poly_log_reg2 = PolynomialLogisticRegression(degree=20)
poly_log_reg2.fit(X_train,y_train)

训练数据集准确度结果如下

测试数据集准确度结果如下(此时可以看出来一些过拟合的现象)

绘制出决策边界

  plot_decision_boundary(poly_log_reg2,axis=[-4,4,-4,4])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])

图像如下

设置一个新的管道,传入一个新的C的参数,然后调用操作,设置c为0.1,degree为20

  def PolynomialLogisticRegression(degree,C):
return Pipeline([
('poly',PolynomialFeatures(degree=degree)),
('std_scaler',StandardScaler()),
('log_reg',LogisticRegression(C=C))
]) poly_log_reg3 = PolynomialLogisticRegression(degree=20,C=0.1)
poly_log_reg3.fit(X_train,y_train)

训练数据集准确度结果如下

测试数据集准确度结果如下

绘制决策边界

  plot_decision_boundary(poly_log_reg3,axis=[-4,4,-4,4])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])

图像如下

多设置一个参数penalty,设置以后进行操作

  def PolynomialLogisticRegression(degree,C,penalty='l1'):
return Pipeline([
('poly',PolynomialFeatures(degree=degree)),
('std_scaler',StandardScaler()),
('log_reg',LogisticRegression(C=C,penalty=penalty))
]) poly_log_reg4 = PolynomialLogisticRegression(degree=20,C=0.1,penalty='l1')
poly_log_reg4.fit(X_train,y_train)

此时报错

这里表示Solver仅能使用L2正则项,意思是只能使用L2正则项?(疑惑)

那怎么使用L1正则项来添加呢?

乂,我也不清楚…

等大佬解答

【笔记】逻辑回归中使用多项式(sklearn)的更多相关文章

  1. [机器学习] Coursera ML笔记 - 逻辑回归(Logistic Regression)

    引言 机器学习栏目记录我在学习Machine Learning过程的一些心得笔记,涵盖线性回归.逻辑回归.Softmax回归.神经网络和SVM等等.主要学习资料来自Standford Andrew N ...

  2. Coursera Deep Learning笔记 逻辑回归典型的训练过程

    Deep Learning 用逻辑回归训练图片的典型步骤. 笔记摘自:https://xienaoban.github.io/posts/59595.html 1. 处理数据 1.1 向量化(Vect ...

  3. TensorFlow 深度学习笔记 逻辑回归 实践篇

    Practical Aspects of Learning 转载请注明作者:梦里风林 Github工程地址:https://github.com/ahangchen/GDLnotes 欢迎star,有 ...

  4. SAS LOGISTIC 逻辑回归中加(EVENT='1')和不加(EVENT='1')区别

    区别在于:最大似然估计分析中估计是刚好正负对调加上EVENT:%LET DVVAR = Y;%LET LOGIT_IN = S.T3;%LET LOGIT_MODEL = S.Model_Params ...

  5. Spark LR逻辑回归中RDD转DF中VectorUDT设置

    System.setProperty("hadoop.home.dir", "C:\\hadoop-2.7.2"); val spark = SparkSess ...

  6. ng-深度学习-课程笔记-2: 神经网络中的逻辑回归(Week2)

    1 二分类( Binary Classification ) 逻辑回归是一个二分类算法.下面是一个二分类的例子,输入一张图片,判断是不是猫. 输入x是64*64*3的像素矩阵,n或者nx代表特征x的数 ...

  7. sklearn逻辑回归实战

    目录 题目要求 ex2data1.txt处理 方案一:无多项式特征 方案二:引入多项式特征 ex2data2.txt处理 两份数据 ex2data1.txt ex2data2.txt 题目要求 根据学 ...

  8. sklearn调用逻辑回归算法

    1.逻辑回归算法即可以看做是回归算法,也可以看作是分类算法,通常用来解决分类问题,主要是二分类问题,对于多分类问题并不适合,也可以通过一定的技巧变形来间接解决. 2.决策边界是指不同分类结果之间的边界 ...

  9. Coursera公开课笔记: 斯坦福大学机器学习第六课“逻辑回归(Logistic Regression)” 清晰讲解logistic-good!!!!!!

    原文:http://52opencourse.com/125/coursera%E5%85%AC%E5%BC%80%E8%AF%BE%E7%AC%94%E8%AE%B0-%E6%96%AF%E5%9D ...

随机推荐

  1. mongodb数据的导出导入

    1.[导出]mongoexport -h (主机名) -d (库) -c (集合名) -o (路径) -u (账号) -p (密码)示例:mongoexport -h localhost -d jav ...

  2. vim程序编辑器---常用操作整理

    vim程序编辑器---常用操作整理 移动光标方法 o 在光标行的下一行,进入编辑模式 $ 移动到光标这行,最末尾的地方 G(大写) 移动到文件最末行 :set  nu 文件显示行数 :set  non ...

  3. docker挂载数据卷

    1.Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷,简单的理解就是将数据持久化的工具. 2.在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们 ...

  4. 小哈学Python ----XML

    XML XML是实现不同语言或程序之间进行数据交换的协议,XML文件格式如下: <data> <country name="Liechtenstein"> ...

  5. Github Copilot 结合python的使用

    之前提交的github copilot技术预览版申请,今天收到准入邮件,于是安上试一试这个准备把我送去电子厂上班的copy a lot ? 官网及申请地址:https://copilot.github ...

  6. C语言:printf标志符

    %d 十进制整数 %i %lf双精度浮点数 %o八进制整数  0%o或0%O %x十六进制整数  0x%x 或  0X%X %f单精度浮点数 %E  %e科学计数法 %s  字符串 %c  字符(单个 ...

  7. 网页如何嵌套网页__HTML框架

    通过使用html框架,可以在一个浏览器窗口中展示多个页面.也就是一个html文件中可以引入多个html文件.在网页中框架使用比较少,但我们还是需要了解下. 方式1:iframe 使用iframe标签来 ...

  8. [刘阳Java]_精选20道Java多线程面试题

    1. 多线程使用的优缺点? 优点: (1)多线程技术使程序的响应速度更快 (2)当前没有进行处理的任务可以将处理器时间让给其它任务 (3)占用大量处理时间的任务可以定期将处理器时间让给其它任务 (4) ...

  9. ZooKeeper 分布式锁 Curator 源码 04:分布式信号量和互斥锁

    前言 分布式信号量,之前在 Redisson 中也介绍过,Redisson 的信号量是将计数维护在 Redis 中的,那现在来看一下 Curator 是如何基于 ZooKeeper 实现信号量的. 使 ...

  10. mysql实现主从复制、读写分离的配置方法(二)

    由于接触主从复制,读写分离的时间比较短,应用还不够熟练,目的是能通过MyCat实现基础的读写分离操作. 其核心功能是分库分表,配合数据库的主从模式还可实现读写分离. 1. 测试环境 一台win10主机 ...