一、欠拟合与过拟合
欠拟合(Underfitting)
欠拟合是指模型在训练数据上表现不佳,同时在新的未见过的数据上也表现不佳。这通常发生在模型过于简单,无法捕捉数据中的复杂模式时。欠拟合模型的表现特征如下:
- 训练误差较高。
- 测试误差同样较高。
- 模型可能过于简化,不能充分学习训练数据中的模式。
原因:
- 模型过于简单(如用线性模型拟合非线性关系)
- 特征不足
- 正则化过强
解决方案:
- 增加模型复杂度
- 添加更多相关特征
- 减少正则化强度
过拟合(Overfitting)
过拟合是指模型在训练数据上表现得非常好,但在新的未见过的数据上表现较差。这通常发生在模型过于复杂,以至于它不仅学习了数据中的真实模式,还学习了噪声和异常值。过拟合模型的表现特征如下:
-
训练误差非常低。
-
测试误差较高。
-
模型可能过于复杂,以至于它对训练数据进行了过度拟合。
原因:
- 模型过于复杂
- 训练数据不足
- 训练迭代次数过多
解决方案:
- 增加训练数据
- 使用正则化
- 早停(Early stopping)
- 简化模型
正则化(Regularization)
正则化通过在损失函数中添加惩罚项来防止过拟合,同时,增加模型的鲁棒性,鲁棒是Robust 的音译,也就是强壮的意思。就像计算机软件在面临攻击、网络过载等情况下能够不死机不崩溃,这就是软件的鲁棒性,鲁棒性调优就是让模型拥有更好的鲁棒性,也就是让模型的泛化能力和推广能力更加的强大。
比如,下面两个方程描述同一条直线,哪个更好?
y=0.5x1+0.6x2+0.7y=0.5x_1+0.6x_2+0.7y=0.5x1+0.6x2+0.7
y=5x1+6x2+7y=5x_1+6x_2+7y=5x1+6x2+7
第一个更好,因为下面的公式是上面的十倍,当w越小公式的容错的能力就越好。我们都知道人工智能中回归是有误差的,为了把误差降低而拟合出来的一个接近真实的公式,比如把一个测试数据[10,20]带入计算得到的值跟真实值会存在一定的误差,但是第二个方程会把误差放大,公式中y=WTxy = W^Txy=WTx,当xxx有一点错误,这个错误会通过w放大。但是w不能太小,当w太小时(比如都趋近0),模型就没有意义了,无法应用。想要有一定的容错率又要保证正确率就要由正则项来发挥作用了!
所以**正则化(鲁棒性调优)**的本质就是牺牲模型在训练集上的正确率来提高推广、泛化能力,W在数值上越小越好,这样能抵抗数值的扰动。同时为了保证模型的正确率W又不能极小。因此将原来的损失函数加上一个惩罚项使得计算出来的模型W相对小一些,就是正则化。这里面损失函数就是原来固有的损失函数,比如回归的话通常是MSE,然后在加上一部分惩罚项来使得计算出来的模型W相对小一些来带来泛化能力。
L2正则化(Ridge):
J(θ) = MSE(θ) + α∑θᵢ²
惩罚大参数值,使权重平滑分布
L1正则化(Lasso):
J(θ) = MSE(θ) + α∑|θᵢ|
可产生稀疏权重矩阵,自动执行特征选择
二、岭回归(Ridge Regression)
概念解析
岭回归是线性回归的L2正则化版本,通过添加权重平方和惩罚项来防止过拟合。
损失函数:
J(θ) = ||Xθ - y||²₂ + α||θ||²₂
其中α控制正则化强度,α=0时退化为普通线性回归。
特点:
- 岭回归不会将权重压缩到零,这意味着所有特征都会保留在模型中,但它们的权重会被缩小。
- 适用于特征间存在多重共线性的情况。
- 岭回归产生的模型通常更为平滑,因为它对所有特征都有影响。
图解:
椭圆代表的是等高线(同一个圆上的点的损失是一样的),圆形代表的是L2(同一个圆上的w12+w22w1^2+w2^2w12+w22是相等的),观察红色的点,的w12+w22w1^2+w2^2w12+w22和越小,损失越大;观察到绿色的点,相同的损失,w12+w22w1^2+w2^2w12+w22也可以优化(变小),这也是可以使用岭回归,优化模型参数使得w1、w2变小,来增强模型鲁棒性。
API使用
from sklearn.linear_model import Ridgeridge = Ridge(alpha=1.0) # alpha是正则化强度
ridge.fit(X_train, y_train)
y_pred = ridge.predict(X_test)
示例
假设我们有一组房屋数据,预测房价:
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler# 加载数据
boston = load_boston()
X, y = boston.data, boston.target# 分割数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)# 训练岭回归模型
ridge = Ridge(alpha=1.0)
ridge.fit(X_train, y_train)# 评估
print("Train score:", ridge.score(X_train, y_train))
print("Test score:", ridge.score(X_test, y_test))
三、拉索回归(Lasso Regression)
概念解析
拉索回归是线性回归的L1正则化版本,可以产生稀疏模型,自动执行特征选择。
损失函数:
J(θ) = (1/2m)||Xθ - y||²₂ + α||θ||₁
其中||θ||₁表示L1范数(绝对值之和)。
特点:
- 拉索回归可以将一些权重压缩到零,从而实现特征选择。这意味着模型最终可能只包含一部分特征。
- 适用于特征数量远大于样本数量的情况,或者当特征间存在相关性时,可以从中选择最相关的特征。
- 拉索回归产生的模型可能更简单,因为它会去除一些不重要的特征。
图解:
椭圆代表的是等高线(同一个圆上的点的损失是一样的),菱形代表的是L1(同一个菱形上的w1+w2的绝对值是相同的),观察红色的点,w1+w2的绝对值越小,损失越大;观察到绿色的点,相同的损失,w1+w2的绝对值也可以优化(变小),这也是可以使用拉索回归,优化模型参数使得w1、w2变小,来达到增强模型的鲁棒性。
API使用
from sklearn.linear_model import Lassolasso = Lasso(alpha=0.1) # alpha是正则化强度
lasso.fit(X_train, y_train)
y_pred = lasso.predict(X_test)
示例
继续使用波士顿房价数据:
lasso = Lasso(alpha=0.1)
lasso.fit(X_train, y_train)# 查看系数(很多可能为0)
print("Coefficients:", lasso.coef_)# 评估
print("Train score:", lasso.score(X_train, y_train))
print("Test score:", lasso.score(X_test, y_test))
四、逻辑回归(Logistic Regression)
概念与原理
逻辑回归虽然名为"回归",但实际是分类算法,主要用于二分类问题。比如:是好瓜还是坏瓜,健康还是不健康。
核心思想:使用sigmoid函数将线性回归输出映射到(0,1)区间,表示概率。
原理:
逻辑回归的输入是线性回归的输出
线性回归: h(w)=w1x1+w2x2+....+bh(w)=w_1x_1+w_2x_2+....+bh(w)=w1x1+w2x2+....+b
sigmoid激活函数: f(x)=11+e−h(w)f(x)=\frac{1}{1+e^{-h(w)}}f(x)=1+e−h(w)1
决策边界:当 f(x)f(x)f(x) ≥ 0.5时预测1,否则预测0
损失函数(交叉熵损失):
J(θ) = -[y·log(σ(θᵀx)) + (1-y)·log(1-σ(θᵀx))]
API使用
from sklearn.linear_model import LogisticRegressionlog_reg = LogisticRegression()
log_reg.fit(X_train, y_train)
y_pred = log_reg.predict(X_test)
示例
使用鸢尾花数据集进行二分类:
from sklearn.datasets import load_iris# 只取两个类别做二分类
iris = load_iris()
X = iris.data[iris.target != 2]
y = iris.target[iris.target != 2]# 分割数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 训练逻辑回归模型
log_reg = LogisticRegression()
log_reg.fit(X_train, y_train)# 评估
print("Accuracy:", log_reg.score(X_test, y_test))
五、无监督学习之K-means算法
无监督学习概念
无监督学习与监督学习不同,它处理没有标签的数据,目标是发现数据中的隐藏模式或结构。
主要应用:
- 聚类
- 降维
- 异常检测
- 关联规则学习
K-means算法
K-means是最流行的聚类算法之一,将数据划分为K个簇。
算法步骤:
- 随机选择K个中心点(质心)
- 将每个点分配到最近的质心形成簇
- 重新计算每个簇的质心(均值点)
- 重复2-3步直到质心不再变化或达到最大迭代次数
数学表达:
最小化以下目标函数:
J = ∑∑||xⁱ - μⱼ||²
其中μⱼ是第j个簇的质心。
API使用
from sklearn.cluster import KMeanskmeans = KMeans(n_clusters=3)
kmeans.fit(X)
labels = kmeans.labels_
centers = kmeans.cluster_centers_
示例
使用鸢尾花数据进行聚类:
from sklearn.datasets import load_irisiris = load_iris()
X = iris.data# 使用肘部法则确定最佳K值(实际应用中)
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)# 查看结果
print("Cluster labels:", kmeans.labels_)
print("Cluster centers:", kmeans.cluster_centers_)
总结
本文详细介绍了欠拟合与过拟合问题及其解决方案,特别是正则化技术。然后深入讲解了两种正则化线性回归——岭回归和拉索回归,包括它们的数学原理和实际应用。接着介绍了逻辑回归这一重要的分类算法,最后探讨了无监督学习中的K-means聚类算法。
这些算法构成了传统机器学习的基础知识体系,理解它们的原理和适用场景对于构建有效的机器学习模型至关重要。在实际应用中,通常需要根据具体问题和数据特点选择合适的算法,并通过交叉验证等方法调优参数。