线性回归简述
简单线性回归
在生存中,我们常常能碰到这么一种情况,一个变量会跟着另一个变量的变革而变革,如圆的周长与半径的关系,当圆的半径确定了,那么周长也就确定了。另有一种情况就是,两个变量之间看似存在某种关系,但又没那么确定,如青少年的身高与体重,他们存在一种近似的线性关系:
身高/cm = 体重/kg +105
但是,并不是每个青少年都符合这个公式,只能说每个青少年的身高体重都存在这么一种近似的线性关系。这就是实在就是简单的线性回归,那么,到底什么是线性回归呢?如果我们将青少年的身高和体重值作为坐标,差别人的身高体重就会在平面上构成差别的坐标点,然后用一条直线,尽大概的去拟合这些点,这就是简单的线性回归。
简单的线性回归模子如下:
y=wx+b
此中x表现特性值(如:体重值),w表现权重,b表现偏置,y表现标签(如:身高值)。
多元线性回归
简单线性回归中,一个变量跟另一个变量的变革而变革,但是生存中,另有许多变量,大概由多个变量的变革决定着它的变革,好比房价,影响它的因素大概有:房屋面积、地理位置等等。如果我们要给它们创建出近似的线性关系,这就是多元线性回归,多元线性回归模子如下:
答案
线性回归算法
线性模子的根本概念
常用的线性模子包罗:线性回归、岭回归、套索回归等等,下面让我们来研究一下线性模子的特点。
假设x[0], x[1], …, x[p]为数据会合特性变量的数目,那么线性模子的一样寻常推测公式为:
y=w[0]∗x[0]+w[1]∗x[1]+…+w[p]∗x[p]+b
这个公式表现数据会合的数据点一共有p个特性,此中w和p为模子的参数,y为模子对于数据效果的推测值。那如果特性变量只有一个,线性模子的公式为:
y=w[0]∗x[0]+b
是不是很像直线方程的分析式呢,w[0]就是直线的斜率,b就是y轴的偏移量,也就是截距。因此对于多特性变量而言,每个w值对应每个特性直线的斜率,也就是每个特性的权重,它可以为负数。
线性回归的根本原理
线性回归也被称为最小二乘法,是在回归分析中最简单也是最经典的线性模子。
假设平面上有五个点,而线性回归要做的就是要找一条直线,而且让这条直线尽大概地拟合图中的数据点。但是1000个人有1000种直线的画法,可以横着画、竖着画等等,因此须要有一个评判的标准,来评判哪条直线才是最好的。那么该怎样判定呢?只要算一下每个点的现实y值和我找出的直线根据每个点x值推测出来的y值之间的间隔的平方差,然后将这些平方差相加,其和相对其他直线而言要最小。如下图:
公式如下:
表现每个训练数据点 到拟合直线的竖直间隔的平方和,通过最小化这个丧失函数来求得拟合直线的最佳参数 θ,现实上就是求丧失函数在取得最小值情况下θ的值。那么丧失函数为什么要用平方差情势呢,而不是绝对值情势,一次方,三次方,或四次方情势?
简单的说,是由于利用平方情势的时间,利用的是“最小二乘法”的头脑,这里的“二乘”指的是用平方来度量观测点与估计点的间隔(远近),“最小”指的是参数值要包管各个观测点与估计点的间隔的平方和到达最小。而且最小二乘法以估计值与观测值的平方和作为丧失函数,在弊端服从正态分布的条件下,与极大似然估计的头脑在本质上是雷同。
答案
线性回归实践 - 波斯顿房价推测
数据集先容
波斯顿房价数据集共有506条波斯顿房价的数据,每条数据包罗对指定房屋的13项数值型特性和目标房价构成。用数据集的80%作为训练集,数据集的20%作为测试集,训练集和测试会合都包罗特性和目标房价。
想要利用该数据集可以利用如下代码:
import pandas as pd
#获取训练数据
train_data = pd.read_csv(‘./step3/train_data.csv’)
#获取训练标签
train_label = pd.read_csv(‘./step3/train_label.csv’)
train_label = train_label[‘target’]
#获取测试数据
test_data = pd.read_csv(‘./step3/test_data.csv’)
LinearRegression
LinearRegression的构造函数中有两个常用的参数可以设置:
fit_intercept:是否有截据,如果没有则直线过原点,默以为Ture。
normalize:是否将数据归一化,默以为False。
LinearRegression类中的fit函数用于训练模子,fit函数有两个向量输入:
X:巨细为**[样本数目,特性数目]的ndarray,存放训练样本
Y:值为整型,巨细为[样本数目]**的ndarray,存放训练样本的标签值
LinearRegression类中的predict函数用于推测,返回推测值,predict函数有一个向量输入:
X:巨细为**[样本数目,特性数目]**的ndarray,存放推测样本
LinearRegression的利用代码如下:
lr = LinearRegression()
lr.fit(X_train, Y_train)
predict = lr.predict(X_test)
代码
- from sklearn import datasets
- from sklearn.model_selection import train_test_split
- from sklearn.linear_model import LinearRegression
- from sklearn.metrics import r2_score
- import pandas as pd
-
-
- #获取训练数据
- train_data = pd.read_csv('./step3/train_data.csv')
- #获取训练标签
- train_label = pd.read_csv('./step3/train_label.csv')
- train_label = train_label['target']
- #获取测试数据
- test_data = pd.read_csv('./step3/test_data.csv')
-
- lr = LinearRegression()
- lr.fit(train_data, train_label)
- predict = lr.predict(test_data)
- df = pd.DataFrame({'result': predict})
- df.to_csv(r'./step3/result.csv', index = False)
-
-
复制代码 利用sklearn构建线性回归模子
线性模子的用法
在python中,线性回归算法是通过LinearRegression()模块实现的。
from sklearn.linear_model import LinearRegression
lrn = LinearRegression(fit_intercept=True, normalize=False,copy_X=True, n_jobs=1)
参数:
fit_intercept:是否有截据,如果没有则直线过原点,默以为Ture。
normalize:是否将数据归一化,默以为False。
copy_X:默以为True,当为True时,X会被copied,否则X将会被覆写;
n_jobs:默认值为1。盘算时利用的核,如果为-1,则代表调用全部cpu
LinearRegression类做了什么功能呢?它帮我们省去了梯度降落、盘算丧失等等过程。它有一个fit方法,我们把数据集放入此中,它会根据我们提供的数据集为这些数据集规划出一条满意最小二乘法的最优直线。
lr = lrn.fit(x,y)
LinearRegression类中的fit函数用于训练模子,fit函数有两个向量输入:
X:巨细为**[样本数目,特性数目]的ndarray,用于存放训练样本。
Y:值为整型,巨细为[样本数目]**的ndarray,用于存放训练样本的标签值。
当我们的模子创建完成后,我们就可以通过调用模子的内下属性打印出我们须要求的直线方程的w值和b值,而且如果效果得到的是负数,它们也会表现负数。
lr.coef_[0] # w值(斜率)
#lr.coef_是存储全部w值的,是一个数组结构,如果有多个特性变量的话就会有多个值在内里,从前去后分别对应着第一个特性变量、第二个特性变量…
lr.intercept_ # b值(截距)
lr.predict([[1]])
#predict函数用于推测,返回推测值。predict函数有一个向量输入:X:巨细为**[样本数目,特性数目]**的ndarray,用于存放推测样本
线性回归没有可供用户调治的参数(像KNN算法可以调治参数K值来改变模子的评估,线性回归没有),固然这是它的上风,但也让我们无法控制模子的复杂性,因此我们在创建模子后每每会出现如:过拟合、欠拟合等情况。
示例代码如下:
- from sklearn.linear_model import LinearRegression
- x = [[4], [8], [12], [10], [16]] # 横坐标
- y = [3, 5, 7, 10, 15] # 纵坐标
- lr = LinearRegression().fit(x,y) # 关键点
- k = lr.coef_[0]
- b = lr.intercept_
- print(k, b)
- print(lr.predict([[10]]))
复制代码 代码
- from sklearn.linear_model import LinearRegression
- x = [[1], [4], [6], [10], [12]]
- y = [3, 5, 7, 10, 6]
- # 1.建立模型并拟合
- # 2.赋值给变量lr
- ######### Begin #########
- lr = LinearRegression().fit(x,y)
- ######### end ##########
- # 1.得到回归模型的k值并赋值给变量k
- # 2.得到回归模型的b值并赋值给变量b
- ######### Begin #########
- k = lr.coef_[0]
- b = lr.intercept_
- ######### end ##########
- print("回归直线方程为:" + "y = {:.3f}".format(k) + "x" + " + " + "{:.3f}".format(b))
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金 |