一、欠擬合與過擬合
欠擬合(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(θ) + α∑θ?2
懲罰大參數值,使權重平滑分布
L1正則化(Lasso):
J(θ) = MSE(θ) + α∑|θ?|
可產生稀疏權重矩陣,自動執行特征選擇
二、嶺回歸(Ridge Regression)
概念解析
嶺回歸是線性回歸的L2正則化版本,通過添加權重平方和懲罰項來防止過擬合。
損失函數:
J(θ) = ||Xθ - y||2? + α||θ||2?
其中α控制正則化強度,α=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||2? + α||θ||?
其中||θ||?表示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)=w1?x1?+w2?x2?+....+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? - μ?||2
其中μ?是第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聚類算法。
這些算法構成了傳統機器學習的基礎知識體系,理解它們的原理和適用場景對于構建有效的機器學習模型至關重要。在實際應用中,通常需要根據具體問題和數據特點選擇合適的算法,并通過交叉驗證等方法調優參數。