机器学习之线性模型

线性回归也就是可以用一条直线来拟合一个点集。博主大概总结下机器学习的线性模型,以及主要的公式推到,参考书籍是周志华教授的西瓜书《机器学习》,博主给出了一些西书中主要的公式推导思路或过程,对于常用的逻辑回归模型,利用sklearn机器学习包实现对MNIST公共数据集的简单分类应用。机器学习无非是回归和分类的问题,其目的就是学习一个数学函数,通过该数学函数输入得到输出。线性模型主要有以下三大类,也是本文要总结的三大类,其实只有前两者是用来做回归的,而最后一个是做分类的

  • 一元线性回归模型(一个自变量和一个因变量
  • 多元线性回归模型(多个因变量
  • 对数几率回归模型(逻辑回归模型,用来做分类

1.一元线性回归模型

这个其实很好理解,直接看西瓜书给出的公式就知道:
在这里插入图片描述
目的很简单,就是给定样本输入x求解输出f(x),而线性回归模型的主要工作就是学得参数w和b且使得损失函数最小,也就是说在预测过程中,我们需要使预测值和真实值之间的误差最小。求解参数的主要思路步骤:

  1. 由最小二乘法导出损失函数E(w,b),也就是均方误差最小化求解。损失函数定义如下:
  2. 在这里插入图片描述
  3. 证损失函数是凸函数,根据二元函数凹凸性判定定理证明即可,也就是分别求出关于w和b的二阶偏导值,利用AC-B^2>=0来判断其为凸函数。
  4. 分别对w和b求解一阶偏导,并令其为0,解出的w和b就是我们要求得的参数能使得损失函数值最小,由此可以推导出西瓜书的等式:在这里插入图片描述在这里插入图片描述
  5. 其实最后一步w参数的向量化目的是方便编程,在实际的应用中,给出的数据样本值x一般是一个序列,向量化有助于python利用矩阵工具计算相应的参数值。

2.多元线性回归模型

多元回归模型的推导思路和一元是一样的,但是不同的是需要把w和b统一为向量的形式(w;b),西瓜书中直接给出了损失函数让人看不懂:在这里插入图片描述
实际的推导如下*(因为公式不好敲,这里就贴个图片了哈,谅解!!!)*在这里插入图片描述
现在最关键的一步就是损失函数的求解,求解最小值,这里讲述两种方式,第一种就是和一元的思路差不多,涉及到矩阵的求导和微分(牛顿法/拟牛顿法),第二种也是值得推荐的一种常用的方法,梯度下降法,其不只是使用在一元/多元线性回归上,其它机器学习的模型也常用梯度下降法来优化损失函数,求解最优参数解。现在分别大致描述下两种方法的思路。

1. 西瓜书的思路属于第一种,判断凹凸性,也就是Hessian矩阵正定,则为凸函数。Hessian矩阵其实就是在梯度(一阶偏导数存在) 的类似基础上,求解二阶偏导数存在。推到过程如下:在这里插入图片描述
2. 梯度下降法它是用迭代的方法求解目标函数得到最优解,是在cost function(成本函数)的基础上,利用梯度迭代求出局部最优解。
对于线性回归模型:
在这里插入图片描述
损失函数为:
在这里插入图片描述

给一个初始值,使损失函数逐次变小,使每次都往梯度下降的方向改变:
在这里插入图片描述表示下降速度。
为了求偏导数,当只有一个样本时,即
在这里插入图片描述
当有多个训练样本时,下降梯度算法即为:
在这里插入图片描述
由于每次迭代都需要计算所有样本的残差并加和,因此此方法也叫做批下降梯度法(batch gradient descent),当有大规模数据时,此方法不太适合,可采取它得一个变种,即每次更新权重时,不是计算所有的样本,而是选取其中一个样本进行计算梯度,这个方法叫做随机下降梯度法(stochastic gradient descent):
在这里插入图片描述
随机下降梯度法与下降梯度法对比可能收敛更快,但是可能找不到最优点而在最优点附近徘徊。

对于局部加权线性回归(LWLR),可以参考如下博客:
https://blog.csdn.net/tercel_w/article/details/62883704

**总结:**线性回归的优点计算简单,容易实现,缺点使无法拟合非线性数据!!!

逻辑回归模型(对数几率回归)

Logistic是用来分类的,是一种线性分类器。逻辑回归的表达式可以通过替代函数和广义线性模型来推导,需要记住其表达式为:
在这里插入图片描述
其导数形式为:
在这里插入图片描述
logsitc回归方法主要是用极大似然估计来学习的,所以单个样本的后验概率为:
在这里插入图片描述
所以,整个样本的后验概率为:
在这里插入图片描述
取对数,得似然函数
在这里插入图片描述
似然函数取得最大值即为损失函数取得最小值,也可采用梯度下降法求解参数:
在这里插入图片描述

**总结:**逻辑回归的优点计算简单,分类时计算很快;缺点就是容易欠拟合,准确度不高,只能处理两分类问题(在此基础上衍生出来的softmax可以用于多分类),且必须线性可分。

Logistic回归模型的实践

采用的数据集为MNIST数据,可以进入该网盘下载:链接
链接:https://pan.baidu.com/s/1kc8oLBfUKdI_oK8j60RTNw
提取码:qcad

PyCharm+Anaconda实现代码:

import time
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.utils import check_random_state

# 读取数据集
df = pd.read_csv('mnist_784.csv')

#按照行号来索引,区别于loc是按照index来索引
X = df.iloc[:, :-1].values
y = df.iloc[:, -1].values

print(X.shape,y.shape) #查看维度

t0 = time.time()
train_samples = 5000 #训练样本大小

#check_random_state():这里使用的是numpy.random.RandomState().RandomState()可以使用int,array,None。None的时候就是随机。和np.random.seed()比较,seed只能用一次,每次调用随机函数用在之前再声明一下。
random_state = check_random_state(0)
permutation = random_state.permutation(X.shape[0]) #打乱顺序
X = X[permutation]
y = y[permutation]
X = X.reshape((X.shape[0],-1)) #reshape()最后一位如果是-1,表示适应前面的分法

X_train, X_test, y_train, y_test = train_test_split(X,y,train_size=train_samples,test_size=10000) #划分测试集和训练集,指定训练集和测试集的大小

#对每个特征,数据归一化(x-u)/s
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train) #训练集上需要先拟合再标准化
X_test = scaler.transform(X_test) #测试集上直接标准化

"""
    @penalty:正则化类型,默认为L2
    @tol:迭代终止判断的误差范围
    @C:默认:1.0;其值等于正则化强度的倒数,为正的浮点数。数值越小表示正则化越强。
    @solver:{'newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga'},默认: 'liblinear';用于优化问题的算法。
    @multi_class:{ovr', 'multinomial'},默认:'ovr';如果选择的选项是“ovr”,那么一个二进制问题适合于每个标签,否则损失最小化就是整个概率分布的多项式损失。对liblinear solver无效。
"""
clf = LogisticRegression(C=50./train_samples,
                         multi_class='multinomial',
                         penalty='l1', solver='saga', tol=0.1)

clf.fit(X_train,y_train)  #训练
sparsity = np.mean(clf.coef_ == 0) * 100
score = clf.score(X_test, y_test)

#打印结果
print("Sparsity with L1 penalty: %.2f%%" % sparsity)
print("Test score with L1 penalty: %.4f" % score)

coef = clf.coef_.copy()
plt.figure(figsize=(10, 5))
scale = np.abs(coef).max()
for i in range(10):
    l1_plot = plt.subplot(2, 5, i + 1)
    l1_plot.imshow(coef[i].reshape(28, 28), interpolation='nearest',
                   cmap=plt.cm.RdBu, vmin=-scale, vmax=scale)
    l1_plot.set_xticks(())
    l1_plot.set_yticks(())
    l1_plot.set_xlabel('Class %i' % i)
plt.suptitle('Classification vector for...')

run_time = time.time() - t0
print('Example run in %.3f s' % run_time)
plt.show()

结语:下一篇文章将在博主的博客**“项目”**里,简单运用Logistic分类模型实现达观杯的一个文本分类竞赛题,目的不是刷榜,而是想熟悉一下sklearn机器学习包的运用,以及一个机器学习算法是如何在一个实际场景中进行运用的。

参考资料:
[1]: 周志华.西瓜书《机器学习》
[2]:https://www.cnblogs.com/tornadomeet/p/3395593.html
[3]:https://blog.csdn.net/tercel_w/article/details/62883704

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值