7欠拟合与过拟合
1.欠拟合
模型在训练数据上表现不佳,在新的数据上也表现不佳,常发生在模型过于简单无法处理数据中的复杂模式时。
特征:
训练误差较高
测试误差也高
模型过于简化,不能充分学习训练数据中的模式
2.过拟合
模型在训练数据上表现得非常好,在新的数据上表现较差,常发生在模型过于复杂,学习了数据的真实模式、噪声和异常值。
特征:
训练误差非常低
测试误差较高
模型可能过于复杂,对训练数据过度拟合
3.正则化
防止过拟合,增加模型的鲁棒性(健壮性),让模型的泛化能力和推广能力更加强大。
当w越小公式的容错能力就越好,但w太小(趋近0)模型没有意义,w太大会把误差放大。正则项可以保证一定的容错率和正确率。
正则化(鲁棒性调优)本质是牺牲模型在训练集上的正确率来提高推广、泛化能力,w在数值上越小越好,这样能抵抗数值的扰动。
将原来的损失函数加上一个惩罚项使得计算出来的模型W相对小一些来带来泛化能力,就是正则化。
常用的惩罚项有:
$$
L1正则项:L1=||w||_1=\textstyle\sum_{i=1}^{n}|w_i|,曼哈顿距离
$$
$$
L2正则项:L2=||w||_2=\textstyle\sqrt[p]{\sum_{i=1}^{n}x^p_i,X=(x_1,x_2,...x_n)},欧式距离
$$
代表空间中向量到原点的距离。L1和L2正则项惩罚项可以加到任何算法的损失函数上去提高模型的泛化能力。
8岭回归Ridge
1.损失函数公式
岭回归=多元线性回归损失函数+L2正则
$$
J(w) = \frac{1}{2m} \sum_{i=1}^{m} (h_w(x^{(i)}) - y^{(i)})^2+\lambda\sum_{j=1}^{n} w_j^2,w_j指所有的权重系数, λ指惩罚型系数,又叫正则项力度
$$
特点:
不会将权重压缩到0,会把权重缩小(所有的特征都会被保留)
特征见存在多重共线性
模型更为平滑
API
具有L2正则化的线性回归-岭回归。
sklearn.linear_model.Ridge()
1 参数:
(1)alpha, default=1.0,正则项力度
(2)fit_intercept, 是否计算偏置, default=True
(3)solver, {‘auto’, ‘svd’, ‘cholesky’, ‘lsqr’, ‘sparse_cg’, ‘sag’, ‘saga’, ‘lbfgs’}, default=’auto’
当值为auto,并且数据量、特征都比较大时,内部会随机梯度下降法。
(4)normalize:,default=True, 数据进行标准化,如果特征工程中已经做过标准化,这里就该设置为False
(5)max_iterint, default=None,梯度解算器的最大迭代次数,默认为15000
2 属性
coef_ 回归后的权重系数
intercept_ 偏置
说明:SGDRegressor也可以做岭回归的事情,比如SGDRegressor(penalty='l2',loss="squared_loss"),但是其中梯度下降法有些不同。所以推荐使用Ridge实现岭回归
eg1
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Ridge
from sklearn.metrics import mean_squared_error
import math
import random
# 加载数据集
data=fetch_california_housing(data_home="./src")
x=data.data
y=data.target
# 数据标准化
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2)
def train():# 配置一些训练参数eta0=0.001epoch=1000batch_size=16n_sample=len(x_train)#样本数量,假设是20000个model=Ridge()model.fit(x_train,y_train)s=model.score(x_test,y_test)print(s)
train()
9拉索回归Lasso
线性回归模式,拉索回归=+L1正则
目标是最小化损失函数
$$
\text{J(w)}= \frac{1}{2n}\sum_{i=1}^n (h_w(x_i)-y_i)^2 + \lambda \sum_{j=1}^p |w_j|
$$
$$
n 是样本数量, p 是特征的数量, y_i 是第 i个样本的目标值, x_i 是第 i个样本的特征向量, w是模型的参数向量
$$
$$
\lambda是正则化参数,控制正则化项的强度。
$$
特点
拉索回归可以将一些权重压缩到0,可能模型最终只包含一部分特征
适用于特征数量远大于样本数量的情况,或者特征间存在相关性时可以从中选择最相关的特征
模型会更简单(去除了一些不重要的特征)
API
sklearn.linear_model.Lasso()
参数:
1. alpha (float, default=1.0):- 控制正则化强度;必须是非负浮点数。较大的 alpha 增加了正则化强度。
2. fit_intercept (bool, default=True):- 是否计算此模型的截距。如果设置为 False,则不会使用截距(即数据应该已经被居中)。
3. precompute (bool or array-like, default=False):- 如果为 True,则使用预计算的 Gram 矩阵来加速计算。如果为数组,则使用提供的 Gram 矩阵。
4. copy_X (bool, default=True):- 如果为 True,则复制数据 X,否则可能对其进行修改。
5. max_iter (int, default=1000):- 最大迭代次数。
6. tol (float, default=1e-4):- 精度阈值。如果更新后的系数向量减去之前的系数向量的无穷范数除以 1 加上更新后的系数向量的无穷范数小于 tol,则认为收敛。
7. warm_start (bool, default=False):- 当设置为 True 时,再次调用 fit 方法会重新使用之前调用 fit 方法的结果作为初始估计值,而不是清零它们。
8. positive (bool, default=False):- 当设置为 True 时,强制系数为非负。
9. random_state (int, RandomState instance, default=None):- 随机数生成器的状态。用于随机初始化坐标下降算法中的随机选择。
10. selection ({'cyclic', 'random'}, default='cyclic'):- 如果设置为 'random',则随机选择坐标进行更新。如果设置为 'cyclic',则按照循环顺序选择坐标。
属性:
1. coef_- 系数向量或者矩阵,代表了每个特征的权重。
2. intercept_ - 截距项(如果 fit_intercept=True)。
3. n_iter_ - 实际使用的迭代次数。
4. n_features_in_ (int):- 训练样本中特征的数量。
eg2
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Lasso
from sklearn.metrics import mean_squared_error
import math
import random
def data_load():data = fetch_california_housing(data_home="./src")X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2, random_state=42)return X_train, X_test, y_train, y_test
def train(X_train, y_train):model=Lasso(alpha=0.01)model.fit(X_train, y_train)return model
def test(model, X_test, y_test):y_pred=model.predict(X_test)mse=mean_squared_error(y_test, y_pred)rmse=math.sqrt(mse)return rmse
X_train, X_test, y_train, y_test=data_load()
model=train(X_train,y_train)
s=test(model,x_test,y_test)
print(s)
print(model.coef_)
y=model.predict(x_test[0:4])
print(y)
s=model.score(X_test,y_test)
print(s)
十二逻辑回归-分类
1概念
分类模型,常用于处理二分类问题
2原理
逻辑回归的输入是线性回归的输出
①.样本特征值x输入,和线性回归
$$
h(w)=w_1x_1+w_2x_2+....+b
$$
求出的w做计算,得到逻辑回归的输入
②.输入和sigmoid激活函数
$$
f(x)=\frac{1}{1+e^{-x}}
$$
做运算,得到[0,1]区间内的一个概率值
此时的损失函数为:
③.设定一个阈值(一般是0.5),大于阈值认为是正例,输出1;小于阈值认为是负例,输出0
④.将③输出的结果和真实数据的y/结果/目标值作对比判断是否一致,如果不一致则继续调整w去提高1降低0的比例
3API
sklearn.linear_model.LogisticRegression()
参数:fit_intercept bool, default=True 指定是否计算截距max_iter int, default=100 最大迭代次数。迭代达到此数目后,即使未收敛也会停止。
模型对象:.coef_ 权重.intercept_ 偏置predict()预测分类predict_proba()预测分类(对应的概率)score()准确率
eg3
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
x,y=load_iris(return_X_y=True)
index=y!=2
y=y[index]
x=x[index]
x_train,x_test,y_train,y_test=train_test_split(x,y,train_size=0.8)
# print(x.shape)
# print(y!=2)
print(y)
print(x.shape)
model=LogisticRegression()
model.fit(x_train,y_train)
y_pred=model.predict(x_test)
s=sum(y_test==y_pred)
print(s)
# new_x=[[4.3,2.5,7.2,2.5]]
# y_predd=model.predict(x[0:5])
# print(y_predd)