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

参考资料

chapter3

A Tour of Machine Learning

Classifers Using Scikit-learn

引言

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

PS:逻辑回归是用来分类的!!!不是用来做线性回归的! sigmoid 函数的反函数叫做 logit 函数, 这就是逻辑回归 logistic regression 的来历,跟逻辑没啥关系......

sigmoid 函数

184

这个函数的特点就是一条S型的定义域在 R 中, 值域在 [0,1] 中的函数

同时它也代表 y=1的概率, y=0 的概率为 1-phi(z)

画一下图来说明一下

#! /usr/bin/python
# -*-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()

589

逻辑回归算法 logistic regression

基本原理

逻辑回归算法跟Adaline 线性自适应算法很类似,区别只不过是把激活函数从**恒同映射 y = z ** 换成了 y = sigmoid(z)

504

逻辑回归中的损失函数

回忆一下在梯度下降模型 Adaline 中应用到的损失函数 cost function 平方差函数

264

这是线性回归的一种损失函数

但是对于S型的sigmoid函数,这样的定义在 y 趋近-1,1 的时候会特别接近零

对于逻辑回归 logistic regression 损失函数是这样定义的

对数似然损失函数(交叉熵)

Ps: 一下所有的 log 其实都是 ln

437

这个损失函数是怎么来的呢? 极大似然法

先定义似然函数(每个样本都认为是独立的):

577

似然函数可以看成条件概率

关于似然函数的概念可以参考kevinGao的博客

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

509

现在好了,我们知道:当 权向量 w 使 l最大的时候, w 最合理

那么我们就定义 J 函数 : J = -l

421

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

362

541

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

权值更新

跟梯度下降法一样,按照公式

274

经过计算

361

我们就有了权值更新的公式

居然跟Adaline一模一样哎

意不意外?惊不惊喜?

272

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

实践

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

__author__ = 'Administrator'

#! /usr/bin/python
# -*- 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)

640

过拟合,欠拟合与正则化

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

过拟合

俗称想太多。为了很好的拟合训练集,模型使用了太多的参数,变得特别复杂,甚至噪音与误差都被分成了一类,这样的模型虽然对训练集模拟的很好,但是对用来预测的数据集却特别不可靠,我们说 :这样的模型 has a high variance (高方差)

-欠拟合

对应的,头脑太简单。模型太过简单以至于对预测用数据集来说也不可靠

我们这这样的模型 has a high bias (高偏差)

658

正则化 Ruglarization

为了防止过拟合,正则化是一种常用的方法。正则化,简单地说,就是引入额外的偏差去降低一些极端权值的影响。

最常见的正则化,是 L2正则化,他在损失函数的末尾加上这样一项

189

Lambda 被称为正则化参数

这样损失函数形式变为:

552

Ir = LogisticRegression(C=1000.0,random_state=0)

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

106

损失函数的最终形式:

562

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()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值