机器学习算法基础——线性回归分析、过拟合和欠拟合
- 回归算法——线性回归分析
- 定义
- 损失函数(误差大小)
- 最小二乘法之正规方程
- 最小二乘法之梯度下降
- sklearn线性回归正规方程、梯度下降API
- 波士顿房价数据案例
- 回归性能评估
- 过拟合和欠拟合
- 过拟合和欠拟合
- 欠拟合原因以及解决办法
- 过拟合原因以及解决办法
- 带有正则化的线性回归-Ridge
- sklearn 模型的保存和加载
回归算法——线性回归分析
定义
线性回归通过一个或者多个自变量与因变量之间进行建模的回归分析。
一元线性回归涉及到的变量只有一个,多元线性回归涉及到的变量有两个及两个以上。
通用公式:
损失函数(误差大小)
●为第个训练样本的真实值
●为第个训练样本特征值组合预测函数
总损失定义:
使得总损失最小的方法称为最小二乘法。
最小二乘法之正规方程
(1)通过方程求解得出:
X为特征值矩阵,Y为目标值矩阵
(2)缺点:当特征过于复杂,求解速度太慢;对于复杂的算法,不能使用正规方程求解。
最小二乘法之梯度下降
为学习速率,需要手动指定,表示方向。理解:沿着这个函数下降的方向找,最后就能找到山谷的最低点,然后更新值,适用于训练数据规模十分庞大的任务。
sklearn线性回归正规方程、梯度下降API
sklearn.linear_model.LinearRegression——正规方程
sklearn.linear_model.SGDRegressor——梯度下降
●sklearn.linear_model.LinearRegression()
普通最小二乘线性回归
coef_:回归系数
●sklearn.linear_model.SGDRegressor( )
通过使用SGD最小化线性模型
coef_:回归系数
波士顿房价数据案例
【波士顿房价数据案例分析流程】
1、波士顿地区房价数据获取
2、波士顿地区房价数据分割
3、训练与测试数据标准化处理
4、使用最简单的线性回归模型LinearRegression和梯度下降估计SGDRegressor对房价进行预测
【案例实现】
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression,SGDRegressor,Ridge
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
def mylinear():
#线性回归预测房子价格
#获取数据
lb = load_boston()
#分割数据集到训练集和测试集
x_train,x_test,y_train,y_test = train_test_split(lb.data,lb.target,test_size =0.25)
print(y_train)
#进行标准化处理,目标值和特征值都必须进行标准化处理,实例化两个标准化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)
print(lr.coef_) #打印出系数
#预测测试集的房子价格
y_lr_predict = std_y.inverse_transform(lr.predict(x_test))
print('测试集里面每个房子的预测价格:',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))
print('测试集里面每个房子的预测价格:',y_sgd_predict)
print('梯度下降的均方误差:',mean_squared_error(std_y.inverse_transform(y_test),y_sgd_predict))
#岭回归进行房价预测
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))
print('测试集里面每个房子的预测价格:',y_rd_predict)
print('岭回归的均方误差:',mean_squared_error(std_y.inverse_transform(y_test),y_rd_predict))
return None
if __name__ == '__main__':
mylinear()
回归性能评估
(1)均方误差:(Mean Squared Error MSE)评价机制:
(2)sklearn回归评估API
类:sklearn.metrics.mean_squared_error
mean_squared_error(y_true, y_pred)
均方误差回归损失
y_true:真实值
y_pred:预测值
return:浮点数结果
【总结】LinearRegression与SGDRegressor评估
特点:线性回归器是最为简单、易用的回归模型。从某种程度上限制了使用,尽管如此,在不知道特征之间关系的前提下,我们仍然使用线性回归器作为大多数系统的首要选择。
小规模数据:LinearRegression(不能解决拟合问题)
大规模数据:SGDRegressor
过拟合和欠拟合
过拟合和欠拟合
过拟合:一个假设在训练数据上能够获得比其他假设更好的拟合, 但是在训练数据外的数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。(模型过于复杂)
欠拟合:一个假设在训练数据上不能获得更好的拟合, 但是在训练数据外的数据集上也不能很好地拟合数据,此时认为这个假设出现了欠拟合的现象。(模型过于简单)
数据特征和目标值之间的关系不仅仅是线性关系会导致模型复杂。
欠拟合原因以及解决办法
原因:学习到数据的特征过少
解决办法:增加数据的特征数量
过拟合原因以及解决办法
原因:
(1)原始特征过多,存在一些嘈杂特征,
(2)模型过于复杂是因为模型尝试去兼顾各个测试数据点。
解决办法:
(1)进行特征选择,消除关联性大的特征(很难做)
(2)交叉验证(让所有数据都有过训练)
(3)正则化(了解)
交叉验证:
(1)训练集和测试集表现都不好属于欠拟合
(2)训练集表现良好,测试集表现较差为过拟合
,需要尽量减少高次项特征的影响可以解决过拟合现象。
带有正则化的线性回归-Ridge
(1)L2正则化
作用:可以使得 的每个元素都很小,都接近于0
优点:越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象。
(2)带有正则化的线性回归-Ridge
类:sklearn.linear_model.Ridge
sklearn.linear_model.Ridge(alpha=1.0)
具有l2正则化的线性最小二乘法
alpha:正则化力度
coef_:回归系数正则化程度对结果的影响
可以看出,正则化程度越高,变量权重越小,越趋近于0。
【线性回归 LinearRegression与Ridge对比】
岭回归:回归得到的回归系数更符合实际,更可靠。另外,能让估计参数的波动范围变小,变的更稳定。在存在病态数据偏多的研究中有较大的实用价值。
sklearn 模型的保存和加载
类:from sklearn.externals import joblib
保存:joblib.dump(rf,‘test.pkl’)
加载:estimators = joblib.load(‘test.pkl’)
注:文件格式 kpl
#保存:保存的是经过训练集后已经得出某些参数的模型
#保存训练模型
joblib.dump(lr,'./joblib/test.pkl')
#使用:在数据集准备(分割、特征抽取)好之后就可以使用
#预测房价结果
model = joblib.load('./joblib/test.pkl')
y_predict = std_y.inverse_transform(model.predict(x_test))
print('保存的模型预测的结果:',y_predict)