文章目录
- 线性回归简述
- 答案
- 线性回归算法
- 答案
- 线性回归实践 - 波斯顿房价预测
- LinearRegression
- 代码
- 利用sklearn构建线性回归模型
- 示例代码如下:
- 代码
线性回归简述
简单线性回归
在生活中,我们常常能碰到这么一种情况,一个变量会跟着另一个变量的变化而变化,如圆的周长与半径的关系,当圆的半径确定了,那么周长也就确定了。还有一种情况就是,两个变量之间看似存在某种关系,但又没那么确定,如青少年的身高与体重,他们存在一种近似的线性关系:
身高/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 LinearRegressionx = [[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))