在回归任务中不需要归一化的操作,本身就是寻找出权重的过程,不需要将各维度进行统一约束
找出特征和特征权重之间的一种组合,从而来预测对应的结果,误差的存在是必然的,回归的问题不像分类的问题,回归是一个连续值的预测,分类而是离散值的确定,那我们如何处理回归的误差?
回归算法是一个迭代算法。所谓的迭代就好比是系统版本的迭代,迭代后的系统要比迭代前的系统更好。
官方解释:迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。
误差的大小线性回归方程中的系数w是有直系关联的
我们的y和y^分别是我们的真实标签和预测值,也就是说,这个损失函数实在计算我们的真实标 签和预测值之间的距离。因此,我们认为这个损失函数衡量了我们构造的模型的预测结果和真实标签的差异,因此我 们固然希望我们的预测结果和真实值差异越小越好。所以我们的求解目标就可以转化为:
SSE&RSS:
最小二乘法
最后的求导结果就是:
import sklearn.datasets as datasets
boston = datasets.load_boston()
feature = boston['data']
target = boston['target']
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(feature,target,test_size=0.2,random_state=2021)
#导入线性回归算法模型的工具类
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
linner = LinearRegression(normalize=True)
linner.fit(x_train,y_train)
w_array = linner.coef_ #返回每一个维度特征的权重系数
b = linner.intercept_ #截距
linner.score(x_test,y_test) # 0.6352336167833799
LinearRegression中包含一些参数,默认的会拟合截距
这里提及三个评价指标:mse、mae、r2
1、MSE
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
import sklearn.datasets as datasets
from sklearn.metrics import mean_squared_error as MSE
data = datasets.fetch_california_housing(data_home='./datasets') # 加利福尼亚房屋数据
feature = data['data']
target = data['target']
x_train,x_test,y_train,y_test = train_test_split(feature,target,test_size=0.1,random_state=2021)
linner = LinearRegression()
linner.fit(x_train,y_train)
y_pred = linner.predict(x_test)
MSE(y_test,y_pred) # 0.5253224455144776,越小越好
交叉验证
k折交叉
from sklearn.model_selection import cross_val_score
linner = LinearRegression()
cross_val_score(linner,x_train,y_train,cv=5,scoring='neg_mean_squared_error') # array([-0.52365303, -0.54918597, -0.54178747, -0.51412348, -0.5136022 ])
2、MAE
3、r2
红色线是我们的真实标签,而蓝色线是我们模型预测的值。这是一种比较极端,但的确可能发生的情况。这张图像上,前半部分的拟合非常成功,看上去我们的真实标签和我们的预测结果几乎重合,但后半部分的拟合却非常糟糕,模型向着与真实标签完全相反的方向去了。
分母其实可以表示称为样本的潜在规律,分子为模型的误差(损失),那么样本数据潜在的规律是不变的,则误差越小则分子分母表达式返回的结果越小,则r2越接近1.
可以使用三种方式来调用
from sklearn.metrics import r2_score
data = datasets.fetch_california_housing(data_home='./datasets')
feature = data.data
target = data.target
x_train,x_test,y_train,y_test = train_test_split(feature,target,test_size=0.2,random_state=2021)
linner = LinearRegression()
linner.fit(x_train,y_train)
# linner.score(x_test,y_test)
#使用均方误差进行模型评估
y_true = y_test
y_pred = linner.predict(x_test)
r2_score(y_true,y_pred),linner.score(x_test,y_test) # (0.6196263393628889, 0.6196263393628889)
# 交叉验证
linner = LinearRegression()
cross_val_score(linner,x_test,y_test,cv=5,scoring='r2') # array([-8.39672596, 0.61600585, 0.6102257 , 0.64494468, 0.61964029])
欠拟合和过拟合的差别:训练出的模型在训练集有很好的效果,但在测试集并没有很好的效果,是过拟合;训练出的模型在训练集和测试集都没有很好的效果,是欠拟合。
这里拿二次多项式进行举例:
# 示例
from sklearn.linear_model import LinearRegression
import numpy as np
import matplotlib.pyplot as plt
# 样本的训练数据,特征和目标值
x_train = [[6], [8], [10], [14], [18]] #大小
y_train = [[7], [9], [13], [17.5], [18]]#价格
from sklearn.preprocessing import PolynomialFeatures
p = PolynomialFeatures(degree=2,include_bias=False) # degree:控制多项式的度,也就是次数
p2_x_train = p.fit_transform(x_train)
# 用维度增加的数据进行训练模型
linear.fit(p2_x_train,y_train)
y_pred = linear.predict(p2_x_train)
plt.scatter(x_train,y_train)
plt.plot(x_train,y_pred) # 图像如下
将过拟合的曲线的凹凸幅度减少就可以将过拟合曲线趋近于拟合曲线了。那么过拟合曲线的凹凸肯定是由y=wx**2+x**3+x**4中的高次项导致的,那么正则化就可以通过不断的尝试发现高次项的特征然后这些特征的权重w调小到0,则高次项的特征没有了,那么凹凸幅度就减少了,就越趋近于拟合曲线了!
可以使得高次项的w权重减小,趋近于0.
LinnerRegression是没有办法进行正则化的,所以该算法模型容易出现过拟合,并且无法解决。
L2正则化:
API:from sklearn.linear_model import Ridge
Ridge(alpha=1.0):
使用岭回归可以通过控制正则化力度参数alpha降低高次项特征的权重
from sklearn.linear_model import Ridge
import sklearn.datasets as datasets
from sklearn.model_selection import train_test_split
house = datasets.load_boston()
feature = house['data'][:,4:10] # 选取6列模型
target = house['target']
r = Ridge(alpha=1) # alpha数值越大,正则化力度越大
r.fit(feature,target)
r.coef_ # w值:array([-7.27044571, 7.65235494, -0.07212532, -1.05017594, 0.05775603,-0.01653923])