提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
回归是统计学中最有力的工具之一。机器学习监督学习算法分为分类算法和回归算法两种,其实就是根据类别标签分布类型为离散型、连续性而定义的。回归算法用于连续型分布预测,针对的是数值型的样本,使用回归,可以在给定输入的时候预测出一个数值,这是对分类方法的提升,因为这样可以预测连续型数据而不仅仅是离散的类别标签。
回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。那么什么是线性关系和非线性关系?
比如说在房价上,房子的面积和房子的价格有着明显的关系。那么X=房间大小,Y=房价,那么在坐标系中可以看到这些点:
那么通过一条直线把这个关系描述出来,叫线性关系
如果是一条曲线,那么叫非线性关系
那么回归的目的就是建立一个回归方程(函数)用来预测目标值,回归的求解就是求这个回归方程的回归系数。
试图学得一个通过属性的线性组合来进行预测的函数:
定义:线性回归通过一个或者多个自变量与因变量之间之间进行建模的回归分析。其中特点为一个或多个称为回归系数的模型参数的线性组合
一元线性回归:涉及到的变量只有一个
多元线性回归:涉及到的变量两个或两个以上
_为第个训练样本的真实值
ℎ_ ()为第个训练样本特征值组合预测函数
如何去求模型当中的W,使得损失最小?
(目的是找到最小损失对应的W值)
损失函数直观图(单变量举例)
我们以单变量中的w0,w1为例子:
sklearn.linear_model.LinearRegression
正规方程
sklearn.linear_model.SGDRegressor
梯度下降
sklearn.linear_model.LinearRegression()
普通最小二乘线性回归
coef_:回归系数
sklearn.linear_model.SGDRegressor( )
通过使用SGD最小化线性模型
coef_:回归系数
1、sklearn线性回归正规方程、梯度下降API
2、波士顿房价数据集分析流程
波士顿房价数据案例分析流程
1、波士顿地区房价数据获取
2、波士顿地区房价数据分割
3、训练与测试数据标准化处理
4、使用最简单的线性回归模型LinearRegression和
梯度下降估计SGDRegressor对房价进行预测
import pandas as pd
import numpy as np
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge, LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error,classification_report
from sklearn.externals import joblib
def mylinear():
"""
线性回归直接预测房子价格(波士顿房价)
:return:None
"""
#获取数据
lb=load_boston()
# print(lb.data)
#划分训练集和测试集
x_train,x_test,y_train,y_test=train_test_split(lb.data,lb.target,test_size=0.25)
#进行标准化处理
#特征值和目标值要分开进行标准化处理,实例化两个标准化API
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.reshape(-1, 1))
y_test=std_y.transform(y_test.reshape(-1, 1))
# estimator预测
#
# 正规方差求解方式预测结果:
lr=LinearRegression()
lr.fit(x_train,y_train)
#保存API###
# joblib.dump(lr,"./tmp/test.pkl")
# # 加载API,预测房价结果###
# model=joblib.load("./tmp/test.pkl")
# y_model_predict=std_y.inverse_transform(model.predict(x_test))
# print("保存的模型预测的结果值:","\n",y_model_predict)
# print("保存的模型测试集值:", "\n", std_y.inverse_transform(y_test))
# print("保存的模型预测的均方误差:",mean_squared_error(std_y.inverse_transform(y_test),y_model_predict))
#返回回归系数
print(lr.coef_)
#返回测试集的房子价格
y_lr_predict=std_y.inverse_transform(lr.predict(x_test)).reshape(-1,1)
print("正规方差方法测试集里面每个样本的预测价格:","\n",y_lr_predict)
print("正规方差方法的均方误差:",mean_squared_error(std_y.inverse_transform(y_test),y_lr_predict))
###################################另外两种方法:梯度下降+岭回归######################################################
#梯度下降进行房价预测:
sgd=SGDRegressor()
sgd.fit(x_train,y_train)
#返回回归系数
print(sgd.coef_)
#返回测试集的房子价格
y_sgd_predict=std_y.inverse_transform(sgd.predict(x_test)).reshape(-1,1)
print("梯队下降方法测试集里面每个样本的预测价格:","\n",y_sgd_predict)
print("梯队下降方法的均方误差:",mean_squared_error(std_y.inverse_transform(y_test),y_sgd_predict))
运行结果:
[[-0.11413711 0.11096707 0.01918905 0.08542569 -0.25334716 0.299203
-0.00938707 -0.34724361 0.2817557 -0.21765205 -0.22465765 0.08747592
-0.37792924]]
正规方差方法测试集里面每个样本的预测价格:
[[22.53849853]
[29.00062558]
[18.79068067]
[24.76909439]
[21.74502691]
[42.05384492]
[14.62488826]
[22.27901013]
[ 8.03999614]
[22.08753202]
[35.55423244]
[13.27311623]
[20.97434111]
[18.48178762]
[23.29529333]
[20.62127115]
[28.97082889]
[27.20624081]
[30.65393909]
[27.33898682]
[35.24213487]
[37.57547014]
[23.18585867]
[18.67138531]
[15.38010501]
[23.86296715]
[20.68313167]
[21.29458682]
[31.31214348]
[14.32990772]
[36.471765 ]
[25.58167231]
[35.54589344]
[22.4598955 ]
[22.97410807]
[32.47554828]
[26.92393196]
[27.16072439]
[20.75204619]
[28.84986784]
[17.35799683]
[21.89971983]
[15.63460891]
[30.3375802 ]
[16.12251 ]
[15.13408615]
[16.8930595 ]
[10.44393999]
[23.01463455]
[20.00390941]
[11.7000513 ]
[27.38043959]
[32.34646298]
[28.25315617]
[40.75883138]
[18.22855356]
[14.82967857]
[ 6.05839942]
[23.46767155]
[27.58039097]
[32.80571481]
[35.96751186]
[14.0838879 ]
[22.53371491]
[14.94317651]
[ 9.73335515]
[23.49770749]
[38.65877585]
[20.22541333]
[30.75003031]
[23.39030271]
[16.1238959 ]
[21.24738848]
[15.09591802]
[21.33359271]
[29.34569922]
[20.71677576]
[20.52263902]
[25.84479637]
[26.87490792]
[32.88433335]
[22.78348835]
[21.77849625]
[17.78150986]
[24.16880075]
[37.54653228]
[25.27781771]
[36.88185377]
[19.74565111]
[33.45234613]
[16.01343887]
[43.35659433]
[18.2995695 ]
[15.70242044]
[17.21584006]
[13.75920701]
[13.92050665]
[ 8.48841233]
[28.35985946]
[22.65676337]
[16.1947253 ]
[33.67109147]
[31.33954339]
[24.71682931]
[34.16997382]
[17.88495365]
[16.8103061 ]
[20.12566547]
[24.50542904]
[31.04181644]
[28.97602413]
[21.92914342]
[35.8372772 ]
[18.53750874]
[25.28019983]
[18.6637695 ]
[35.09606245]
[37.23179973]
[20.52034348]
[20.61537811]
[31.81210398]
[22.27571877]
[32.763536 ]
[21.58579898]
[21.62061093]
[16.516685 ]
[24.79706909]]
正规方差方法的均方误差: 22.634707566921392
[-0.09302742 0.07981405 -0.03356067 0.09751295 -0.17064404 0.32505137
-0.01519731 -0.28491467 0.13464271 -0.0709151 -0.2068395 0.09003927
-0.359859 ]
梯队下降方法测试集里面每个样本的预测价格:
[[20.70933846]
[28.32951811]
[19.18403225]
[24.65507657]
[21.41069204]
[42.68892054]
[15.87158184]
[24.01746001]
[ 7.40218788]
[22.08661196]
[35.28374929]
[12.26390055]
[20.77165429]
[18.86491919]
[23.54676714]
[20.93204798]
[28.54647563]
[26.94429484]
[30.65163454]
[27.28445666]
[35.56460104]
[38.81309981]
[22.80577514]
[18.89199356]
[15.71419242]
[24.28879161]
[20.99108013]
[21.45112544]
[31.08568977]
[16.32887568]
[36.2877567 ]
[25.47263777]
[34.25355347]
[23.24934789]
[23.83612763]
[32.25491854]
[26.34721211]
[26.36547892]
[18.87906377]
[28.53860367]
[17.73874594]
[21.51558263]
[16.16065692]
[29.67559375]
[17.10129826]
[14.76720379]
[18.03653142]
[10.90188648]
[22.40679848]
[20.58821583]
[12.20682785]
[27.14742272]
[32.54047537]
[28.16466382]
[40.94901219]
[18.44887246]
[15.42824939]
[ 6.34407779]
[23.89370518]
[27.88563837]
[33.33569386]
[35.64300923]
[14.55584556]
[22.39444913]
[16.62646169]
[ 9.64940355]
[23.26196647]
[37.80070617]
[20.69323021]
[31.35759946]
[22.75622952]
[16.47678797]
[20.91234393]
[14.91754234]
[21.23486455]
[29.01777439]
[21.02363367]
[20.66122902]
[25.3028899 ]
[26.09280528]
[32.88748748]
[22.26522065]
[21.1513717 ]
[17.72611035]
[23.85195404]
[36.36157782]
[25.11699141]
[36.76363235]
[20.05419027]
[32.00830531]
[16.10456404]
[41.78227945]
[17.90181655]
[16.92866355]
[16.99649756]
[14.52275203]
[14.85731941]
[ 8.67921411]
[28.92837524]
[22.30157402]
[16.37136466]
[32.57570185]
[30.37582785]
[24.87063359]
[33.31240275]
[18.32136265]
[17.24645774]
[20.42904067]
[24.01705205]
[30.37883549]
[28.81583325]
[22.51175081]
[35.56975629]
[19.12474897]
[25.34403564]
[18.11252064]
[34.64026627]
[37.34752795]
[20.93017623]
[20.87848205]
[31.57986817]
[22.46880686]
[32.60032053]
[23.01684022]
[21.90150807]
[18.1604845 ]
[24.98164054]]
梯队下降方法的均方误差: 23.10068317269288
(均方误差(Mean Squared Error)MSE) 评价机制:
sklearn回归评估API
sklearn.metrics.mean_squared_error
mean_squared_error(y_true, y_pred)
均方误差回归损失
y_true:真实值
y_pred:预测值
return:浮点数结果
注:真实值,预测值为标准化之前的值
1、LinearRegression与SGDRegressor评估
2、特点:线性回归器是最为简单、易用的回归模型。
从某种程度上限制了使用,尽管如此,在不知道特征之间关系的前提下,我们仍然使用线性回归器作为大多数系统的首要选择。
小规模数据:LinearRegression(不能解决拟合问题)以及其它
大规模数据:SGDRegressor
分析上图1:
经过训练后,知道了天鹅是有翅膀的,天鹅的嘴巴是长长的。简单的认为有这些特征的都是天鹅。因为机器学习到的天鹅特征太少了,导致区分标准太粗糙,不能准确识别出天鹅。
分析上图2:
机器通过这些图片来学习天鹅的特征,经过训练后,知道了天鹅是有翅膀的,天鹅的嘴巴是长长的弯曲的,天鹅的脖子是长长的有点曲度,天鹅的整个体型像一个"2"且略大于鸭子。这时候机器已经基本能区别天鹅和其他动物了。然后,很不巧已有的天鹅图片全是白天鹅的,于是机器经过学习后,会认为天鹅的羽毛都是白的,以后看到羽毛是黑的天鹅就会认为那不是天鹅。
过拟合:一个假设在训练数据上能够获得比其他假设更好的拟合,但是在训练数据外的数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。(模型过于复杂)
欠拟合:一个假设在训练数据上不能获得更好的拟合,但是在训练数据外的数据集上也不能很好地拟合数据,此时认为这个假设出现了欠拟合的现象。(模型过于简单)
欠拟合原因以及解决办法
原因:
学习到数据的特征过少
解决办法:
增加数据的特征数量
过拟合原因以及解决办法
原因:
原始特征过多,存在一些嘈杂特征,
模型过于复杂是因为模型尝试去兼顾
各个测试数据点
解决办法:
进行特征选择,消除关联性大的特征(很难做)
交叉验证(让所有数据都有过训练)
正则化(了解)
作用:可以使得W的每个元素都很小,都接近于0
优点:越小的参数说明模型越简单,越简单的模型则越不
容易产生过拟合现象
sklearn.linear_model.Ridge
sklearn.linear_model.Ridge(alpha=1.0)
具有l2正则化的线性最小二乘法
alpha:正则化力度
coef_:回归系数
观察正则化程度的变化,对结果的影响?
线性回归 LinearRegression与Ridge对比
岭回归:回归得到的回归系数更符合实际,更可靠。另外,能让
估计参数的波动范围变小,变的更稳定。在存在病态数据偏多的研
究中有较大的实用价值。
from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge, LogisticRegression
def mylinear():
"""
线性回归直接预测房子价格(波士顿房价)
:return:None
"""
#获取数据
lb=load_boston()
# print(lb.data)
#划分训练集和测试集
x_train,x_test,y_train,y_test=train_test_split(lb.data,lb.target,test_size=0.25)
#进行标准化处理
#特征值和目标值要分开进行标准化处理,实例化两个标准化API
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.reshape(-1, 1))
y_test=std_y.transform(y_test.reshape(-1, 1))
# estimator预测
#岭回归进行房价预测:
rd=Ridge(alpha=1.0) #取值0~1 1~10
rd.fit(x_train,y_train)
#返回回归系数
print(rd.coef_)
#返回测试集的房子价格
y_rd_predict=std_y.inverse_transform(rd.predict(x_test)).reshape(-1,1)
print("岭回归方法测试集里面每个样本的预测价格:","\n",y_rd_predict)
print("岭回归方法的均方误差:",mean_squared_error(std_y.inverse_transform(y_test),y_rd_predict))