目录
一. 线性回归API初步使用
1.1 步骤分析
1.2 代码过程
二、优化算法
三、案例:波士顿房价预测
3.1 正规方程进行波士顿房价预测
3.2 梯度下降法进行波士顿房价预测
梯度下降法API:
四、 非线性回归
五、欠拟合和过拟合
六、正则化
七、维灾难
八、正则化线性模型
8.1 岭回归(Ridge Regression)
8.2 LASSO回归
8.3 Elastic Net弹性网络
8.4 Early stopping [了解]
8.5 岭回归的应用——波士顿房价预测
波士顿房价预测——Ridge、RidgeCV:
九、模型的保存和加载
- sklearn.linear_model.LinearRegression()
- LinearRegression.coef_ : 返回回归系数
sklearn.linear_model.LinearRegression — scikit-learn 1.1.3 documentationhttps://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html#sklearn.linear_model.LinearRegression
from sklearn.linear_model import LinearRegression
# 获取数据
x= [
[80,86],
[82,80],
[85,78],
[90,90],
[86,82],
[82,90]
]
y=[84.2,80.6,80.1,90,83.2,87.6]
# 1.实例化一个估计器
estimator = LinearRegression()
# 2.调用fit方法
estimator.fit(x,y)
# 3.查看一下系数值
coef = estimator.coef_
print('系数是:\n',coef)
1. 回归当中数据大小不一致,是否会导致结果影响较大,所以要做标准化处理
2. 回归性能评估
均方误差(Mean Squard Error,MSE)
sklearn.metrics.mean_squard_error(y_true,y_pred)
正规方程API:
- sklearn.linear_model.LinearRegression(fit_intercept = True)
- 正规方程优化
- fit_intercept:是否计算偏置
- LinearRegression.coef_ :回归系数
- LinearRegression.intercept_:求偏置是什么
# 正规方程
import pandas as pd
import numpy as np
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 #机器学习
from sklearn.metrics import mean_squared_error #模型评估
def linear_model1():
'''
正规方程
'''
# 1.获取数据
boston=load_boston()
# 2.数据基本处理
# 2.1 数据集划分
x_train,x_test,y_train,y_test = train_test_split(boston.data,boston.target,test_size=0.2)
# 3.特征工程 --标准化(实例化,fit_transform)
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)
# 4.机器学习(线性回归)
estimator = LinearRegression()
estimator.fit(x_train,y_train)
print('模型的偏置是:\n',estimator.intercept_)
# 5.模型评估
# 5.1 预测值和准确率
y_pre = estimator.predict(x_test)
print('预测值似乎:\n',y_pre)
score = estimator.score(x_test,y_test)
print('准确率是:\n',score)
# 5.2 均方误差评估
ret = mean_squared_error(y_test,y_pre)
print('均方误差是:\n',ret)
if __name__='__main__':
linear_model1()
模型的偏置是:
22.590099009901042
预测值似乎:
[16.18423286 9.4826414 29.97223094 20.92230567 20.18119974 28.0550033
39.09520032 34.67667493 9.13493858 10.79386927 24.29023285 25.82819773
20.90636029 12.24051743 11.97957095 20.77288158 15.86035645 24.28428371
...]
准确率是:
0.7619097471422422
均方误差是:
22.87140829473221
梯度下降法API:
- sklearn.linear_model.SGDRegression(loss=‘squard_loss’,fit_intercept=True,learning_rate=‘invscaling’,eta0=0.01)
- SGDRegression 实现了随机梯度下降学习,支持不同的Lasso函数和正则化惩罚项来拟合线性回归模型
- loss:损失类型
- loss=‘squard_loss’:普通最小二乘法
- fit_intercept:是否计算偏置
- learning_rate: string,optional
- 学习率填充
- ‘constant’:eta=eta0 — 常数,后期效果不好
- ‘optimal’:eta=1.0/(alpha*(t+t0))[default] — 默认,随着t的增大eta变小
- ‘invscaling’:eta=eta0/pow(t,power_t)
-POWER_T=0.25:存在父类当中- 对于一个常数值的学习率来说,可以使用learning_rate = ‘constant’,并使用eta0来指定学习率。
- SGDRegressor.coef_:回归系数
- SGDRegressor.intercept_:偏置2.数据基本处理
import pandas as pd
import numpy as np
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 #机器学习(梯度下降法)
from sklearn.metrics import mean_squared_error #模型评估
def linear_model2():
'''
梯度下降法
'''
# 1.获取数据
boston = load_boston
# 2.数据基本处理
# 2.1数据集划分
x_train,x_test,y_train,y_test = train_test_split(boston.data, boston.target, test_size = 0.2)
# 3.特征工程: 实例化+fit_transform方法
transfer = StandardScaler(x_train,x_test)
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)
# 4.机器学习(线性回归)
estimator = SGDRegressor(max_iter=1000,learning_rate = 'optimal') #最大迭代次数1000
estimator.fit(x_train,y_train)
print('这个模型的偏置是:\n',estimator.intercept_)
# 5.模型评估
# 5.1 预测值和准确率
y_pre = estimator.predict(x_test)
print('预测值是:\n',y_pre)
score = estimator.score(x_test,y_test)
print('准确率是:\n',score)
# 5.2均方误差
ret = mean_squared_error(y_test,y_pre)
print('均方误差是:\n',ret)
if __name__ == '__main__':
linear_model2( )
estimator = SGDRegressor ( max_iter=1000, learning_rate=‘constant’, eta0=0.1 )
正则化是结构风险(损失函数+正则化项)最小化策略的体现,是在经验风险(平均损失函数)上加一个正则化项λ f ( ω ) \lambda f(\omega)λf(ω)即参数的一个函数,其中λ \lambdaλ称为正则化参数。正则化的作用就是选择经验风险和模型复杂度同时较小的模型。
正则化的基本思想:限制高次项的系数,进而防止过拟合。
防止过拟合的原理:如果我们令λ 的值很大的话,为了使损失函数尽可能的小,所有的参数ω的值都会在一定程度上减小。
L2正则化
作用:可以使得其中一些w都很小,都接近于0,削弱某个特征的影响
优点:越小的参数说明模型越简单,越简单的模型则越不容易发生过拟合现象
Ridge回归
理解:将高次项前面的系数变得特别小
L1正则化
作用:可以使得其中一些w的值直接为0,删除这个特征的影响。
LASSO回归
理解:将高次项前面的系数变成0
原理:L1正则化和L2正则化都是在目标函数的后面添加一个正则项用来防止过拟合,L1正则项是基于L1范数,添加一个参数的绝对值和参数的积项;L2正则项是基于L2范数,添加一个参数的平方和和参数的积项 区别:
1.使用不同的方法来调整系数的上限:L1正则项将系数设置为0来进行特征选择,以减少相关性较低的特征;L2正则项是对值比较大的系数进行惩罚但并不设置为0,并且还调整参数λ的值,确保系数不会受到严厉的惩罚,不至于欠拟合。
2.鲁棒性:L1对异常点不敏感,L2对异常点有放大效果。
3.稳定性:对于新数据的调整,L1变动很大,L2整体变动不大。 答案解析 数据分析只需要简单知道原理和区别就行,公式推导不需要,面试过程中也不会出现。
随着维度(特征数量)的增加,分类器性能逐步上升,到达某点之后,其性能便逐渐下降。所以以后维度不要设置太多。
我们学习了解决多重共线性的一种方法是对代价函数正则化,其中一种正则化的算法叫岭回归算法(Ridge Regression Algorithm)。下面我们来学习另一种正则化的算法 - Lasso回归算法1(Lasso Regression Algorithm)。
API:
from sklearn.linear_model import Ridge, ElasticNet, Lasso
Early Stopping也是正则化迭代学习的方法之一
其做法是:在验证错误率达到最小值的时候停止训练。通过限制错误率的阈值,进行停止。
岭回归API:
- sklearn.linear_model.Ridge(alpha=1.0, fit_intercept=True, solver='auto', normalize=False)
- alpha:正则化力度,也叫λ,使用默认值即可
- λ取值:0-1 1-10
- solver:会根据数据自动选择优化算法,最多sag梯度下降
- sag:如果数据集、特征都比较大,选择该随机梯度下降法优化
- normalize:数据是否进行标准化
- normalize=True,就可以不用再另外fit调用preprocession.StandardScaler标准化数据
- Ridge.coef_:回归权重
- Ridge.intercept_:回归偏置
Ridge方法相当于随机梯度下降法(SGDRegression(penalty='l2', loss='squared_loss')),只不过SGDRegression实现了一个普通的随机梯度下降学习,推荐使用Ridge(实现了SAG:随机平均梯度下降法)
RidgeCV回归API:
- sklearn.linear_model.RidgeCV(_BaseRidgeCV, RegressorMixin)
- alpha对应的值可以通过网格搜索进行值的传递,默认alpha=(0.1,1.0,10.0),去尝试哪个值更好,这里的alpha就相当于lambda,正则化力度
- 具有L2正则化的线性回归,可以进行交叉验证
- coef_:回归系数
- normalize=True:默认封装了,对数据进行标准化处理,如果之前StandardScaler进行了标准化,就normalize=False
def _BaseRidgeCV(LinearModel):
def __init__(self, alphas=(0.1,1.0,10.0), #alpha就是λ,正则化力度
fit_intercept=True, normallize=False, scoring=None,
cv=None, gcv_mode=None,
store_cv_values=False):
正则化力度越大,权重系数会越小; 正则化力度越小,权重系数会越大。
import pandas as pd
import numpy as np
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, Ridge #机器学习
from sklearn.externals import joblib #模型保存和加载
from sklearn.metrics import mean_squared_error #模型评估
def linear_model3():
'''
线性回归:岭回归
'''
# 1.获取数据
boston = load_boston
# 2.数据基本处理
# 2.1数据集划分
x_train,x_test,y_train,y_test = train_test_split(boston.data, boston.target, test_size = 0.2)
# 3.特征工程: 实例化+fit_transform方法
transfer = StandardScaler(x_train,x_test)
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)
# 4.机器学习(线性回归)
# 4.1 模型训练
#estimator = Ridge(alpha=1)#岭回归
estimator = RidgeCV(alphas=(0.001,0.1,1,10.0,100.0)#RidgeCV,正则系数,自动选择
# 4.2 模型保存
joblib.dump(estimator,'./data/linghuigui.pkl')
estimator.fit(x_train,y_train)
print('这个模型的偏置是:\n',estimator.intercept_)
# 5.模型评估
# 5.1 预测值和准确率
y_pre = estimator.predict(x_test)
print('预测值是:\n',y_pre)
score = estimator.score(x_test,y_test)
print('准确率是:\n',score)
# 5.2均方误差
ret = mean_squared_error(y_test,y_pre)
print('均方误差是:\n',ret)
if __name__ == '__main__':
linear_model3()
通过比较正规方程、梯度下降法、岭回归(Ridge)三者的结果(均方误差大小),发现岭回归比梯度下降法好一些,但是没有正规方程好。但是只要比梯度下降法好就OK,因为岭回归使用了正则化且使用了SAG梯度下降法。所以以后选择随机梯度下降和SAG梯度下降时,优先选择SAG梯度下降。
sklearn模型的保存和加载API
- from sklearn.externals import joblib
- 保存:joblib.dump(eatimator, 'file_name.pkl') #保存哪个训练模型eatimator,保存的名字(后缀是**.pkl)
- 加载:estimator = joblib.load('file_name.pkl'),需要一个变量承接
实例在岭回归的波士顿房价预测案例中。将模型保存之后,注释掉模型训练和保存代码,利用
estimator = joblib.load('./data/test.pkl')#加载模型
进行模型加载,如果没有成功加载输出结果,说明没有成功。如果数据时固定的,那么结果也应该相同。