sklearn逻辑回归

logistics回归名字虽然叫回归,但实际是用回归方法解决分类的问题,其形式简洁明了,训练的模型参数还有实际的解释意义,因此在机器学习中非常常见。

理论部分

设数据集有n个独立的特征x,与线性回归的思路一样,先得出一个回归多项式:

\[y(x) = w_0+w_1x_1+w_2x_2+…+w_nx_n
\]

但这个函数的值域是\([-\infty,+\infty]\),如果使用符号函数进行分类的话曲线又存在不连续的问题。这个时候,就要有请我们的sigmoid函数登场了,其定义如下:

\[f(x)=\frac{1}{1+e^{-x}}
\]

这个函数属于\([0,1]\),而且连续可导,如果把纵坐标看成概率,那么就可以根据某个对象属于某一类的概率来进行分类了。

顺着这样的思路,我们定义几率比(odds ratio):

\[y(x)=ln(\frac{p(x)}{1-p(x)})
\]

这里\(p(x)\)表示该属性组合x属于第一类(正类)的概率,对应的\(1-p(x)\)表示该属性组合x属于第二类(反类)的概率。可以解得:

\[p(x)=\frac{1}{1+e^{-(w_0+w_1x_1+w_2x_2+…+w_nx_n)}}
\]

如果模型已经训练好,我们就可以根据w和x来求出\(p(x)\),如果\(p(x)>0.5\)就判断为正类,否则判断为反类。

之后就是训练参数的问题,可以采用极大似然估计的方法估算权重。

理论部分差不多就结束了,值得注意的是,训练出的参数\(w_i\)不光可以分类,还具有实际意义,它表示属性\(x_i\)对于总体对象属于哪一类的影响程度。因此逻辑回归虽然形式简单,但解释力比较强。

sklearn代码实现

  1. #coding=utf-8
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
  4. from sklearn.model_selection import train_test_split
  5. from sklearn import datasets
  6. from sklearn import linear_model
  7. import numpy as np
  8. def main():
  9. iris = datasets.load_iris() #典型分类数据模型
  10. #这里我们数据统一用pandas处理
  11. data = pd.DataFrame(iris.data, columns=iris.feature_names)
  12. data['class'] = iris.target
  13. #这里只取两类,class=0或1
  14. data = data[data['class']!=2]
  15. #为了可视化方便,这里取两个属性为例
  16. X = data[['sepal length (cm)','sepal width (cm)']]
  17. Y = data[['class']]
  18. #划分数据集
  19. X_train, X_test, Y_train, Y_test =train_test_split(X, Y)
  20. #创建回归模型对象
  21. lr = linear_model.LogisticRegression()
  22. lr.fit(X_train, Y_train)
  23. #显示训练结果
  24. print lr.coef_, lr.intercept_
  25. print lr.score(X_test, Y_test) #score是指分类的正确率
  26. #作图2x1
  27. plt.subplot(211)
  28. #区域划分
  29. h = 0.02
  30. x_min, x_max = X.iloc[:, 0].min() - 1, X.iloc[:, 0].max() + 1
  31. y_min, y_max = X.iloc[:, 1].min() - 1, X.iloc[:, 1].max() + 1
  32. xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
  33. np.arange(y_min, y_max, h))
  34. Z = lr.predict(np.c_[xx.ravel(), yy.ravel()])
  35. Z = Z.reshape(xx.shape)
  36. plt.contourf(xx, yy, Z, cmap=plt.cm.Paired)
  37. #做出原来的散点图
  38. class1_x = X.loc[Y['class']==0,'sepal length (cm)']
  39. class1_y = X.loc[Y['class']==0,'sepal width (cm)']
  40. l1 = plt.scatter(class1_x,class1_y,color='b',label=iris.target_names[0])
  41. class1_x = X.loc[Y['class']==1,'sepal length (cm)']
  42. class1_y = X.loc[Y['class']==1,'sepal width (cm)']
  43. l2 = plt.scatter(class1_x,class1_y,color='r',label=iris.target_names[1])
  44. plt.legend(handles = [l1, l2], loc = 'best')
  45. #做出概率分布图sigmoid
  46. plt.subplot(212)
  47. x0 = np.linspace(-5, 5, 200)
  48. #与lr.predict_proba(X)[:,1]等价
  49. plt.plot(x0,1/(1+np.exp(-x0)),linestyle = "-.",color='k')
  50. x1 = np.dot(X[data['class']==0],lr.coef_.T)+lr.intercept_
  51. l3 = plt.scatter(x1,1/(1+np.exp(-x1)),color='b',label=iris.target_names[0])
  52. x2 = np.dot(X[data['class']==1],lr.coef_.T)+lr.intercept_
  53. l4 = plt.scatter(x2,1/(1+np.exp(-x2)),color='r',label=iris.target_names[1])
  54. plt.legend(handles = [l3, l4], loc = 'best')
  55. plt.grid(True)
  56. plt.show()
  57. if __name__ == '__main__':
  58. main()

