超強(qiáng)!必會(huì)的十大機(jī)器學(xué)習(xí)算法
1.線性回歸
線性回歸是用于預(yù)測(cè)建模的最簡(jiǎn)單且使用最廣泛的機(jī)器學(xué)習(xí)算法之一。
它是一種監(jiān)督學(xué)習(xí)算法,用于根據(jù)一個(gè)或多個(gè)自變量預(yù)測(cè)因變量的值。
定義
線性回歸的核心是根據(jù)觀察到的數(shù)據(jù)擬合線性模型。
線性模型由以下方程表示:
其中
- 是因變量(我們想要預(yù)測(cè)的變量)
- 是自變量(我們用來進(jìn)行預(yù)測(cè)的變量)
- 是直線的斜率
- 是 y 軸截距(直線與 y 軸的交點(diǎn))
線性回歸算法涉及找到通過數(shù)據(jù)點(diǎn)的最佳擬合線。這通常是通過最小化觀測(cè)值和預(yù)測(cè)值之間的平方差之和來完成的。
評(píng)估指標(biāo)
- 均方誤差 (MSE):測(cè)量誤差平方的平均值。值越低越好。
- R平方:表示可以根據(jù)自變量預(yù)測(cè)的因變量變異的百分比。越接近 1 越好。
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# Load the Diabetes dataset
diabetes = load_diabetes()
X, y = diabetes.data, diabetes.target
# Splitting the dataset into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Creating and training the Linear Regression model
model = LinearRegression()
model.fit(X_train, y_train)
# Predicting the test set results
y_pred = model.predict(X_test)
# Evaluating the model
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("MSE is:", mse)
print("R2 score is:", r2)
2.邏輯回歸
邏輯回歸用于分類問題。它預(yù)測(cè)給定數(shù)據(jù)點(diǎn)屬于某個(gè)類別的概率,例如是/否或 0/1。
評(píng)估指標(biāo)
- 準(zhǔn)確度:準(zhǔn)確度是正確預(yù)測(cè)的觀測(cè)值與總觀測(cè)值的比率。
- 精確度和召回率:精確度是正確預(yù)測(cè)的正觀察值與所有預(yù)期的正觀察值的比率。召回率是正確預(yù)測(cè)的積極觀察與實(shí)際中所有觀察的比例。
- F1 分?jǐn)?shù):召回率和精確率之間的平衡。
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
# Load the Breast Cancer dataset
breast_cancer = load_breast_cancer()
X, y = breast_cancer.data, breast_cancer.target
# Splitting the dataset into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Creating and training the Logistic Regression model
model = LogisticRegression(max_iter=10000)
model.fit(X_train, y_train)
# Predicting the test set results
y_pred = model.predict(X_test)
# Evaluating the model
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
# Print the results
print("Accuracy:", accuracy)
print("Precision:", precision)
print("Recall:", recall)
print("F1 Score:", f1)
3.決策樹
決策樹是多功能且強(qiáng)大的機(jī)器學(xué)習(xí)算法,可用于分類和回歸任務(wù)。
它們因其簡(jiǎn)單性、可解釋性以及處理數(shù)值和分類數(shù)據(jù)的能力而廣受歡迎。
定義
決策樹由代表決策點(diǎn)的節(jié)點(diǎn)、代表可能結(jié)果的分支以及代表最終決策或預(yù)測(cè)的葉子組成。
決策樹中的每個(gè)節(jié)點(diǎn)對(duì)應(yīng)一個(gè)特征,分支代表該特征的可能值。
構(gòu)建決策樹的算法涉及根據(jù)不同特征的值遞歸地將數(shù)據(jù)集分割成子集。目標(biāo)是創(chuàng)建同質(zhì)子集,其中目標(biāo)變量(我們想要預(yù)測(cè)的變量)在每個(gè)子集中都是相似的。
分裂過程持續(xù)進(jìn)行,直到滿足停止標(biāo)準(zhǔn),例如達(dá)到最大深度、最小樣本數(shù),或者無法進(jìn)行進(jìn)一步改進(jìn)。
評(píng)估指標(biāo)
- 對(duì)于分類:準(zhǔn)確率、精確率、召回率和 F1 分?jǐn)?shù)
- 對(duì)于回歸:均方誤差 (MSE)、R 平方
from sklearn.datasets import load_wine
from sklearn.tree import DecisionTreeClassifier
# Load the Wine dataset
wine = load_wine()
X, y = wine.data, wine.target
# Splitting the dataset into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Creating and training the Decision Tree model
model = DecisionTreeClassifier(random_state=42)
model.fit(X_train, y_train)
# Predicting the test set results
y_pred = model.predict(X_test)
# Evaluating the model
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, average='macro')
recall = recall_score(y_test, y_pred, average='macro')
f1 = f1_score(y_test, y_pred, average='macro')
# Print the results
print("Accuracy:", accuracy)
print("Precision:", precision)
print("Recall:", recall)
print("F1 Score:", f1)
4.樸素貝葉斯
樸素貝葉斯分類器是一系列簡(jiǎn)單的 “概率分類器”,它們使用貝葉斯定理和特征之間的強(qiáng)(樸素)獨(dú)立性假設(shè)。它特別用于文本分類。
它計(jì)算給定每個(gè)輸入值的每個(gè)類別的概率和每個(gè)類別的條件概率。然后使用這些概率根據(jù)最高概率對(duì)新值進(jìn)行分類。
評(píng)估指標(biāo):
- 準(zhǔn)確性:衡量模型的整體正確性。
- 精確率、召回率和 F1 分?jǐn)?shù):在類別分布不平衡的情況下尤其重要。
from sklearn.datasets import load_digits
from sklearn.naive_bayes import GaussianNB
# Load the Digits dataset
digits = load_digits()
X, y = digits.data, digits.target
# Splitting the dataset into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Creating and training the Naive Bayes model
model = GaussianNB()
model.fit(X_train, y_train)
# Predicting the test set results
y_pred = model.predict(X_test)
# Evaluating the model
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, average='macro')
recall = recall_score(y_test, y_pred, average='macro')
f1 = f1_score(y_test, y_pred, average='macro')
# Print the results
print("Accuracy:", accuracy)
print("Precision:", precision)
print("Recall:", recall)
print("F1 Score:", f1)
5.K-最近鄰(KNN)
K 最近鄰 (KNN) 是一種簡(jiǎn)單直觀的機(jī)器學(xué)習(xí)算法,用于分類和回歸任務(wù)。
它根據(jù)輸入數(shù)據(jù)點(diǎn)與其在特征空間中最近鄰居的相似性進(jìn)行預(yù)測(cè)。
在 KNN 中,新數(shù)據(jù)點(diǎn)的預(yù)測(cè)由其 k 個(gè)最近鄰的多數(shù)類(用于分類)或平均值(用于回歸)確定。KNN 中的 “k” 表示要考慮的鄰居數(shù)量,這是用戶選擇的超參數(shù)。
算法
KNN 算法包括以下步驟
- 計(jì)算距離:計(jì)算新數(shù)據(jù)點(diǎn)與數(shù)據(jù)集中所有其他數(shù)據(jù)點(diǎn)之間的距離。
- 查找鄰居:根據(jù)計(jì)算的距離選擇 k 個(gè)最近鄰居。
- 多數(shù)投票或平均:對(duì)于分類,分配 k 個(gè)鄰居中出現(xiàn)最頻繁的類標(biāo)簽。對(duì)于回歸,計(jì)算 k 個(gè)鄰居的目標(biāo)變量的平均值。
- 進(jìn)行預(yù)測(cè):將預(yù)測(cè)的類標(biāo)簽或值分配給新數(shù)據(jù)點(diǎn)。
評(píng)估指標(biāo)
- 「分類」:準(zhǔn)確率、精確率、召回率、F1 分?jǐn)?shù)。
- 「回歸」:均方誤差 (MSE)、R 平方。
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
# Load the Wine dataset
wine = load_wine()
X, y = wine.data, wine.target
# Splitting the dataset into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Creating and training the KNN model
knn_model = KNeighborsClassifier(n_neighbors=3)
knn_model.fit(X_train, y_train)
# Predicting the test set results
y_pred_knn = knn_model.predict(X_test)
# Evaluating the model
accuracy_knn = accuracy_score(y_test, y_pred_knn)
precision_knn = precision_score(y_test, y_pred_knn, average='macro')
recall_knn = recall_score(y_test, y_pred_knn, average='macro')
f1_knn = f1_score(y_test, y_pred_knn, average='macro')
# Print the results
print("Accuracy:", accuracy_knn)
print("Precision:", precision_knn)
print("Recall:", recall_knn)
print("F1 Score:", f1_knn)
6.SVM
支持向量機(jī) (SVM) 是一種強(qiáng)大的監(jiān)督學(xué)習(xí)算法,用于分類和回歸任務(wù)。
它們?cè)诟呔S空間中特別有效,廣泛應(yīng)用于圖像分類、文本分類和生物信息學(xué)等各個(gè)領(lǐng)域。
算法原理
支持向量機(jī)的工作原理是找到最能將數(shù)據(jù)分為不同類別的超平面。
選擇超平面以最大化邊距,即超平面與每個(gè)類的最近數(shù)據(jù)點(diǎn)(支持向量)之間的距離。
SVM 還可以通過使用核函數(shù)將輸入空間轉(zhuǎn)換為可以線性分離的高維空間來處理非線性數(shù)據(jù)。
訓(xùn)練 SVM 的算法包括以下步驟:
- 數(shù)據(jù)準(zhǔn)備:預(yù)處理數(shù)據(jù)并根據(jù)需要對(duì)分類變量進(jìn)行編碼。
- 選擇核:選擇合適的核函數(shù),例如線性、多項(xiàng)式或徑向基函數(shù) (RBF)。
- 模型訓(xùn)練:通過尋找使類之間的間隔最大化的超平面來訓(xùn)練 SVM。
- 模型評(píng)估:使用交叉驗(yàn)證或保留驗(yàn)證集評(píng)估 SVM 的性能。
評(píng)估指標(biāo)
- 「分類」:準(zhǔn)確率、精確率、召回率、F1 分?jǐn)?shù)。
- 「回歸」:均方誤差 (MSE)、R 平方。
from sklearn.svm import SVC
breast_cancer = load_breast_cancer()
X, y = breast_cancer.data, breast_cancer.target
# Splitting the dataset into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Creating and training the SVM model
svm_model = SVC()
svm_model.fit(X_train, y_train)
# Predicting the test set results
y_pred_svm = svm_model.predict(X_test)
# Evaluating the model
accuracy_svm = accuracy_score(y_test, y_pred_svm)
precision_svm = precision_score(y_test, y_pred_svm, average='macro')
recall_svm = recall_score(y_test, y_pred_svm, average='macro')
f1_svm = f1_score(y_test, y_pred_svm, average='macro')
accuracy_svm, precision_svm, recall_svm, f1_svm
# Print the results
print("Accuracy:", accuracy_svm)
print("Precision:", precision_svm)
print("Recall:", recall_svm)
print("F1 Score:", f1_svm)
7.隨機(jī)森林
隨機(jī)森林是一種集成學(xué)習(xí)技術(shù),它結(jié)合了多個(gè)決策樹來提高預(yù)測(cè)性能并減少過度擬合。
它們廣泛用于分類和回歸任務(wù),并以其魯棒性和多功能性而聞名。
算法步驟
隨機(jī)森林是根據(jù)數(shù)據(jù)集的隨機(jī)子集并使用特征的隨機(jī)子集進(jìn)行訓(xùn)練的決策樹的集合。
森林中的每棵決策樹獨(dú)立地進(jìn)行預(yù)測(cè),最終的預(yù)測(cè)是通過聚合所有樹的預(yù)測(cè)來確定的。
構(gòu)建隨機(jī)森林的算法包括以下步驟
- 隨機(jī)采樣:從數(shù)據(jù)集中隨機(jī)選擇樣本子集(帶替換)來訓(xùn)練每棵樹。
- 特征隨機(jī)化:隨機(jī)選擇每個(gè)節(jié)點(diǎn)的特征子集以考慮分割。
- 樹構(gòu)建:使用采樣數(shù)據(jù)和特征構(gòu)建多個(gè)決策樹。
- 投票或平均:聚合所有樹的預(yù)測(cè)以做出最終預(yù)測(cè)。
評(píng)估指標(biāo)
- 分類:準(zhǔn)確率、精確率、召回率、F1 分?jǐn)?shù)。
- 回歸:均方誤差 (MSE)、R 平方。
from sklearn.ensemble import RandomForestClassifier
breast_cancer = load_breast_cancer()
X, y = breast_cancer.data, breast_cancer.target
# Splitting the dataset into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Creating and training the Random Forest model
rf_model = RandomForestClassifier(random_state=42)
rf_model.fit(X_train, y_train)
# Predicting the test set results
y_pred_rf = rf_model.predict(X_test)
# Evaluating the model
accuracy_rf = accuracy_score(y_test, y_pred_rf)
precision_rf = precision_score(y_test, y_pred_rf, average='macro')
recall_rf = recall_score(y_test, y_pred_rf, average='macro')
f1_rf = f1_score(y_test, y_pred_rf, average='macro')
# Print the results
print("Accuracy:", accuracy)
print("Precision:", precision)
print("Recall:", recall)
print("F1 Score:", f1)
8.K-均值聚類
K 均值聚類是一種無監(jiān)督學(xué)習(xí)算法,用于將數(shù)據(jù)分組為 “K” 個(gè)聚類。確定 k 個(gè)質(zhì)心后,每個(gè)數(shù)據(jù)點(diǎn)被分配到最近的簇。
該算法將數(shù)據(jù)點(diǎn)分配給一個(gè)簇,使得數(shù)據(jù)點(diǎn)與簇質(zhì)心之間的平方距離之和最小。
評(píng)估指標(biāo)
- 「慣性」:樣本到最近聚類中心的總平方距離稱為慣性。值越低越好。
- 「Silhouette Score」:表示一個(gè)項(xiàng)目屬于其自身集群的緊密程度。高輪廓分?jǐn)?shù)意味著該項(xiàng)目與其自身的集群匹配良好,而與附近的集群匹配不佳。輪廓得分從 -1 到 1。
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
# Load the Iris dataset
iris = load_iris()
X = iris.data
# Applying K-Means Clustering
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(X)
# Predicting the cluster for each data point
y_pred_clusters = kmeans.predict(X)
# Evaluating the model
inertia = kmeans.inertia_
silhouette = silhouette_score(X, y_pred_clusters)
print("Inertia:", inertia)
print("Silhouette:", silhouette)
9.PCA
降維是通過使用主成分分析 (PCA) 來完成的。它將數(shù)據(jù)轉(zhuǎn)換為新的坐標(biāo)系,減少變量數(shù)量,同時(shí)盡可能多地保留原始數(shù)據(jù)的變化。
使用 PCA 可以找到使數(shù)據(jù)方差最大化的主要成分或軸。第一個(gè)主成分捕獲最大方差,第二個(gè)主成分(與第一個(gè)主成分正交)捕獲第二大方差,依此類推。
評(píng)估指標(biāo)
- 「解釋方差」:表示每個(gè)主成分捕獲的數(shù)據(jù)方差有多少。
- 「總解釋方差」:由所選主成分解釋的累積方差。
from sklearn.datasets import load_breast_cancer
from sklearn.decomposition import PCA
import numpy as np
# Load the Breast Cancer dataset
breast_cancer = load_breast_cancer()
X = breast_cancer.data
# Applying PCA
pca = PCA(n_compnotallow=2) # Reducing to 2 dimensions for simplicity
pca.fit(X)
# Transforming the data
X_pca = pca.transform(X)
# Explained Variance
explained_variance = pca.explained_variance_ratio_
# Total Explained Variance
total_explained_variance = np.sum(explained_variance)
print("Explained variance:", explained_variance)
print("Total Explained Variance:", total_explained_variance)
10.梯度提升算法
梯度提升是一種先進(jìn)的機(jī)器學(xué)習(xí)技術(shù)。它依次構(gòu)建多個(gè)弱預(yù)測(cè)模型(通常是決策樹)。每個(gè)新模型都逐漸最小化整個(gè)模型的損失函數(shù)(誤差)。
評(píng)估指標(biāo)
- 「對(duì)于分類」:準(zhǔn)確率、精確率、召回率、F1 分?jǐn)?shù)。
- 「對(duì)于回歸」:均方誤差 (MSE)、R 平方。
from sklearn.datasets import load_diabetes
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import mean_squared_error, r2_score
# Load the Diabetes dataset
diabetes = load_diabetes()
X, y = diabetes.data, diabetes.target
# Splitting the dataset into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Creating and training the Gradient Boosting model
gb_model = GradientBoostingRegressor(random_state=42)
gb_model.fit(X_train, y_train)
# Predicting the test set results
y_pred_gb = gb_model.predict(X_test)
# Evaluating the model
mse_gb = mean_squared_error(y_test, y_pred_gb)
r2_gb = r2_score(y_test, y_pred_gb)
print("MSE:", mse_gb)