线性回归,岭回归

文章目录

  • 线性回归
    • 回归算法
    • 回归算法之线性回归
    • 优缺点
    • 损失函数
    • 梯度下降算法
    • LinearRegression
    • 属性
    • 加入交叉验证
    • 线性回归案例分析
    • 波士顿房价预测
    • 5.性能评测
    • 案例
    • 欠拟合与过拟合
    • 解决过拟合的方法
    • 回归算法之岭回归
    • sklearn.linear_model.Ridge
    • 方法
    • 属性
    • 案例分析

线性回归

回归算法

回归是统计学中最有力的工具之一。机器学习监督学习算法分为分类算法和回归算法两种,其实就是根据类别标签分布类型为离散型、连续性而定义的。回归算法用于连续型分布预测,针对的是数值型的样本,使用回归,可以在给定输入的时候预测出一个数值,这是对分类方法的提升,因为这样可以预测连续型数据而不仅仅是离散的类别标签。
回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。那么什么是线性关系和非线性关系?
比如说在房价上,房子的面积和房子的价格有着明显的关系。那么X=房间大小,Y=房价,那么在坐标系中可以看到这些点:
在这里插入图片描述
如果是一条曲线,那么叫非线性关系在这里插入图片描述
那么回归的目的就是建立一个回归方程(函数)用来预测目标值,回归的求解就是求这个回归方程的回归系数。
在这里插入图片描述

回归算法之线性回归

线性回归的定义是:目标值预期是输入变量的线性组合。线性模型形式简单、易于建模,但却蕴含着机器学习中一些重要的基本思想。线性回归,是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。

在这里插入图片描述
矩阵就是为了服务运算 先横后束 numpy

优缺点

在这里插入图片描述
对于单变量线性回归,例如:前面房价例子中房子的大小预测房子的价格。f(x) = w1x+w0,这样通过主要参数w1就可以得出预测的值。
通用公式为:在这里插入图片描述那么对于多变量回归,例如:瓜的好坏程度 f(x) = w0+0.2色泽+0.5根蒂+0.3
敲声,得出的值来判断一个瓜的好与不好的程度。
通用公式为
在这里插入图片描述线性模型中的向量W值,客观的表达了各属性在预测中的重要性,因此线性模型有很好的解释性。对于这种“多特征预测”也就是(多元线性回归),那么线性回归就是在这个基础上得到这些W的值,然后以这些值来建立模型,预测测试数据。简单的来说就是学得一个线性模型以尽可能准确的预测实值输出标记。
那么如果对于多变量线性回归来说我们可以通过向量的方式来表示W值与特征X值之间的关系在这里插入图片描述
一个列向量的转置与特征的乘积,得出我们预测的结果,但是显然我们这个模型得到的结果可定会有误差,如下图所示在这里插入图片描述
在这里插入图片描述

损失函数

损失函数是一个贯穿整个机器学习重要的一个概念,大部分机器学习算法都会有误差,我们得通过显性的公式来描述这个误差,并且将这个误差优化到最小值
对于线性回归模型,将模型与数据点之间的距离差之和做为衡量匹配好坏的标准,误差越小,匹配程度越大。我们要找的模型就是需要将f(x)和我们的真实值之间最相似的状态。于是我们就有了误差公式,模型与数据差的平方和最小:
在这里插入图片描述上面公式定义了所有的误差和,那么现在需要使这个值最小?那么有两种方法,一种使用梯度下降算法,另一种使正规方程解法(只适用于简单的线性回归)。

梯度下降算法

上面误差公式是一个通式,我们取两个单个变量来求最小值,误差和可以表示为:
在这里插入图片描述可以通过调整不同的在这里插入图片描述
​​的值,就能使误差不断变化,而当你找到这个公式的最小值时,你就能得到最好的在这里插入图片描述而这对在这里插入图片描述就是能最好描述你数据关系的模型参数。
怎么找在这里插入图片描述的最小?在这里插入图片描述的图像其实像一个山谷一样,有一个最低点。找这个最低点的办法就是,先随便找一个点,然后 沿着这个碗下降的方向找,最后就能找到山谷的最低点。

在这里插入图片描述
在这里插入图片描述
​​

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

LinearRegression

sklearn.linear_model.LinearRegression