测试结果

  1. [[ 1.9809081 -3.2648774]] [-0.60409876]
  2. 1.0

sklearn逻辑回归的更多相关文章

  1. 通俗地说逻辑回归【Logistic regression】算法(二)sklearn逻辑回归实战

    前情提要: 通俗地说逻辑回归[Logistic regression]算法(一) 逻辑回归模型原理介绍 上一篇主要介绍了逻辑回归中,相对理论化的知识,这次主要是对上篇做一点点补充,以及介绍sklear ...

  2. sklearn逻辑回归(Logistic Regression,LR)调参指南

    python信用评分卡建模(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_ca ...

  3. sklearn逻辑回归(Logistic Regression)类库总结

    class sklearn.linear_model.LogisticRegression(penalty=’l2’, dual=False, tol=0.0001, C=1.0, fit_inter ...

  4. sklearn逻辑回归实战

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

  5. sklearn逻辑回归库函数直接拟合数据

    from sklearn import model_selection from sklearn.linear_model import LogisticRegression from sklearn ...

  6. 机器学习入门-概率阈值的逻辑回归对准确度和召回率的影响 lr.predict_proba(获得预测样本的概率值)

    1.lr.predict_proba(under_text_x)  获得的是正负的概率值 在sklearn逻辑回归的计算过程中,使用的是大于0.5的是正值,小于0.5的是负值,我们使用使用不同的概率结 ...

  7. 逻辑回归原理_挑战者飞船事故和乳腺癌案例_Python和R_信用评分卡(AAA推荐)

    sklearn实战-乳腺癌细胞数据挖掘(博客主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003&a ...

  8. sklearn使用——梯度下降及逻辑回归

    一:梯度下降: 梯度下降本质上是对极小值的无限逼近.先求得梯度,再取其反方向,以定步长在此方向上走一步,下次计算则从此点开始,一步步接近极小值.需要注意的是步长的取值,如果过小,则需要多次迭代,耗费大 ...

  9. Sklearn实现逻辑回归

    方法与参数 LogisticRegression类的各项参数的含义 class sklearn.linear_model.LogisticRegression(penalty='l2', dual=F ...

随机推荐

  1. Go语言之函数签名

    使用type关键字进行, 函数类型变量也可以作为函数的参数或返回值. 我觉得属于高级技巧了,初学者可能需要很多代码实现的, 高级的就可以更通用的实现. package main import &quo ...

  2. 执行Spark运行在yarn上的命令报错 spark-shell --master yarn-client

    1.执行Spark运行在yarn上的命令报错 spark-shell --master yarn-client,错误如下所示: // :: ERROR SparkContext: Error init ...

  3. linux系统(CentOS7)虚拟机上安装oracle 11g,解决oracle图形界面卡住无法点击next问题

    https://www.cnblogs.com/nichoc/p/6416475.html

  4. Sql语句拼接(EXEC和sp_executesql的区别)

    1.前言 MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有.还有一个最 ...

  5. Ant之build.xml详解

    Ant之build.xml详解 关键字: ant build.xml Ant的概念 可能有些读者并不连接什么是Ant以及入可使用它,但只要使用通过Linux系统得读者,应该知道make这个命令.当编译 ...

  6. Codeforces 1137D Cooperative Game (看题解)

    Cooperative Game 智商题, 感觉不太能推出来, 虽然看看证明过程是对的. #include<bits/stdc++.h> #define LL long long #def ...

  7. gitlab之三: gitlab邮件通知的配置

    参考 :  https://www.cnblogs.com/lovelinux199075/p/9072265.html gitlab 添加新用户后,会自动发送邮件到填写的邮箱. 实验版本:  11. ...

  8. ES6新特性:使用export和import实现模块化(转载)

    在ES6前, 前端就使用RequireJS或者seaJS实现模块化, requireJS是基于AMD规范的模块化库,  而像seaJS是基于CMD规范的模块化库,  两者都是为了为了推广前端模块化的工 ...

  9. Codeforces 986D Perfect Encoding FFT 分治 高精度

    原文链接https://www.cnblogs.com/zhouzhendong/p/9161557.html 题目传送门 - Codeforces 986D 题意 给定一个数 $n(n\leq 10 ...

  10. 027 ResourceBundle.getBundle方法

    在程序中遇到这个,感觉会比较重要,就学习一番. 一:静态读取配置文件的Demo 1.新建工程 2.新建properties 3.新建Java的demo程序 注意不要写properties. packa ...