文章目錄
- 基于機器學習的數值預測
- 機器學習簡介
- 監督學習的任務
- 創建第一個機器學習模型
- 機器學習的目標——泛化
- 過擬合現象
- 評價函數與最優化
- 建模前的數據處理
- 進一步特征變換
- 多元線性回歸模型
- LASSO回歸
- kNN
- 算法原理
- 算法步驟
- k值的選擇
基于機器學習的數值預測
機器學習是人工智能的核心領域,通過算法讓計算機從數據中自動學習規律并完成預測或決策任務。其核心思想是“經驗提升性能”,核心流程包括數據預處理、模型訓練、評估與優化。
監督學習
需使用標注數據(輸入+明確標簽),目標是建立輸入到輸出的映射關系。
- 分類任務:如垃圾郵件識別(標簽:是/否)
- 回歸任務:如房價預測(標簽:連續數值)
常用算法:決策樹、支持向量機(SVM)、神經網絡(如CNN用于圖像分類)
無監督學習
處理無標簽數據,目標是發現數據內在結構或模式。
- 聚類:如客戶分群(K-means算法)
- 降維:如PCA提取數據主成分
- 關聯規則:如購物籃分析(啤酒與尿布的經典案例)
強化學習
智能體通過與環境的動態交互學習策略,以最大化累積獎勵。
- 核心要素:狀態、動作、獎勵、策略
- 典型應用:游戲AI(AlphaGo)、機器人控制
- 算法示例:Q-learning、深度強化學習(DQN、PPO)
三者對比
類型 | 數據類型 | 學習目標 | 典型應用場景 |
---|---|---|---|
監督學習 | 帶標簽數據 | 輸入輸出映射 | 圖像分類、語音識別 |
無監督學習 | 無標簽數據 | 發現數據結構 | 客戶分群、異常檢測 |
強化學習 | 環境交互反饋 | 優化序列決策 | 自動駕駛、游戲AI |
當前機器學習正朝著多模態學習(結合文本、圖像等)、小樣本學習(少數據下訓練)、可解釋性AI等方向發展,在醫療、金融、智能制造等領域持續產生變革性影響。
機器學習簡介
監督學習的任務
監督學習的任務一般有兩種類型:回歸和分類。它們的區別很明顯,依據是目標的類型:
- 回歸:對應著目標是一個數值特征的情形。
- 分類:對應著目標是一個分類特征的情形。
- 二元分類:非黑即白的
- 多元分類:目標的類別多于兩個
- 多標簽分類:多個類別或標簽指派向一個結果
創建第一個機器學習模型
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error# 生成一些示例數據
np.random.seed(0)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 創建線性回歸模型
model = LinearRegression()# 訓練模型
model.fit(X_train, y_train)# 進行預測
y_pred = model.predict(X_test)# 計算均方誤差
mse = mean_squared_error(y_test, y_pred)
print(f"均方誤差: {mse}")# 打印模型參數
print(f"截距: {model.intercept_[0]}")
print(f"斜率: {model.coef_[0][0]}")
機器學習的目標——泛化
預測分析的目的就是預測未知事件。應用機器學習的過程就是找到特征與目標的關系。這也是機器學習的目的。換言之:
所以泛化是什么?泛化就是從數據中學到的算法推廣到樣本之外的點。
如何檢驗模型的泛化能力呢?使用交叉驗證,一般是使用 hold-out \textit{hold-out} hold-out方法,把數據集合分為兩部分:
- 數據集:進行學習的集合,用來訓練模型的部分數據。
- 測試集:評價集合,驗證結果怎么樣?是否符合實際。
過擬合現象
這種情況的發生是因為模型對訓練集適應得太好,甚至開始學習一些訓練集的無效噪聲。
相應的:還有欠擬合,良好的學習和過擬合。
- 欠擬合
- 定義:指模型未能學習到數據中的模式和規律,對訓練數據的擬合程度較差,在訓練集和測試集上的表現都不佳。
- 產生原因
- 模型復雜度不夠:例如使用線性模型去擬合非線性的數據,模型無法捕捉數據中的復雜關系。
- 特征不足:沒有提供足夠的特征讓模型學習,導致模型無法全面了解數據的特性。
- 訓練時間過短:模型還沒有充分學習到數據的特征就停止訓練。
- 解決辦法
- 增加模型復雜度:比如從簡單的線性模型轉換為多項式模型。
- 添加更多特征:挖掘更多與目標變量相關的特征。
- 延長訓練時間:讓模型有更多的時間去學習數據中的規律。
- 良好的學習
- 定義:模型能夠很好地學習到數據中的一般模式,既不會過于簡單而忽略重要信息,也不會過于復雜而學習到噪聲。在訓練集和測試集上都能有較好的表現,泛化能力強。
- 特點
- 誤差平衡:訓練誤差和測試誤差都比較小,且兩者之間的差距不大。
- 泛化能力強:對于未見過的數據,模型也能做出準確的預測。
- 實現途徑
- 選擇合適的模型:根據數據的特點和問題的復雜度,選擇恰當的模型結構。
- 合理調整超參數:通過交叉驗證等方法,找到最優的超參數組合。
- 數據預處理:對數據進行清洗、歸一化等操作,提高數據質量。
- 過擬合
- 定義:模型對訓練數據擬合得過于精確,不僅學習到了數據中的真實模式,還學習到了訓練數據中的噪聲和隨機波動。在訓練集上表現很好,但在測試集上表現不佳,泛化能力差。
- 產生原因
- 模型復雜度太高:模型有過多的參數,能夠完美地擬合訓練數據,但對新數據缺乏適應性。
- 訓練數據量太少:模型容易記住訓練數據中的細節,而無法學習到普遍規律。
- 特征過多:包含了一些與目標變量無關或冗余的特征,導致模型學習到錯誤的信息。
- 解決辦法
- 減少模型復雜度:簡化模型結構,例如減少神經網絡的層數或神經元數量。
- 增加訓練數據:收集更多的數據,讓模型學習到更廣泛的模式。
- 正則化:在損失函數中添加正則化項,限制模型參數的大小,防止模型過擬合。
- 特征選擇:選擇最相關的特征,去除無關或冗余的特征。
直觀理解
可以用一個比喻來理解這三種狀態。假設你要畫一幅貓的畫像,欠擬合就像是只畫出了一個模糊的輪廓,根本看不出是貓;良好的學習是畫出了一只栩栩如生的貓,既抓住了貓的主要特征,又不過于追求細節;過擬合則是在畫像上把貓身上的每一根毛發都畫出來了,雖然在這只特定的貓上畫得很精確,但換一只貓就完全不適用了。
評價函數與最優化
在機器學習中,評價函數(損失函數、代價函數)用于衡量模型預測結果與真實值之間的差異,而最優化則是通過不斷調整模型的參數,使得評價函數的值達到最小(或最大)。
不同的任務類型(如分類、回歸)適用不同的評價函數。
- 回歸任務
- 均方誤差(MSE, Mean Squared Error):計算預測值與真實值之間誤差平方的平均值。公式為 M S E = 1 n ∑ i = 1 n ( y i ? y ^ i ) 2 MSE=\frac{1}{n}\sum_{i = 1}^{n}(y_{i}-\hat{y}_{i})^{2} MSE=n1?∑i=1n?(yi??y^?i?)2,其中 y i y_{i} yi? 是真實值, y ^ i \hat{y}_{i} y^?i? 是預測值, n n n 是樣本數量。MSE 對異常值比較敏感,因為誤差的平方會放大異常值的影響。
- 平均絕對誤差(MAE, Mean Absolute Error):計算預測值與真實值之間誤差絕對值的平均值。公式為 M A E = 1 n ∑ i = 1 n ∣ y i ? y ^ i ∣ MAE=\frac{1}{n}\sum_{i = 1}^{n}|y_{i}-\hat{y}_{i}| MAE=n1?∑i=1n?∣yi??y^?i?∣。MAE 對異常值的魯棒性比 MSE 強。
- 均方根誤差(RMSE, Root Mean Squared Error):RMSE 是 MSE 的平方根,即 R M S E = 1 n ∑ i = 1 n ( y i ? y ^ i ) 2 RMSE=\sqrt{\frac{1}{n}\sum_{i = 1}^{n}(y_{i}-\hat{y}_{i})^{2}} RMSE=n1?∑i=1n?(yi??y^?i?)2?。它的單位與目標變量的單位相同,更直觀地反映了預測誤差的大小。
- 分類任務
- 準確率(Accuracy):分類正確的樣本數占總樣本數的比例。公式為 A c c u r a c y = T P + T N T P + T N + F P + F N Accuracy=\frac{TP + TN}{TP+TN+FP+FN} Accuracy=TP+TN+FP+FNTP+TN?,其中 T P TP TP 是真正例, T N TN TN 是真反例, F P FP FP 是假正例, F N FN FN 是假反例。當樣本類別不平衡時,準確率可能無法很好地反映模型的性能。
- 精確率(Precision):預測為正例的樣本中,實際為正例的比例。公式為 P r e c i s i o n = T P T P + F P Precision=\frac{TP}{TP + FP} Precision=TP+FPTP?。精確率主要關注預測為正例的準確性。
- 召回率(Recall):實際為正例的樣本中,被預測為正例的比例。公式為 R e c a l l = T P T P + F N Recall=\frac{TP}{TP + FN} Recall=TP+FNTP?。召回率主要關注模型對正例的識別能力。
- F1 值:精確率和召回率的調和平均數,公式為 F 1 = 2 × P r e c i s i o n × R e c a l l P r e c i s i o n + R e c a l l F1=\frac{2\times Precision\times Recall}{Precision + Recall} F1=Precision+Recall2×Precision×Recall?。F1 值綜合考慮了精確率和召回率,在兩者之間取得平衡。
- 最優化方法
最優化的目標是找到使評價函數最小化(或最大化)的模型參數。常見的最優化方法有:
- 梯度下降法:通過迭代更新模型參數,沿著評價函數的負梯度方向更新參數,使得評價函數的值逐漸減小。
- 隨機梯度下降法(SGD):每次只使用一個樣本的梯度來更新參數,計算效率高,適用于大規模數據集。
- 批量梯度下降法:使用所有樣本的梯度來更新參數,更新方向更準確,但計算成本高。
評價多個預測模型的好壞
可以按照以下步驟評價多個預測模型的好壞:
- 數據劃分:將數據集劃分為訓練集、驗證集和測試集。訓練集用于模型訓練,驗證集用于調整模型的超參數,測試集用于最終評估模型的性能。
- 模型訓練:使用訓練集對每個模型進行訓練,并通過驗證集調整模型的超參數。
- 模型評估:使用測試集計算每個模型的評價指標(如上述的 MSE、Accuracy 等)。
- 結果比較:比較各個模型的評價指標,選擇在評價指標上表現最優的模型。
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error# 生成一些示例數據
np.random.seed(0)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 線性回歸模型
linear_model = LinearRegression()
linear_model.fit(X_train, y_train)
linear_pred = linear_model.predict(X_test)
linear_mse = mean_squared_error(y_test, linear_pred)# 決策樹回歸模型
tree_model = DecisionTreeRegressor()
tree_model.fit(X_train, y_train)
tree_pred = tree_model.predict(X_test)
tree_mse = mean_squared_error(y_test, tree_pred)# 輸出結果
print(f"線性回歸模型的均方誤差: {linear_mse}")
print(f"決策樹回歸模型的均方誤差: {tree_mse}")if linear_mse < tree_mse:print("線性回歸模型表現更好")
else:print("決策樹回歸模型表現更好")
建模前的數據處理
對于數據處理,我們這里使用scikit-learn
。
進一步特征變換
數據的使用方式不同,模型收到的影響不同,因此不僅要將數據導入模型,提供數據的方式也要是最佳的。例如:對預測變量的偏度進行光滑處理,或變換離群點,這些處理都有益于學習模型。
準備數據有兩種方法:
- 無監督預處理(包括那些在進行計算時不考慮目標的技術)
- 有監督預處理
現在我們創建一個包含特征值的矩陣,從而可以使用標準的機器學習符號,特征值稱為 x x x,目標稱為 y y y。創建這些變量之前應該要對分類變量使用one-hot
編碼格式,理由之一就是scikit-learn
只接收數值。scikit-learn
不能直接提供分類數據。
- 訓練-測試分割
在使用hold-out
交叉驗證方法的時候,一般訓練使用 60 % 60\% 60% ~ 85 85 85 % \% %的數據,其余部分留給測試。常用的數據集分割比是 80 % 80\% 80%。這里可以使用scikit-learn
提供隨機分割的函數:
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.1,random_state=123)
- 使用PCA數據降維
降維是基于大量特征提取少量特征的過程,這些少量特征需要盡量保留原始特征的大部分信息。
最主流的降維分析技術是主成分分析。PCA的核心原理:
目標
找到一組正交的主成分(Principal Components),使得數據在這些主成分上的方差最大,從而用盡可能少的維度保留數據的主要信息。
from sklearn.decomposition imoprt PCA
pca = PCA(n_components = 3,random_state=123)
pca.fit(X_train[['x','y','z']])
princ_comp = pca.transform(X_train['x','y','z'])
我們還可以看出來各個成分捕捉了多少的方差信息:
pca.explained_variance_ratio_.round(3)
現在我們要保留第一主成分:
from sklearn.decomposition imoprt PCA
pca = PCA(n_components = 1,random_state=123)
pca.fit(X_train[['x','y','z']])
X_train['dim_index']=pca.transform(X_train[['x','y','z']]).flatten()
X_train.drop(['x','y','z'],axis=1,inplace=True)
- 對數據進行標準化
由于很多的數據是不一定滿足正態分布的,但是我們在使用這樣的數據投入到機器學習中的時候會造成執行效果很糟糕,所以我們要對數值特征進行標準化。
numerical_features=['carat','depth','table','dim_index']
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fix(X_train[numercial_features])
X_train.loc[:,numerical_features] = scaler.transform(X_train[numercial_features])
多元線性回歸模型
多元線性回歸模型是所有模型之母。
y p r e d = ω 0 + ∑ i = 1 k ω i x i y_{pred}=\omega_0+\sum_{i=1}^{k}\omega_ix_i ypred?=ω0?+i=1∑k?ωi?xi?
我們需要做的只是:
R S S m i n = ∑ i = 1 N ( y i ? y p r e d ) 2 RSS_{min}=\sum_{i=1}^{N}\left(y_i -y_{pred}\right)^2 RSSmin?=i=1∑N?(yi??ypred?)2
現在對模型進行評價:
M S E = 1 N ∑ i = 1 N ( y i ? y p r e a d ) 2 MSE=\frac{1}{N}\sum_{i=1}^{N}\left(y_i-y_{pread}\right)^2 MSE=N1?i=1∑N?(yi??ypread?)2
LASSO回歸
找到下式的最小化權重組合:
1 2 N ∑ i = 1 N ( y i ? y p r e d ) + α ∑ k = 1 P ∣ ω k ∣ , 0 ≤ α \frac{1}{2N}\sum_{i=1}^N \left( y_i-y_{pred}\right)+\alpha \sum_{k=1}^{P}\left|\omega_k\right| ,0 \le \alpha 2N1?i=1∑N?(yi??ypred?)+αk=1∑P?∣ωk?∣,0≤α
總之最后的最后,我們可以得到一個權重,然后里面有幾個是零,就把一些影響比較小的項給自動排除了。
kNN
k k k近鄰 ( k ? N e a r e s t N e i g h b o r s , k N N ) (k-Nearest Neighbors,kNN) (k?NearestNeighbors,kNN)算法是一種基本且常用的監督學習算法,可用于分類和回歸任務。以下是關于kNN算法的詳細介紹:
算法原理
kNN算法的核心思想基于“近朱者赤,近墨者黑”的理念。對于一個待預測的樣本,它會在訓練數據集中找到與該樣本距離最近的k個樣本,然后根據這k個樣本的類別(分類任務)或者數值(回歸任務)來進行預測。
- 分類任務:在分類問題中,通常采用“多數表決”的方式,即這k個最近鄰樣本中哪個類別出現的次數最多,就將待預測樣本歸為該類別。
- 回歸任務:在回歸問題中,會取這k個最近鄰樣本的目標值的平均值作為待預測樣本的預測值。
算法步驟
- 數據準備:收集并整理訓練數據集,包含特征和對應的標簽(分類任務)或目標值(回歸任務)。
- 計算距離:對于待預測樣本,計算它與訓練數據集中每個樣本的距離。
- 選擇k值:確定k的大小,即選擇最近鄰的樣本數量。
- 找到最近鄰:根據計算得到的距離,選擇距離待預測樣本最近的k個樣本。
- 進行預測:
- 分類任務:統計這k個樣本中各個類別的數量,將待預測樣本歸為數量最多的類別。
- 回歸任務:計算這k個樣本目標值的平均值,作為待預測樣本的預測值。
k值的選擇
k值的選擇對kNN算法的性能有重要影響:
- 較小的k值:模型的復雜度較高,對局部數據的敏感度高,容易受到噪聲的影響,可能會導致過擬合。例如,當 k = 1 k = 1 k=1時,模型只根據最近的一個樣本進行預測,可能會因為這個樣本是噪聲點而做出錯誤的預測。
- 較大的k值:模型的復雜度較低,對數據的整體特征更關注,但可能會忽略局部的重要信息,導致欠擬合。例如,當k值接近訓練數據集的大小時,模型會將所有樣本都考慮進來,預測結果會趨近于訓練數據集中的整體分布,無法對新樣本做出準確的預測。
通常可以通過交叉驗證的方法來選擇合適的k值,即嘗試不同的k值,在驗證集上評估模型的性能,選擇性能最優的k值。
下面是一個使用kNN進行分類任務的簡單示例,使用的是鳶尾花數據集:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score# 加載鳶尾花數據集
iris = load_iris()
X = iris.data
y = iris.target# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 創建kNN分類器,這里k值選擇為5
knn = KNeighborsClassifier(n_neighbors=5)# 訓練模型
knn.fit(X_train, y_train)# 進行預測
y_pred = knn.predict(X_test)# 計算準確率
accuracy = accuracy_score(y_test, y_pred)
print(f"模型的準確率: {accuracy}")