class LinearRegression(fit_intercept = True,normalize = False,copy_X = True,n_jobs = 1)""":param normalize:如果设置为True时,数据进行标准化。请在使用normalize = False的估计器调时用fit之前使用preprocessing.StandardScaler:param copy_X:boolean,可选,默认为True,如果为True,则X将被复制:param n_jobs:int,可选,默认1。用于计算的CPU核数

实例代码:

from sklearn.linear_model import LinearRegression
reg = LinearRegression()

方法
fit(X,y,sample_weight = None)
使用X作为训练数据拟合模型,y作为X的类别值。X,y为数组或者矩阵

reg.fit ([[0, 0], [1, 1], [2, 2]], [0, 1, 2])

predict(X)
预测提供的数据对应的结果

reg.predict([[3,3]])array([ 3.])

属性

coef_
表示回归系数w=(w1,w2…)

reg.coef_array([ 0.5,  0.5])

intercept_ 表示w0

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

加入交叉验证

前面我们已经提到了模型的交叉验证,那么我们这个自己去建立数据集,然后通过线性回归的交叉验证得到模型。由于sklearn中另外两种回归岭回归、lasso回归都本省提供了回归CV方法,比如linear_model.Lasso,交叉验证linear_model.LassoCV;linear_model.Ridge,交叉验证linear_model.RidgeCV。所以我们需要通过前面的cross_validation提供的方法进行k-折交叉验证

from sklearn.datasets.samples_generator import make_regression
from sklearn.model_selection import cross_val_score
from sklearn import linear_model
import matplotlib.pyplot as pltlr = linear_model.LinearRegression()
X, y = make_regression(n_samples=200, n_features=5000, random_state=0)
result = cross_val_score(lr, X, y)
print result

线性回归案例分析

波士顿房价预测

使用scikit-learn中内置的回归模型对“美国波士顿房价”数据进行预测。对于一些比赛数据,可以从kaggle官网上获取,网址:https://www.kaggle.com/datasets
1.美国波士顿地区房价数据描述

from sklearn.datasets import load_bostonboston = load_boston()print boston.DESCR

2.波士顿地区房价数据分割

from sklearn.cross_validation import train_test_split
import numpy as np
X = boston.data
y = boston.targetX_train,X_test,y_train,y_test = train_test_split(X,y,random_state=33,test_size = 0.25)

3.训练与测试数据标准化处理

from sklearn.preprocessing import StandardScaler
ss_X = StandardScaler()
ss_y = StandardScaler()X_train = ss_X.fit_transform(X_train)
X_test = ss_X.transform(X_test)
y_train = ss_X.fit_transform(y_train)
X_train = ss_X.transform(y_test

使用最简单的线性回归模型LinearRegression和梯度下降估计SGDRegressor对房价进行预测

from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(X_train,y_train)
lr_y_predict = lr.predict(X_test)from sklearn.linear_model import SGDRegressor
sgdr = SGDRegressor()
sgdr.fit(X_train,y_train)
sgdr_y_predict = sgdr.predict(X_test

5.性能评测

对于不同的类别预测,我们不能苛刻的要求回归预测的数值结果要严格的与真实值相同。一般情况下,我们希望衡量预测值与真实值之间的差距。因此,可以测评函数进行评价。其中最为直观的评价指标均方误差(Mean Squared Error)MSE,因为这也是线性回归模型所要优化的目标。
MSE的计算方法如式
在这里插入图片描述
使用MSE评价机制对两种模型的回归性能作出评价

from sklearn.metrics import mean_squared_errorprint '线性回归模型的均方误差为:',mean_squared_error(ss_y.inverse_transform(y_test),ss_y.inverse_tranform(lr_y_predict))
print '梯度下降模型的均方误差为:',mean_squared_error(ss_y.inverse_transform(y_test),ss_y.inverse_tranform(sgdr_y_predict))

通过这一比较发现,使用梯度下降估计参数的方法在性能表现上不及使用解析方法的LinearRegression,但是如果面对训练数据规模十分庞大的任务,随即梯度法不论是在分类还是回归问题上都表现的十分高效,可以在不损失过多性能的前提下,节省大量计算时间。根据Scikit-learn光网的建议,如果数据规模超过10万,推荐使用随机梯度法估计参数模型。
注意:线性回归器是最为简单、易用的回归模型。正式因为其对特征与回归目标之间的线性假设,从某种程度上说也局限了其应用范围。特别是,现实生活中的许多实例数据的各种特征与回归目标之间,绝大多数不能保证严格的线性关系。尽管如此,在不清楚特征之间关系的前提下,我们仍然可以使用线性回归模型作为大多数数据分析的基线系统。

案例

from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_boston
from sklearn.cross_validation import train_test_split
from sklearn.metrics import mean_squared_error,classification_report
from sklearn.cluster import KMeansdef linearmodel():"""线性回归对波士顿数据集处理:return: None"""# 1、加载数据集ld = load_boston()x_train,x_test,y_train,y_test = train_test_split(ld.data,ld.target,test_size=0.25)# 2、标准化处理# 特征值处理std_x = StandardScaler()x_train = std_x.fit_transform(x_train)x_test = std_x.transform(x_test)# 目标值进行处理std_y  = StandardScaler()y_train = std_y.fit_transform(y_train)y_test = std_y.transform(y_test)# 3、估计器流程# LinearRegressionlr = LinearRegression()lr.fit(x_train,y_train)# print(lr.coef_)y_lr_predict = lr.predict(x_test)y_lr_predict = std_y.inverse_transform(y_lr_predict)print("Lr预测值:",y_lr_predict)# SGDRegressorsgd = SGDRegressor()sgd.fit(x_train,y_train)# print(sgd.coef_)y_sgd_predict = sgd.predict(x_test)y_sgd_predict = std_y.inverse_transform(y_sgd_predict)print("SGD预测值:",y_sgd_predict)# 带有正则化的岭回归rd = Ridge(alpha=0.01)rd.fit(x_train,y_train)y_rd_predict = rd.predict(x_test)y_rd_predict = std_y.inverse_transform(y_rd_predict)print(rd.coef_)# 两种模型评估结果print("lr的均方误差为:",mean_squared_error(std_y.inverse_transform(y_test),y_lr_predict))print("SGD的均方误差为:",mean_squared_error(std_y.inverse_transform(y_test),y_sgd_predict))print("Ridge的均方误差为:",mean_squared_error(std_y.inverse_transform(y_test),y_rd_predict))return None

欠拟合与过拟合

机器学习中的泛化,泛化即是,模型学习到的概念在它处于学习的过程中时模型没有遇见过的样本时候的表现。在机器学习领域中,当我们讨论一个机器学习模型学习和泛化的好坏时,我们通常使用术语:过拟合和欠拟合。我们知道模型训练和测试的时候有两套数据,训练集和测试集。在对训练数据进行拟合时,需要照顾到每个点,而其中有一些噪点,当某个模型过度的学习训练数据中的细节和噪音,以至于模型在新的数据上表现很差,这样的话模型容易复杂,拟合程度较高,造成过拟合。而相反如果值描绘了一部分数据那么模型复杂度过于简单,欠拟合指的是模型在训练和预测时表现都不好的情况,称为欠拟合。
我们来看一下线性回归中拟合的几种情况图示:在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解决过拟合的方法

在线性回归中,对于特征集过小的情况,容易造成欠拟合(underfitting),对于特征集过大的情况,容易造成过拟合(overfitting)。针对这两种情况有了更好的解决办法
欠拟合
欠拟合指的是模型在训练和预测时表现都不好的情况,欠拟合通常不被讨论,因为给定一个评估模型表现的指标的情况下,欠拟合很容易被发现。矫正方法是继续学习并且试着更换机器学习算法。
过拟合
对于过拟合,特征集合数目过多,我们需要做的是尽量不让回归系数数量变多,对拟合(损失函数)加以限制。
(1)当然解决过拟合的问题可以减少特征数,显然这只是权宜之计,因为特征意味着信息,放弃特征也就等同于丢弃信息,要知道,特征的获取往往也是艰苦卓绝的。
在这里插入图片描述

回归算法之岭回归

具有L2正则化的线性最小二乘法。岭回归是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法,对病态数据的拟合要强于最小二乘法。当数据集中存在共线性的时候,岭回归就会有用。

sklearn.linear_model.Ridge

class sklearn.linear_model.Ridge(alpha=1.0, fit_intercept=True, normalize=False, copy_X=True, max_iter=None, tol=0.001, solver='auto', random_state=None)**""":param alpha:float类型,正规化的程度"""
from sklearn.linear_model import Ridge
clf = Ridge(alpha=1.0)
clf.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1]))

方法

score(X, y, sample_weight=None)

clf.score()

属性

coef_
intercept

clf.coef_
array([ 0.34545455,  0.34545455])
clf.intercept_
0.13636...

案例分析

def linearmodel():"""线性回归对波士顿数据集处理:return: None"""# 1、加载数据集ld = load_boston()x_train,x_test,y_train,y_test = train_test_split(ld.data,ld.target,test_size=0.25)# 2、标准化处理# 特征值处理std_x = StandardScaler()x_train = std_x.fit_transform(x_train)x_test = std_x.transform(x_test)# 目标值进行处理std_y  = StandardScaler()y_train = std_y.fit_transform(y_train)y_test = std_y.transform(y_test)# 3、估计器流程# LinearRegressionlr = LinearRegression()lr.fit(x_train,y_train)# print(lr.coef_)y_lr_predict = lr.predict(x_test)y_lr_predict = std_y.inverse_transform(y_lr_predict)print("Lr预测值:",y_lr_predict)# SGDRegressorsgd = SGDRegressor()sgd.fit(x_train,y_train)# print(sgd.coef_)y_sgd_predict = sgd.predict(x_test)y_sgd_predict = std_y.inverse_transform(y_sgd_predict)print("SGD预测值:",y_sgd_predict)# 带有正则化的岭回归rd = Ridge(alpha=0.01)rd.fit(x_train,y_train)y_rd_predict = rd.predict(x_test)y_rd_predict = std_y.inverse_transform(y_rd_predict)print(rd.coef_)# 两种模型评估结果print("lr的均方误差为:",mean_squared_error(std_y.inverse_transform(y_test),y_lr_predict))print("SGD的均方误差为:",mean_squared_error(std_y.inverse_transform(y_test),y_sgd_predict))print("Ridge的均方误差为:",mean_squared_error(std_y.inverse_transform(y_test),y_rd_predict))return None

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C 语言中,x += 5 == 4 是什么意思?

#讨论这个有意义吗?这个是在知乎上看到的一个问题,评论挺多的。其中有人提到,研究这个东西有什么用?编程的时候我们不能这么写的。我记得在大学的时候,我们的副院长给我们上课,就给我们提到,要习…

一次深刻的面试经历

没有吐槽,没有埋怨,没有鸡汤,纯分享。近期我到某名牌房地产公司参加了一次面试,面试岗位是企划主管,我把面试经历跟大家简单分享一下。面试背景:我一直从事广告传媒工作,在工作中服务过不同的客…

Linux内核设计的艺术

Linux内核设计的艺术这本书是我认为对Linux内核描述非常优秀的书籍。书籍中描述了内核启动的流程,内核运行的机理,内存管理,进程管理等等。#书籍目录第1章 从开机加电到执行main函数之前的过程11.1 启动BIOS,准备实模式下的中断向…

sklearn

文章目录机器学习机器怎样学习机器学习的两种方式用处监督学习三要素监督学习概念与数学形式统计学习三要素模型策略两大策略监督学习三大问题分类问题精确率与召回率标注问题回归问题无监督学习无监督学习主要方法无监督学习之聚类分析用途高斯混合模型密度分布估计协方差估计…

Tomcat 在mac上(Idea)端口冲突解决办法

Port already in use: 1099 在mac上解决办法直接是找到占用1099端口的pid; 解决方式: lsof -i:1099 回车,之后会有pid,然后执行 kill (pid号) 最后问题就得到了解决! 注意:有的时候kill不能将占用端口的pid…

调试LCD反被调戏了

相关文章调试,是一件有挑战的事情这篇文章的题目应该写做 - 我又被LCD艹了一个晚上。写个文档简单总结下#LCD显示的一些基本概念数字视频的基本概念源自于模拟视频。对于模拟视频我们可以这样理解:视频可以分解为若干个基本视点(像素&#xf…

被LCD调戏睡不着了

好吧,我承认我不是因为被调戏睡不着的,我是因为今天晚上喝了一杯该死的咖啡,然后就睡不着了,这个点[3:40]在床上翻来覆去,刚开始我摸着楠哥的小腿,过了一会,觉得没意思了&#xff0c…

线性表、顺序表

文章目录线性表、顺序表线性表概念线性结构特点线性表概念两种分类顺序表代码遍历查找插入删除逆置链表(用指针实现变长的先行存储结构)特点习题线性表、顺序表 线性表概念 线性结构特点 存在唯一一个被称为“第一个”的数据元素存在唯一一个被称为“最…

Linux 5.7 将支持国产 RISC-V 芯片 K210

这是转载的一篇文章,文章主要内容是Linux合入了一个国产芯片k210的代码,虽然这个芯片不是很强大,但是对于学习来说非常有意义,而且,还有人在这个开发板上移植了Linux 0.11。今天早上我在查阅 Linux 内核邮件列表的时候…

动态路由选择协议(二)距离矢量路由选择协议

大多数的路由选择协议属于下面二者之一: 距离矢量(distance vector)和链路状态(link state)。 本篇学习的是距离矢量路由选择协议的基础。 大多数的距离矢量算法是R.E.Bellman、L.R.Ford和D.R.Fulkerson所做的工作为基…

我和蓝牙BT,BLE有一腿

你好,很不幸,你被一个标题骗了进来,可能我以后还会骗你,我这篇文章主要是写蓝牙相关的,不会涉及技术细节,主要是总结一些概念,这些概念会帮助你了解蓝牙知识,帮助你在面试或者聊天的…

循环链表、双链表

文章目录循环链表、双链表双链表插入删除单循环链表双循环链表习题线性表实现方法比较循环链表、双链表 双链表 插入 删除 单循环链表 双循环链表 习题 线性表实现方法比较

[芦半山]Binder的异常机制

文中代码分析基于Android 10.0 (Q)两个进程之间若是要进行Binder通信,那么发起通信的一端我们就称它为Client进程。Client进程调用每一个代理对象的方法,本质上都是一次跨进程通信。如果这个方法是同步方法(非oneway修饰)&#xf…

消息中间件核心实体(1)

接上一篇《消息中间件核心实体(0)》,这一篇继续介绍消息中间件中的一些实体。 上一篇主要是Message、Topic、TopicMeta和Queue这样最基础的实体,这几篇介绍一些发送和消费的过程中会涉及到的实体和组件。 1. 发送 1.1 增强Message属性 Message一般只包含…

sklearn(2

算法库顶层设计 SKLEARN监督学习模块 近邻算法 neighbors支持向量机SVM岭回归 kernal_ridge判别分析discriminant_analysis广义线性模型linear_model集成方法ensemble决策树tree朴素贝叶斯naive_bayes交叉分解cross_decompostition高斯过程gaussian_process多层神经网络neural…

该死的装修

周末了,没有写技术文~因为最近的新房子需要装修,谈了几个装修公司,不知道为什么,我对装修这个事情非常抵触,繁琐的事情太多了,还没有装修,我就觉得有很多事情要斗争。因为家里有小孩&#xff0c…

SKLEARN模型选择

数据集划分方法 K折交叉验证法 将全部训练集S分成k个不相交的子集,假设S中的训练样例子数为m,那么每一个子集有m/k个训练样例,相应子集称作{s1,s2……sk}每次从分好的子集里面,拿一个作为测试集,其他k-1作为训练集在k…

被该死的Openssl编译嘲讽了一个下午

昨晚比较尴尬,下班的时候已经很晚了,到半路突然想起来没有带钥匙回去,赶紧折返回公司拿钥匙,在已经很晚的路上我们又多花费了20分钟,到家已经挺晚了,具体多少点我都不好意思说,我要是说出来&…

JavaScript中本地对象、内置对象和宿主对象

http://www.jianshu.com/p/a52e6e183427 http://blog.csdn.net/weiyastory/article/details/52837466 http://www.cnblogs.com/qigang/p/3520974.html 在ECMAScript中,所有对象并非同等创建的。 一般来说,可以创建并使用的对象有3种:本地对象…

类的真正形态

类的真正形态 类的关键字 struct在C语言中已经有了自己的定义,必须继续兼容 在C中提供了新的关键字,class用于类定义 class和struct用法是完全相同 struct和class区别 用struct定义时,所有成员默认为public 用class定义时,所…