菜鸟笔记Python3——机器学习(二) 逻辑回归算法

参考资料

<PYTHON_MACHINE_LEARNING> chapter3
A Tour of Machine Learning
Classifers Using Scikit-learn

引言

在我们进行分类的时,所取样本中的特征值一般都分布在实数域,但是我们想得到的往往是一个在 [0,1] 中的类似概率的值。 或者这么说,为了让特征值之间不会因为相差过大而造成干扰,比如,只有一个特征取值特别大,但是其他取值很小的时候, 我们需要对数据进行归一化。 即我们需要用一个从R 到 [0,1] 的单射来先处理特征值矩阵,然后再进行机器学习。当所用的映射是 sigmoid函数的时候,我们管这样的机器学习算法叫做逻辑回归。
PS:逻辑回归是用来分类的!!!不是用来做线性回归的! sigmoid 函数的反函数叫做 logit 函数, 这就是逻辑回归 logistic regression 的来历,跟逻辑没啥关系......

sigmoid 函数


这个函数的特点就是一条S型的定义域在 R 中, 值域在 [0,1] 中的函数
同时它也代表 y=1的概率, y=0 的概率为 1-phi(z)
画一下图来说明一下

#! /usr/bin/python <br> # -*-coding: utf8 -*-
import matplotlib.pyplot as plt
import numpy as np

def sigmoid(z):
    return 1.0/(1.0+np.exp(-z))

z = np.arange(-10,10,0.1)
p = sigmoid(z)
plt.plot(z,p)
#画一条竖直线,如果不设定x的值,则默认是0
plt.axvline(x=0, color='k')
plt.axhspan(0.0, 1.0,facecolor='0.7',alpha=0.4)
# 画一条水平线,如果不设定y的值,则默认是0
plt.axhline(y=1, ls='dotted', color='0.4')
plt.axhline(y=0, ls='dotted', color='0.4')
plt.axhline(y=0.5, ls='dotted', color='k')
plt.ylim(-0.1,1.1)
#确定y轴的坐标
plt.yticks([0.0, 0.5, 1.0])
plt.ylabel('$\phi (z)$')
plt.xlabel('z')
ax = plt.gca()
ax.grid(True)
plt.show()

逻辑回归算法 logistic regression

  • 基本原理
    逻辑回归算法跟Adaline 线性自适应算法很类似,区别只不过是把激活函数从**恒同映射 y = z ** 换成了 y = sigmoid(z)
  • 逻辑回归中的损失函数
    回忆一下在梯度下降模型 Adaline 中应用到的损失函数 cost function 平方差函数

    这是线性回归的一种损失函数
    但是对于S型的sigmoid函数,这样的定义在 y 趋近-1,1 的时候会特别接近零
    对于逻辑回归 logistic regression 损失函数是这样定义的
    对数似然损失函数(交叉熵)
    Ps: 一下所有的 log 其实都是 ln


这个损失函数是怎么来的呢? 极大似然法
先定义似然函数(每个样本都认为是独立的):

似然函数可以看成条件概率
关于似然函数的概念可以参考kevinGao的博客

http://www.cnblogs.com/kevinGaoblog/archive/2012/03/29/2424346.html

根据似然函数的概念,令似然函数最大的那个概率就是最合理的。我们想最大化似然函数,但是这个形式还是不够好看,毕竟是连乘的形式,所以,我们取一下对数


现在好了,我们知道:当 权向量 w 使 l最大的时候, w 最合理
那么我们就定义 J 函数 : J = -l

为了更好的理解,我们看一下单个样本的损失函数:


以y=1为例,当预测值接近正确值的时候,J 会收敛到 0

  • 权值更新
    跟梯度下降法一样,按照公式

经过计算


我们就有了权值更新的公式
居然跟Adaline一模一样哎
意不意外?惊不惊喜?


这意味着,我们在单独编写 LogisticRegression 类的时候,只需要在Adaline类中重新定义一下激励函数 phi 就可以了

实践

我们再上一章 sklearn 实现 Perceptron 感知机的基础上用 Iris 的数据集来实践一下

__author__ = 'Administrator'
#! /usr/bin/python <br> # -*- coding: utf8 -*-
from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.cross_validation import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score
from PDC import plot_decision_regions
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
import numpy as np
iris = datasets.load_iris()
x = iris.data[:,[2,3]]
y = iris.target
X_train,X_test,y_train,y_test = train_test_split(
    x , y, test_size=0.3, random_state = 0
)
sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)
Ir = LogisticRegression(C=1000.0,random_state=0)
Ir.fit(X_train_std,y_train)
X_combined_std = np.vstack((X_train_std,X_test_std))
y_combined = np.hstack((y_train,y_test))

plot_decision_regions(X=X_combined_std,y=y_combined,
                      classifier=Ir,
                      test_idx=range(105,150))
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.legend(loc='upper left')
plt.savefig('Iris.png')
plt.show()

print(X_test_std[0,:])
a = Ir.predict_proba(X_test_std[0,:])
print(a)

过拟合,欠拟合与正则化

过拟合与欠拟合是机器学习常见的两个问题

  • 过拟合
    俗称想太多。为了很好的拟合训练集,模型使用了太多的参数,变得特别复杂,甚至噪音与误差都被分成了一类,这样的模型虽然对训练集模拟的很好,但是对用来预测的数据集却特别不可靠,我们说 :这样的模型 has a high variance (高方差)
    -欠拟合
    对应的,头脑太简单。模型太过简单以至于对预测用数据集来说也不可靠
    我们这这样的模型 has a high bias (高偏差)
  • 正则化 Ruglarization
    为了防止过拟合,正则化是一种常用的方法。正则化,简单地说,就是引入额外的偏差去降低一些极端权值的影响。
    最常见的正则化,是 L2正则化,他在损失函数的末尾加上这样一项

    Lambda 被称为正则化参数
    这样损失函数形式变为:
Ir = LogisticRegression(C=1000.0,random_state=0)

在类 LogisticRegression 中的参数C 来源于支持向量机(SVM)的相关概念, 这里先不作展开


损失函数的最终形式:

  • C值对模拟的影响
    设置从 -5 到 4 10不同的幂作为C值,我们看一下 权值的影响
weights, params = [], []
for c in list(range(-5,5)):
    lr = LogisticRegression(C=10**int(c), random_state=0)
    lr.fit(X_train_std, y_train)
    weights.append(lr.coef_[1])
    params.append(10**c)
weights = np.array(weights)
plt.plot(params, weights[:, 0],label='petal length')
plt.plot(params,weights[:,1],linestyle='--',label='petal width')
plt.ylabel('weight coefficient')
plt.xlabel('C')
plt.legend(loc='upper left')
plt.xscale('log')
plt.show()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容