赵走x博客
网站访问量:151890
首页
书籍
软件
工具
古诗词
搜索
登录
深入浅出Python机器学习:31、自动特征选择
深入浅出Python机器学习:30、数据“升维”
深入浅出Python机器学习:29、数据表达
深入浅出Python机器学习:28、聚类算法
深入浅出Python机器学习:27、特征提取
深入浅出Python机器学习:26、数据降维
深入浅出Python机器学习:25、数据预处理
深入浅出Python机器学习:24、神经网络实例一一手写识别
深入浅出Python机器学习:23、神经网络的原理及使用
深入浅出Python机器学习:22、神经网络的前世今生
深入浅出Python机器学习:21、SVM 实例一一波士顿房价回归分析
深入浅出Python机器学习:20、SVM 的核函数与参数选择
深入浅出Python机器学习:19、支持向量机SVM 基本概念
深入浅出Python机器学习:18、随机森林实例一一要不要和中目亲对象进一步发展
深入浅出Python机器学习:17、随机森林
深入浅出Python机器学习:16、决策树
深入浅出Python机器学习:15、朴素贝叶斯实战一一判断肿瘤是良性还是恶性
深入浅出Python机器学习:14、朴素贝叶斯算法的不同方法
深入浅出Python机器学习:13、朴素贝叶斯基本概念
深入浅出Python机器学习:12、使用L1 正则化的线性模型一一套索回归
深入浅出Python机器学习:11、使用L2 正则化的线性模型一一岭回归
深入浅出Python机器学习:10、最基本的线性模型一一线性回归
深入浅出Python机器学习:9、线性模型的墓本概念
深入浅出Python机器学习:8、K 最近邻算法项目实战一一酒的分类
深入浅出Python机器学习:7、K最近邻算法用于回归分析
深入浅出Python机器学习:6、K最近邻算法处理多元分类任务
深入浅出Python机器学习:5、k最近邻算法在分类任务中的应用
深入浅出Python机器学习:4、K 最近邻算法的原理
深入浅出Python机器学习:3、一些必需库的安装及功能简介
深入浅出Python机器学习:2、基于python i吾言的环境配置
深入浅出Python机器学习:1、概述
人脸数据集加载faces = fetch_lfw_people()报错
31、直方图
74、插件开发:Android端API实现
Python3之socket编程--3:基于UDP的套接字
15、使用 jQuery 处理 Ajax 请求
深入浅出Python机器学习:9、线性模型的墓本概念
资源编号:75892
人工智能
深入浅出Python机器学习
热度:184
深入浅出Python机器学习:9、线性模型的墓本概念
>广义线性模型一-“概直”的算法模型: 别看小C 对女朋友体贴得无微不至,但朋友们都知道他其实是一个“直男”,说话直,做事直,连最常用的算法都很“直”一一也就是我们在这一幸要介绍的线性模型。 线性模型是一类广泛应用于机器学习领域的预测模型,在过去的几十年里有众多学者都对其进行了深入的研究。线性模型是使用输入数据集的特征的线性函数进行建模,并对结果进行预测的方法。在这一章中,我们会介绍几种常见的线性模型。 本幸主要涉及的知识点有: * 线性模型的基本概念 * 线性回归模型 * 岭回归模型 * 套索回归模型 * 二元分类器中的逻辑回归和线性SVC模型 线性模型原本是一个统计学中的术语,近年来越来越多地应用在机器学习领域。实际上线性模型并不是特指某一个模型,而是一类模型。在机器学习领域,常用的线性模型包括线性回归、岭回归、套索回归、逻辑回归和线性SVC 等。下面我们先来研究一下线性模型的公式及特点。 # 1、 线性模型的一般公式 在回归分析当中, 线性模型的一般预测公式如下: $$ \hat{y} $$=w[0]$$\cdot$$x[0]+w[1]$$\cdot$$x[1]+$$\cdots$$+w[p]$$\cdot$$x[p]+b 式中: x [0] , x[l1] ,…, x [p] 为数据集中特征变量的数量(这个公式表示数据集中的数据点一共有p 个特征) ; w 和b 为模型的参数:$$ \hat{y} $$为模型对于数据结果的预测值。对于只有一个特征变量的数据集,公式可以简化为 $$\hat{y}$$ =w[0]$$\cdot$$x[0]+b 是不是觉得这个公式看上去像是一条直线的方程的解析式?没错, w [0] 是直线的斜率, b 是y 轴偏移量,也就是截距。如果数据的特征值增加的话,每个w 值就会对应每个特征直线的斜率。如果换种方式来理解的话,那么模型给出的预测可以看作输入特征的加权和,而w 参数就代表了每个特征的权重,当然, w 也可以是负数。 >⚠️:$$\hat{y} $$读作“ y hat ”,代表y 的估计值。 假设我们有一条直线,其方程是y = 0.5x+3,我们可以使用Jupyter Notebook 将它画出来,在Jupyter Notebook 中输入代码如下: ``` import numpy as np import matplotlib.pyplot as plt # 令x为- 5 到5 之间,元素数为100 的等差数列 x = np.linspace(- 5, 5, 100) # 输入直线方程 y = 0.5 * x + 3 plt.plot(x, y, c='orange') # 图题设为” Straight Line " plt.title('Straight Line') plt.show() ``` 运行代码,我们可以得到如图所示:  {结果分析]图中的直线,便是直线方程y=0.5x+3 的图像,而线性模型正是通过训练数据集确定自身的系数(斜率)和截距的。 下面我们来看一下线性模型的工作原理。 # 2、线性模型的图形表示 大家肯定还记得,我们在初中数学( 也可能是小学数学)中学过,两个点可以确定一条直线。假设有两个点, 它们的坐标是( 1, 3 )和( 4 , 5 ),那么我们可以画一条直线来穿过这两个点,并且计算出这条直线的方程。下面我们在Jupyter Notebook 中输入代码如下: ``` # 导入线性回归模型 from sklearn.linear_model import LinearRegression import numpy as np import matplotlib.pylab as plt # 输入两个点的横坐标 X = [[1], [4]] # 输入两个点的纵坐标 y = [3, 5] # 用线性模型拟合这个两个点 lr = LinearRegression().fit(X, y) # 画出两个点和直线的图形 z = np.linspace(0, 5, 20) plt.scatter(X, y, s=80) plt.plot(z, lr.predict(z.reshape(- 1, 1)), c='k') # 设定图题为Straight Line plt.title('Straight Line') # 将图片显示出来 plt.show() ``` 运行代码,将会得到如图所示的结果。  [结果分析] 图中表示的就是穿过上述两个数据点的直线,现在我们可以确定这条直线的方程。 在Jupyter Notebook 中输入代码如下: ``` print("直线方程为:") print('y={:.3f}'.format(lr.coef_[0]),'x','+{:.3f}'.format(lr.intercept_)) ``` 运行结果: ``` 直线方程为: y=0.667 x +2.333 ``` {结果分析] 通过程序的计算,我们很容易就可以得到这条直线的方程为y = 0.667 x + 2 .333,这是数据中只有2 个点的情况, 那如果是3 个点会是怎样的情况呢?我们来实验一下,假设现在有第3 个点,坐标是(3 ,3),我们把这个点添加进去,看会得到怎样的结果。 输入代码如下: ``` # 导入线性回归模型 from sklearn.linear_model import LinearRegression import numpy as np import matplotlib.pylab as plt # 输入两个点的横坐标 X = [[1], [4],[3]] # 输入两个点的纵坐标 y = [3, 5,3] # 用线性模型拟合这个3个点 lr = LinearRegression().fit(X, y) # 画出两个点和直线的图形 z = np.linspace(0, 5, 20) plt.scatter(X, y, s=80) plt.plot(z, lr.predict(z.reshape(- 1, 1)), c='k') # 设定图题为Straight Line plt.title('Straight Line') # 将图片显示出来 plt.show() ``` 运行结果:  [结果分析] 从图中我们可以看到,这次直线没有穿过任何一个点,而是位于一个和3 个点的距离相加最小的位置。 下面我们可以在计算出这条直线的方程,输入代码如下: ``` print("直线方程为:") print('y={:.3f}'.format(lr.coef_[0]),'x','+{:.3f}'.format(lr.intercept_)) ``` 运行结果: ``` 直线方程为: y=0.571 x +2.143 ``` [结果分析] 从图中我们可以看到,新的直线方程和只有2 个数据点的直线方程己经发生了变化。线性模型让自己距离每个数据点的加和为最小值。这也就是线性回归模型的原理。 当然,在实际应用中,数据量要远远大于2 个或是3 个,下面我们就用数量更多的数据来进行实验。 现在我们以scikit-klearn 生成的make_regr ssion 数据集为例,用Python 语句绘制一条线性模型的预测线,更加清晰地反映出线性模型的原理。在jupyter notebook 中输入代码如下: ``` # 导入线性回归模型 from sklearn.linear_model import LinearRegression from sklearn.datasets import make_regression import numpy as np import matplotlib.pylab as plt # 生成用于回归分析的数据集 X, y = make_regression(n_samples=50, n_features=1, n_informative=1, noise=50, random_state=1) # 使用线性模型对数据进行拟合 reg = LinearRegression() reg.fit(X, y) # z是我们生成的等差数列,用来画出线性模型的图形 z = np.linspace(-3, 3, 200).reshape(-1, 1) plt.scatter(X, y, c='b', s=60) plt.plot(z, reg.predict(z), c='k') plt.title('Linear Regression') plt.show() ``` 按下shi 位+回车键后, 会得到结果如图所示的结果。  [结果分析] 从图中我们可以看出,黑色直线是线性回归模型在make_regression 数据集中生成的预测线。接下来我们来看一下这条直线所对应的斜率和截距。 输入代码如下: ``` # 打印直线的系数和截距 print('直线的系数是:{:.2f}'.format(reg.coef_[0])) print('直线的截距是:{:.2f}'.format(reg.intercept_)) ``` 运行结果: ``` 直线的系数是:79.52 直线的截距是:10.92 ``` [结果分析] 从图中我们可以看到,在我们手工生成的数据集中,线性模型的方程为y=79.52x+10.92,而这条直线距离50 个数据点的距离之和是最小的。这便是一般线性模型的原理。 >⚠️: 细心的读者可能注意到coef_和intercept_这两个属性非常奇怪, 它们都是以下划线结尾。这是sciki-learn 的一个特点,它总是用下划线作为来自训练数据集的属性的结尾,以便将它们与由用户设置的参数区分开。 # 3、 线性模型的特点 在上面的内容中,我们使用的都是特征数只有l1个的数据集。用于回归分析的线性。模型在特征数为l1的数据集中,是使用一条直线来进行预测分析,而当数据的特征数量达到2 个时则是一个平面,而对于更多特征数量的数据集来说, 则是一个高维度的超平面。 如果和K 最近邻模型生成的预测进行比较的话,你会发现线性模型的预测方法是非常有局限性的一一很多数据都没有体现在这条直线上。从某种意义上说,这是一个问题。 因为使用线性模型的前提条件,是假设目标y 是数据特征的线性组合。但需要特别注意的是,使用一维数据集进行验证会让我们有一点偏颇,而对于特征变量较多的数据集来说, 线性模型就显得十分强大。尤其是,当训练数据集的特征变量大于数据点的数量的时候,线性模型可以对训练数据做出近乎完美的预测。 用于回归分析的线性模型也有很多种类。这些模型之间的区别在于如何从训练数据中确定模型参数w 和b,以及如何控制模型复杂度。下面的小节我们来看看几种回归分析中最流行的线性模型。