深圳做網站的公司搜行者seo如何制作微信小程序店鋪
文章目錄
- 一、集成算法
- 1.1 概念
- 1.2 常用集成算法
- 1.2.1 Bagging
- 1.2.2 Boosting
- 1.2.2.1 AdaBoost
- 1.2.2.2 GBDT
- 1.2.2.3 XgBoost
- 1.2.3 Stacking
- 二、聚類算法
- 2.1 概念
- 2.2 常用聚類算法
- 2.2.1 K-means
- 2.2.2 層次聚類
- 2.2.3 DBSCAN算法
- 2.2.4 AP聚類算法
- 2.2.5 高斯混合模型聚類算法
一、集成算法
1.1 概念
集成算法是一種通過組合多個基本模型來提高預測準確度的機器學習技術。這些基本模型可以是同一模型的不同實例,也可以是不同類型的算法。
集成算法的基本思想是將多個模型的預測結果結合起來,以獲得更加準確的預測結果。
常見的集成算法包括:Bagging、Boosting、Stacking等。
- Bagging:并行訓練多個弱分類器
- Boosting:迭代生成多個弱分類器
Boosting算法:
Bagging算法:
Stacking算法:
現(xiàn)在我們逐一介紹幾種常見的集成算法。
1.2 常用集成算法
1.2.1 Bagging
Bagging集成算法也稱為自舉聚合(Bootstrap Aggregating)。
在此算法中,每個基本模型都是基于不同數據子集進行訓練的。每次訓練時,從總訓練數據中隨機抽取一定比例的數據樣本,作為當前模型的訓練集。
這樣做的好處是可以從不同角度進行訓練,減少模型的過擬合風險。
對于多個模型預測出的多個結果,Bagging算法對回歸任務進行平均或加權平均,對分類任務進行投票,最后得出結果。
流程就是:
接下來用python實現(xiàn)各流程。
①、②:
import pandas as pd
# 根據數量進行循環(huán)
for i in range(num_estimators):# 隨機選擇數據sample = data.sample(frac=sample_ratio, replace=True)# 獲取特征和結果features = sample.drop(target_variable, axis=1)target = sample[target_variable]
③:
# 使用隨機森林作為基本模型
from sklearn.ensemble import RandomForestClassifiermodel = RandomForestClassifier()
model.fit(features, target)
④:
# 將預測結果添加到predictions DataFrame中
prediction = model.predict(data.drop(target_variable, axis=1))
predictions[i] = prediction
⑤:
# 對每個樣本的預測結果進行投票,選擇最常見的類別作為最終預測結果
final_predictions = predictions.mode(axis=1)[0]
完整代碼:
import pandas as pd from sklearn.ensemble import RandomForestClassifierdef bagging_ensemble(data, target_variable, num_estimators, sample_ratio):# 用于存儲基本模型的預測結果predictions = pd.DataFrame()# 根據數量進行循環(huán)for i in range(num_estimators):# 隨機選擇數據sample = data.sample(frac=sample_ratio, replace=True)# 獲取特征和結果features = sample.drop(target_variable, axis=1)target = sample[target_variable]# 使用隨機森林作為基本模型model = RandomForestClassifier()model.fit(features, target)# 將預測結果添加到predictions DataFrame中prediction = model.predict(data.drop(target_variable, axis=1))predictions[i] = prediction# 對每個樣本的預測結果進行投票,選擇最常見的類別作為最終預測結果final_predictions = predictions.mode(axis=1)[0]return final_predictions
# 讀取數據 data = pd.read_csv('data.csv')# 調用方法進行集成學習 target_variable = 'result' num_estimators = 10 sample_ratio = 0.8 predictions = bagging_ensemble(data, target_variable, num_estimators, sample_ratio)# 打印預測結果 print(predictions)
1.2.2 Boosting
Boosting算法的核心思想是通過迭代的方式,每次迭代都調整樣本的權重或分布,使得在下一次迭代中,分類器能夠更關注被錯誤分類的樣本,從而提高整體分類準確性。
1.2.2.1 AdaBoost
算法步驟如下:
接下來我們嘗試使用sklearn庫實現(xiàn)AdaBoost。
使用AdaBoost算法需要以下步驟:
- 導入所需的庫和數據集:
import numpy as np
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_scoredata = pd.read_csv("data.csv")
X = data.iloc[:, :-1]
y = data.iloc[:, -1]X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
- 創(chuàng)建AdaBoost分類器:
ada_clf = AdaBoostClassifier(DecisionTreeClassifier(max_depth=1),n_estimators=200,algorithm="SAMME.R",learning_rate=0.5,random_state=42
)
- 使用訓練數據擬合分類器:
ada_clf.fit(X_train, y_train)
- 使用分類器進行預測:
y_pred = ada_clf.predict(X_test)
- 計算準確率:
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
其中,DecisionTreeClassifier(max_depth=1)
表示基礎分類器,n_estimators
表示基礎分類器的數量,algorithm
表示使用的算法,learning_rate
表示學習率。最后,通過計算準確率來評估模型的性能。
完整代碼:
# 導入所需的庫和數據集 import numpy as np import pandas as pd from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import AdaBoostClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_scoredata = pd.read_csv("data.csv") X = data.iloc[:, :-1] y = data.iloc[:, -1]X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 創(chuàng)建AdaBoost分類器 ada_clf = AdaBoostClassifier(DecisionTreeClassifier(max_depth=1),n_estimators=200,algorithm="SAMME.R",learning_rate=0.5,random_state=42 )# 使用訓練數據擬合分類器 ada_clf.fit(X_train, y_train)# 使用分類器進行預測 y_pred = ada_clf.predict(X_test)# 計算準確率 accuracy = accuracy_score(y_test, y_pred) print("Accuracy:", accuracy)
1.2.2.2 GBDT
GBDT(Gradient Boosting Decision Tree)也是一種基于決策樹的機器學習算法。GBDT算法通過迭代訓練多個弱分類器,使用梯度下降來優(yōu)化損失函數,最終得到一個強分類器。
GBDT算法的核心思想是在模型訓練的過程中不斷迭代地學習錯誤,每一次迭代都會訓練一個新的決策樹模型,該模型的目的是使得前面所有模型預測錯誤的樣本得到更好的預測結果。因此,GBDT算法可以有效地處理非線性問題和高維數據集,適用于分類和回歸任務。
GBDT算法的優(yōu)點包括:
-
高精度:GBDT算法在大規(guī)模數據、非線性問題和高維數據集上的表現(xiàn)非常出色,可以取得很高的精度。
-
魯棒性:GBDT算法具有很強的魯棒性,在數據缺失、異常值等情況下能夠保持較好的性能。
-
特征選擇:GBDT算法可以選擇對預測效果最佳的特征,提高模型的泛化能力。
-
可解釋性:由于GBDT算法采用決策樹模型,因此可以輸出變量的重要性,方便模型解釋和特征工程。
GBDT算法的缺點包括:
-
訓練時間長:GBDT算法需要多次迭代訓練,因此訓練時間較長。
-
容易過擬合:由于GBDT算法采用的是Boosting思想,容易出現(xiàn)過擬合問題。為避免過擬合問題,需要調節(jié)模型參數和控制模型復雜度。
Python中實現(xiàn)GBDT算法可以使用sklearn庫中的GradientBoostingRegressor
和GradientBoostingClassifier
模塊。以下是一個簡單的示例:
from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier# 加載數據集
X_train, y_train = ...
X_test, y_test = ...# 創(chuàng)建GBDT模型
gbdt = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1, max_depth=3)# 訓練模型
gbdt.fit(X_train, y_train)# 預測
y_pred = gbdt.predict(X_test)# 計算準確率或均方誤差等指標
score = gbdt.score(X_test, y_test)
其中,GradientBoostingRegressor
用于回歸任務,GradientBoostingClassifier
用于分類任務。參數n_estimators
表示迭代次數,learning_rate
表示學習率,max_depth
表示決策樹的最大深度。
1.2.2.3 XgBoost
XgBoost(eXtreme Gradient Boosting)在Boosting的基礎上,在優(yōu)化算法和提高速度方面做了很多改進。它支持分類、回歸和排名任務,并且在各種機器學習競賽中表現(xiàn)優(yōu)異。
Python中實現(xiàn)XgBoost算法可以使用xgboost庫。以下是一個簡單的示例:
import xgboost as xgb# 加載數據集
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)# 設置參數
params = {'booster': 'gbtree', # 樹模型'objective': 'reg:squarederror', # 回歸任務'eta': 0.1, # 學習率'max_depth': 5, # 樹的最大深度'subsample': 0.8, # 每棵樹樣本采樣比例'colsample_bytree': 0.8, # 每棵樹特征采樣比例'eval_metric': 'rmse' # 評估指標
}# 訓練模型
num_round = 100 # 迭代次數
model = xgb.train(params, dtrain, num_round)# 預測
y_pred = model.predict(dtest)# 計算準確率或均方誤差等指標
score = model.score(dtest, y_test)
其中,需要將數據集轉換為DMatrix
格式,設置參數和訓練模型的方式與GBDT類似。需要注意的是,XgBoost也是一種集成學習方法,通常需要和其他特征工程、模型選擇、模型融合等技術一起使用,才能發(fā)揮出最好的效果。
1.2.3 Stacking
Stacking是基于多個模型進行組合預測的。它的基本思想是:將多個不同類型的弱學習器的預測結果作為輸入來訓練一個強學習器,以產生最終的預測結果。
Stacking算法的大致步驟如下:
Stacking算法是一種高效而且準確的集成學習方法,因為它可以同時融合多個不同的預測模型,從而產生更準確的預測結果。但是,它需要更多的計算成本和時間,同時也需要更多的調整和優(yōu)化來避免過擬合和欠擬合等問題。
Python實現(xiàn):
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.ensemble import RandomForestClassifier# 構造訓練數據集
X, y = make_classification(n_samples=1000, n_informative=5, n_classes=2, random_state=1)
n_folds = 5
kf = KFold(n_folds, shuffle=True, random_state=1)# 定義基分類器
lr = LogisticRegression()
dt = DecisionTreeClassifier()
nb = GaussianNB()
rf = RandomForestClassifier()# 訓練基分類器并得到其預測結果
def get_oof(clf, X_train, y_train, X_test):oof_train = np.zeros((X_train.shape[0],))oof_test = np.zeros((X_test.shape[0],))oof_test_skf = np.empty((n_folds, X_test.shape[0]))for i, (train_index, test_index) in enumerate(kf.split(X_train)):kf_X_train = X_train[train_index]kf_y_train = y_train[train_index]kf_X_test = X_train[test_index]clf.fit(kf_X_train, kf_y_train)oof_train[test_index] = clf.predict(kf_X_test)oof_test_skf[i, :] = clf.predict(X_test)oof_test[:] = oof_test_skf.mean(axis=0)return oof_train.reshape(-1, 1), oof_test.reshape(-1, 1)# 訓練多個基分類器并得到其輸出結果
lr_oof_train, lr_oof_test = get_oof(lr, X, y, X)
dt_oof_train, dt_oof_test = get_oof(dt, X, y, X)
nb_oof_train, nb_oof_test = get_oof(nb, X, y, X)
rf_oof_train, rf_oof_test = get_oof(rf, X, y, X)# 將多個基分類器的輸出結果作為元特征集,訓練元分類器
X_train = np.concatenate((lr_oof_train, dt_oof_train, nb_oof_train, rf_oof_train), axis=1)
X_test = np.concatenate((lr_oof_test, dt_oof_test, nb_oof_test, rf_oof_test), axis=1)meta_model = LogisticRegression()
meta_model.fit(X_train, y)# 使用元分類器進行預測
predictions = meta_model.predict(X_test)
二、聚類算法
2.1 概念
聚類算法是一種無監(jiān)督學習算法,其目標是將一組未標記的數據樣本分成多個相似的群組,群組內部的樣本相似度高,群組之間的樣本差異度也高。
聚類算法根據相似性度量在數據集中找到相似的數據點,并將其分配到不同的簇中,簇內數據點之間相似度高,簇與簇之間的相似度低。
聚類算法的一般流程如下:
- 隨機選擇K個簇心(簇心是聚類的中心點)。
- 計算每個樣本與K個簇心之間的距離,并將樣本分配到距離最近的簇。
- 重新計算每個簇的中心點。
- 重復步驟2和3直到收斂,即簇不再發(fā)生變化。
聚類算法在各種領域廣泛應用,例如文本聚類、圖像分割、市場營銷、醫(yī)學、生物信息學等。
2.2 常用聚類算法
常用的聚類算法包括以下幾種:
-
K-means算法:是最常用和最經典的聚類算法之一。它以歐幾里得距離作為相似性度量,將數據樣本分成K個簇。
-
層次聚類算法:該算法通過計算樣本之間的距離將數據點不斷合并成越來越大的簇,最終形成一棵層次結構。
-
DBSCAN算法:該算法通過局部密度來確定樣本是否屬于同一個簇,可以有效地處理噪聲和離群值。
-
AP聚類算法:該算法通過簇內數據點之間的傳遞消息來確定簇的數量和簇心位置,具有很好的穩(wěn)健性和魯棒性。
-
高斯混合模型聚類算法:該算法將每個簇看作一個高斯分布,通過最大化似然函數來確定簇的數量,具有良好的靈活性和可解釋性。
以上算法各有優(yōu)缺點,在不同應用場景下選取合適的算法可以獲得更好的聚類效果。
2.2.1 K-means
K-means算法是一種常見且經典的聚類算法,它將數據樣本分成K個簇,并且每個簇的中心被稱為簇心。該算法的基本步驟如下:
-
隨機選擇K個中心點作為簇心,可以選擇樣本中的K個點或者通過其他方法選取。
-
將每個樣本點分配到最近的簇心所在的簇中。
-
更新每個簇的簇心,計算該簇內所有樣本點的平均值并將其作為新簇心。
-
重復步驟2和3,直到所有樣本點的簇分配不再變化或達到最大迭代次數。
K-means算法需要選擇合適的K值,通常采用肘部法則選擇最佳的K值。肘部法則是指在不同的K值下,計算聚類的平均距離平方和(SSE),選擇一個SSE急劇下降的點作為最佳的K值。
K-means算法的優(yōu)點包括簡單、易于實現(xiàn)、計算效率高,但其缺點也很明顯,如需要預先確定簇的數量、對初始點的選擇敏感,容易陷入局部最優(yōu)解等。
Python可以簡單的使用sklearn庫實現(xiàn)此算法。
from sklearn.cluster import KMeans
import numpy as np# 構造樣本數據
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])# 設置簇數K為2
kmeans = KMeans(n_clusters=2)# 訓練模型,預測簇分配
kmeans.fit(X)
labels = kmeans.predict(X)# 輸出結果
print("樣本數據:\n", X)
print("簇分配:\n", labels)
print("簇心:\n", kmeans.cluster_centers_)
樣本數據:[[1 2][1 4][1 0][4 2][4 4][4 0]]
簇分配:[0 0 0 1 1 1]
簇心:[[ 1. 2. ][ 4. 2. ]]
2.2.2 層次聚類
層次聚類算法(Hierarchical Clustering)是一種基于樹形結構的聚類方法,它的主要思想是不斷將相似的對象合并成為更大的簇,直到所有對象都被合并到同一個簇中或達到某個預設的閾值。
層次聚類算法有兩種不同的方法:自底向上的聚合(Agglomerative Clustering)和自頂向下的分裂(Divisive Clustering)。
自底向上的聚合是一種自下而上的聚類方法,將每個樣本數據都置為一個初始簇,然后重復以下步驟直至達到停止條件:
- 計算兩個最近的簇之間的距離(可以使用不同的距離度量方式)
- 合并兩個最近的簇為一個新的簇
- 計算新的簇與所有舊簇(或新簇)之間的距離
自頂向下的分裂是一種自上而下的聚類方法,將所有樣本數據都置為一個初始簇,然后重復以下步驟直至達到停止條件:
- 計算當前簇中樣本的方差
- 選取方差最大的簇進行分裂,將其分為兩個新的簇
- 遞歸地對新的兩個簇進行2步驟操作
Python中,可以使用scikit-learn庫中的AgglomerativeClustering
類來實現(xiàn)自底向上的聚合層次聚類算法,以下是一個簡單的示例代碼:
from sklearn.cluster import AgglomerativeClustering
import numpy as np# 構造樣本數據
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])# 設置簇數K為2
agg_clustering = AgglomerativeClustering(n_clusters=2)# 訓練模型,預測簇分配
labels = agg_clustering.fit_predict(X)# 輸出結果
print("樣本數據:\n", X)
print("簇分配:\n", labels)
其中,AgglomerativeClustering
類的n_clusters
參數指定簇數,fit_predict
方法用于訓練模型并預測簇分配。輸出結果顯示,所有的樣本數據都被正確的分配到了兩個簇中。
2.2.3 DBSCAN算法
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)算法是一種基于密度的聚類算法,主要用于發(fā)現(xiàn)任意形狀的密度相連簇集,可以有效地處理噪聲和局部密度變化的數據。
DBSCAN算法的核心思想是給定一個密度閾值eps和一個最小包含點數minPts,將樣本分為核心點、邊界點和噪聲點三類,具體步驟如下:
- 隨機選取一個未訪問的樣本點p
- 判斷p是否是核心點(周圍半徑為eps內至少包含minPts個樣本點)
- 如果p是核心點,則將其周圍eps半徑內的所有樣本點加入一個新的簇中,并且將這些樣本點標記為已訪問
- 如果p不是核心點,則標記為噪聲點并標記為已訪問
- 重復以上步驟,直到所有樣本點都被訪問
Python中,可以使用scikit-learn庫中的DBSCAN
類來實現(xiàn)DBSCAN算法,以下是一個簡單的示例代碼:
from sklearn.cluster import DBSCAN
import numpy as np# 構造樣本數據
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])# 設置密度閾值eps為1,最小包含點數minPts為2
dbscan = DBSCAN(eps=1, min_samples=2)# 訓練模型,預測簇分配
labels = dbscan.fit_predict(X)# 輸出結果
print("樣本數據:\n", X)
print("簇分配:\n", labels)
其中,DBSCAN
類的eps
參數指定密度閾值,min_samples
參數指定最小包含點數,fit_predict
方法用于訓練模型并預測簇分配。輸出結果顯示,所有的樣本數據都被正確的分配到了兩個簇中。值得注意的是,-1表示噪聲點。
2.2.4 AP聚類算法
AP聚類算法(Affinity Propagation clustering algorithm)是一種基于"消息傳遞"的聚類算法,它能夠有效地自動劃分聚類中心和樣本點,并且不需要事先指定聚類數量。AP聚類算法的核心思想是利用樣本點之間的相似度信息來進行聚類,通過傳遞消息的方式不斷優(yōu)化聚類中心和樣本點的劃分。
具體地,AP聚類算法的過程如下:
- 計算樣本點之間的相似度矩陣S
- 初始化兩個矩陣R和A,其中R[i, k]表示樣本點i選擇樣本點k作為其聚類中心的相對適合度,A[i, k]表示樣本點i將樣本點k作為聚類中心的相對適合度調整值
- 通過迭代更新矩陣R和A來不斷優(yōu)化聚類中心和樣本點的劃分,直到滿足停止準則(例如收斂或達到最大迭代次數)
- 最后,根據聚類中心和樣本點的劃分結果來進行聚類
Python中,可以使用scikit-learn庫中的AffinityPropagation
類來實現(xiàn)AP聚類算法,以下是一個簡單的示例代碼:
from sklearn.cluster import AffinityPropagation
import numpy as np# 構造樣本數據
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])# 設置阻尼因子damping為0.5
ap = AffinityPropagation(damping=0.5)# 訓練模型,預測簇分配
labels = ap.fit_predict(X)# 輸出結果
print("樣本數據:\n", X)
print("簇分配:\n", labels)
其中,AffinityPropagation
類的damping
參數指定阻尼因子,fit_predict
方法用于訓練模型并預測簇分配。輸出結果顯示,所有的樣本數據都被正確地分配到了兩個簇中。
2.2.5 高斯混合模型聚類算法
高斯混合模型聚類算法(Gaussian Mixture Model clustering algorithm)是一種基于概率模型的聚類算法,它假設樣本數據是由多個高斯分布混合而成的,并通過最大化似然函數來估計模型參數和聚類結果。高斯混合模型聚類算法能夠適用于各種形狀、大小和密度的聚類,并且可以進行密度估計和異常檢測。
具體地,高斯混合模型聚類算法的過程如下:
- 隨機初始化高斯混合模型的參數(包括每個高斯分布的均值、方差和混合系數)
- 根據當前的高斯混合模型參數,計算樣本數據屬于每個高斯分布的概率,并根據概率大小分配樣本數據到對應的簇中
- 基于當前的樣本簇分配,更新高斯混合模型的參數,最大化似然函數
- 重復步驟2和步驟3,直到滿足停止準則(例如收斂或達到最大迭代次數)
- 最后,根據樣本簇分配結果來進行聚類
Python中,可以使用scikit-learn庫中的GaussianMixture
類來實現(xiàn)高斯混合模型聚類算法,以下是一個簡單的示例代碼:
from sklearn.mixture import GaussianMixture
import numpy as np# 構造樣本數據
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])# 設置高斯分布數量為2
gmm = GaussianMixture(n_components=2)# 訓練模型,預測簇分配
labels = gmm.fit_predict(X)# 輸出結果
print("樣本數據:\n", X)
print("簇分配:\n", labels)
其中,GaussianMixture
類的n_components
參數指定高斯分布數量,fit_predict
方法用于訓練模型并預測簇分配。輸出結果顯示,所有的樣本數據都被正確地分配到了兩個簇中。
這一期我寫了3天,很高興你能看到這里,給個免費的贊可以嗎?謝謝!