线性回归分析-回归算法
1 回归算法
机器学习中监督学习算法分为分类算法和回归算法两种,其实就是根据类别标签分布类型为离散型、连续性而定义的。回归算法用于目标是连续的,在指定区间内可以是任意一个数值,针对的是数值型的样本,使用回归,可以在给定输入的时候预测出一个数值,这是对分类方法的提升,因为这样可以预测连续型数据而不仅仅是离散的类别标签。
首先举个房价的例子,房子的面积和房子的价格有着明显的关系,那么在坐标系中可以看到这些点:
如果那么通过一条直线把这个关系描述出来,叫线性关系
如果那么通过一条曲线把这个关系描述出来,叫非线性关系
其实回归的目的就是建立一个回归方程(函数)用来预测目标值,回归的求解就是求这个回归方程的回归系数。
2 回归算法之线性回归
线性回归的定义是:目标值预期是输入变量的线性组合。线性回归通过一个或多个自变量与因变量之间进行建模的回归分析。其特点是一个或多个称之为回归系数的模型参数的线性组合。
一元线性回归:涉及到的变量只有一个。
多元线性回归:涉及到的变量两个或两个以上。
线性模型中的向量W值,客观的表达了各属性在预测中的重要性,对于这种“多特征预测”也就是(多元线性回归),那么线性回归就是在这个基础上得到这些W的值,然后以这些值来建立模型,预测测试数据。简单的来说就是学得一个线性模型以尽可能准确的预测实值输出标记。
那么如果对于多变量线性回归来说我们可以通过向量的方式来表示W值与特征X值之间的关系:
两向量相乘,结果为一个整数是估计值,其中所有特征集合的第一个特征值 =1,那么我们可以通过通用的向量公式来表示线性模型:
一个列向量的转置与特征的乘积,得出我们预测的结果,但是显然我们这个模型得到的结果可定会有误差,如下
3 损失函数(最小二乘法)
损失函数是一个贯穿整个机器学习重要的一个概念,大部分机器学习算法都会有误差,我们得通过显性的公式来描述这个误差,并且将这个误差优化到最小值。
对于线性回归模型,将模型与数据点之间的距离差之和做为衡量匹配好坏的标准,误差越小,匹配程度越大。我们要找的模型就是需要将f(x)和我们的真实值之间最相似的状态。所以误差公式就是模型与数据差的平方和最小:
上面公式定义了所有的误差和,如何去求模型当中的W,使得损失最小?(目的是找到最小损失对应的W值)。有两种办法,一种使用梯度下降算法,另一种使正规方程解法(只适用于简单的线性回归)。
正规方程公式如下:
4 最小二乘法之梯度下降
误差公式是一个通式,我们取两个单个变量来求最小值,误差和可以表示为:
通过调整不同的w1 和w0的值,就能使误差不断变化,而当你找到这个公式的最小值时,你就能得到最好的w1 ,w0而这对(w1 ,w0 )就是能最好描述你数据关系的模型参数。怎么找cost(w0+w1x1 )的最小?cost(w0+w1x1)的图像其实像一个山谷一样,有一个最低点。找这个最低点的办法就是,然后沿着这个弯下降的方向找,最后就能找到山谷的最低点。
进行移动的时候也需要考虑,每次移动的速度,也就是α的值,这个值也叫做(学习率)
样就能求出w0 ,w1的值,当然你这个过程是不断的进行迭代求出来,通过交叉验证方法即可。
α为学习率,需要手动指定
5 sklearn线性回归正规方程、梯度下降API
sklearn.linear_model.LinearRegression 正规方程
sklearn.linear_model.SGDRegressor 梯度下降
方法:
fit(X,y,sample_weight = None)使用X作为训练数据拟合模型,y作为X的类别值。X,y为数组或者矩阵
predict(X)预测提供的数据对应的结果
属性:
coef_表示回归系数w=(w1,w2…)
intercept_ 表示w0
6 案例
波士顿房价数据案例分析流程
步骤:①波士顿地区房价数据获取;②波士顿地区房价数据分割③训练与测试数据标准化处理;④使用最简单的线性回归模型LinearRegression和
梯度下降估计SGDRegressor对房价进行预测
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression,SGDRegressor
# 1获取数据
lb = load_boston()# 2分割数据为训练集合测试集
x_train,x_test,y_train,y_test = train_test_split(lb.data,lb.target,test_size=0.25)# 3进行标准化处理,特征值和目标值都必须进行标准化处理
std1 = StandardScaler()
x_train = std1.fit_transform(x_train)
x_test = std1.transform(x_test)
# 目标值标准化
std2 = StandardScaler()
y_train = std2.fit_transform(y_train.reshape(-1,1))
y_test = std2.transform(y_test.reshape(-1,1))# 4.estimator估计器测试
# 4.1正规方程求解预测
lr = LinearRegression()
# 输入数据一直不断用训练数据建立模型
lr.fit(x_train,y_train)print("lr回归系数为",lr.coef_)
# 预测测试集房子价格
y_predict = lr.predict(x_test)
# 因为标准化之后得出的都是标准化比较小的值,要想看到原来的值,要用inverse_transform转化为标准化之前的值
y_predict = std2.inverse_transform(y_predict)
print("lr测试集每个样本的预测价格:",y_predict)
# 4.2梯度下降求解预测
sgd = SGDRegressor()
# 输入数据一直不断用训练数据建立模型
sgd.fit(x_train,y_train)print("sgd回归系数为",sgd.coef_)
# 预测测试集房子价格
y_sgdPredict = sgd.predict(x_test)
# 因为标准化之后得出的都是标准化比较小的值,要想看到原来的值,要用inverse_transform转化为标准化之前的值
y_sgdPredict = std2.inverse_transform(y_sgdPredict)
print("sgd测试集每个样本的预测价格:",y_sgdPredict)
7 回归性能评估
(均方误差(Mean Squared Error)MSE) 评价机制:
其实就是对每一组预测值减去真实值的平方求和
sklearn回归评估API:sklearn.metrics.mean_squared_error
mean_squared_error(y_true, y_pred)均方误差回归损失
y_true:真实值
y_pred:预测值
return:浮点数结果
注意:真实值,预测值为标准化之前的值
print("正规方程均方根误差:",mean_squared_error(std2.inverse_transform(y_test),y_predict))
print("梯度下降均方根误差",mean_squared_error(std2.inverse_transform(y_test),y_sgdPredict))
由于数据量少,所以正规方程的均方根误差小一点
8 线性回归的优缺点
优点:结果易于理解,计算不复杂
缺点:对非线性的数据拟合不好
9 正规方程与梯度下降对比
此图为官网给我们的建议如何选择算法,当数据量大于10万的时候建议使用梯度下降
LinearRegression与SGDRegressor评估:
特点:线性回归器是最为简单、易用的回归模型。从某种程度上限制了使用,尽管如此,在不知道特征之间关系的前提下,我们仍然使用线性回归器作为大多数系统的首要选择。小规模数据:LinearRegression(不能解决拟合问题)以及其它大规模数据:SGDRegressor