機器學習種9種常用演算法
一、常見演算法分類
- 分類方法
- KNN
- 邏輯斯蒂迴歸(logiscic)
- 決策樹
- 樸素貝葉斯
- 支援向量機SVC
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
- 迴歸方法
- KNN
- 普通線性迴歸(linear)
- 嶺迴歸(ridge)
- lasso迴歸
- 決策樹
- 支援向量機SVR
from sklearn.neighbors import KNeighborsRegressor
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Ridge
from sklearn.linear_model import Lasso
from sklearn.tree import DecisionTreeRegressor
from sklearn.svm import SVR
- 聚類方法
- K均值演算法(K-means) (無監督學習)
from sklearn.cluster import KMeans
二、演算法說明
1.KNN演算法
kNN演算法又稱為k近鄰分類(k-nearest neighbor classification)演算法。是從訓練集中找到和新資料最接近的k條記錄,然後根據他們的主要分類來決定新資料的類別。
該演算法涉及3個主要因素:訓練集、距離或相似的衡量、k的大小。
- 優點
簡單,易於理解,易於實現,無需估計引數,無需訓練
適合對稀有事件進行分類(例如當流失率很低時,比如低於0.5%,構造流失預測模型)
特別適合於多分類問題(multi-modal,物件具有多個類別標籤),例如根據基因特徵來判斷其功能分類,kNN比SVM的表現要好
- 缺點
懶惰演算法,對測試樣本分類時的計算量大,記憶體開銷大,評分慢
可解釋性較差,無法給出決策樹那樣的規則。
- 使用
#1.匯入:
分類問題:
from sklearn.neighbors import KNeighborsClassifier
迴歸問題:
from sklearn.neighbors import KNeighborsRegressor
#2.建立模型
knnclf = KNeighborsClassifier(n_neighbors=5)
knnrgr = KNeighborsRegressor(n_neighbors=3)
#3.訓練
knnclf.fit(X_train,y_train)
#4.預測
y_pre = knnclf.predict(x_test)
- 練習案例
- 分類:處理鳶尾花資料、人類動作識別、預測年收入、手寫數字識別
- 迴歸:人臉補全
2.普通線性迴歸:linear
線性迴歸由兩個片語成的:線性和迴歸。線性用來描述變數X(variable 或predictor或feature)的係數與響應Y(response)之間的關係是線性的。迴歸說明它的響應是定量(quantitative)的,而不是定性(qualitative)的。
- 使用
#1.匯入
from sklearn.linear_model import LinearRegression
#2.建立模型
line = LinearRegression()
#3.訓練
line.fit(X_train,y_train)
#4.預測
y_pre= line.predict(x_test)
- 案例:
- 波士頓房價預測
- 預測鮑魚年齡
- 人臉補全
3.嶺迴歸:ridge
- 定義
嶺迴歸(英文名:ridge regression, Tikhonov regularization)是一種專用於共線性資料分析的有偏估計迴歸方法,實質上是一種改良的最小二乘估計法,通過放棄最小二乘法的無偏性,以損失部分資訊、降低精度為代價獲得迴歸係數更為符合實際、更可靠的迴歸方法,對病態資料的擬合要強於最小二乘法。
嶺迴歸是加了二階正則項的最小二乘,主要適用於過擬合嚴重或各變數之間存在多重共線性的時候,嶺迴歸是有bias的,這裡的bias是為了讓variance更小
歸納總結
1.嶺迴歸可以解決特徵數量比樣本量多的問題
2.嶺迴歸作為一種縮減演算法可以判斷哪些特徵重要或者不重要,有點類似於降維的效果
3.縮減演算法可以看作是對一個模型增加偏差的同時減少方差
嶺迴歸用於處理下面兩類問題:
1.資料點少於變數個數
2.變數間存在共線性(最小二乘迴歸得到的係數不穩定,方差很大)
- 使用
#1.匯入
from sklearn.linear_model import Ridge
#2.建立模型
# alpha就是縮減係數lambda
# 如果把alpha設定為0,就是普通線性迴歸
ridge = Ridge(alpha=0)
#3.訓練
#4.預測
4.lasso迴歸
說明
該方法是一種壓縮估計。它通過構造一個罰函式得到一個較為精煉的模型,使得它壓縮一些係數,同時設定一些係數為零。因此保留了子集收縮的優點,是一種處理具有復共線性資料的有偏估計。
使用
#1.匯入
from sklearn.linear_model import Lasso
#2.建立模型
las = Lasso(alpha=0.0001)
#3.訓練
#4.預測
- 案例
- 波士頓房價預測
- 預測鮑魚年齡
- 人臉補全
5.邏輯斯蒂迴歸:logistic
- 說明
利用Logistics迴歸進行分類的主要思想是:根據現有資料對分類邊界線建立迴歸公式,以此進行分類。這裡的“迴歸” 一詞源於最佳擬合,表示要找到最佳擬合引數集。
訓練分類器時的做法就是尋找最佳擬合引數,使用的是最優化演算法。接下來介紹這個二值型輸出分類器的數學原理
Logistic Regression和Linear Regression的原理是相似的,可以簡單的描述為這樣的過程:
(1)找一個合適的預測函式,一般表示為h函式,該函式就是我們需要找的分類函式,它用來預測輸入資料的判斷結果。這個過程是非常關鍵的,需要對資料有一定的瞭解或分析,知道或者猜測預測函式的“大概”形式,比如是線性函式還是非線性函式。
(2)構造一個Cost函式(損失函式),該函式表示預測的輸出(h)與訓練資料類別(y)之間的偏差,可以是二者之間的差(h-y)或者是其他的形式。綜合考慮所有訓練資料的“損失”,將Cost求和或者求平均,記為J(θ)函式,表示所有訓練資料預測值與實際類別的偏差。
(3)顯然,J(θ)函式的值越小表示預測函式越準確(即h函式越準確),所以這一步需要做的是找到J(θ)函式的最小值。找函式的最小值有不同的方法,Logistic Regression實現時有梯度下降法(Gradient Descent)。
- 使用
#1.匯入
from sklearn.linear_model import LogisticRegression
#2.建立模型
logistic = LogisticRegression(solver='lbfgs')
#solver引數的選擇:
“liblinear”:小數量級的資料集
“lbfgs”, “sag” or “newton-cg”:大數量級的資料集以及多分類問題
“sag”:極大的資料集
#3.訓練
#4.預測
案例
- 手寫數字集分類
- make_blobs聚類資料進行分類
- 預測年收入是否大於50K美元
- 從疝氣病症預測病馬的死亡率
6.決策樹
說明
決策樹(decision tree)是一個樹結構(可以是二叉樹或非二叉樹)。其每個非葉節點表示一個特徵屬性上的測試,每個分支代表這個特徵屬性在某個值域上的輸出,而每個葉節點存放一個類別。使用決策樹進行決策的過程就是從根節點開始,測試待分類項中相應的特徵屬性,並按照其值選擇輸出分支,直到到達葉子節點,將葉子節點存放的類別作為決策結果。
分類解決離散問題,迴歸解決連續問題
#1.匯入
分類:from sklearn.tree import DecisionTreeClassifier
迴歸:from sklearn.tree import DecisionTreeRegressor
#2.建立模型
# max_depth 整數型別,決定對多少個數據特徵做分裂
tree = DecisionTreeClassifier(max_depth=5)
tree = DecisionTreeRegressor(max_depth=5)
#3.訓練
#4.預測
案例
- 處理鳶尾花資料
- 預測隱形眼鏡型別
- 處理make_blobs聚類資料
7.樸素貝葉斯
優點:
- 樸素貝葉斯模型發源於古典數學理論,有著堅實的數學基礎,以及穩定的分類效率;
- 對小規模的資料表現很好;
- 能處理多分類任務,適合增量式訓練;
- 對缺失資料不太敏感,演算法也比較簡單,常用於文字分類
缺點:
- 只能用於分類問題
- 需要計算先驗概率;
- 分類決策存在錯誤率;
- 對輸入資料的表達形式很敏感
1、高斯分佈樸素貝葉斯
應用場景
- 高斯分佈就是正態分佈
- 用於一般分類問題
使用
#1.匯入
from sklearn.naive_bayes import GaussianNB
#2.建立模型
gNB = GaussianNB()
#3.訓練
gNB.fit(data,target)
#4.預測
y_pre = gNB.predict(x_test)
2、多項式分佈樸素貝葉斯
應用場景
- 適用於文字資料(特徵表示的是次數,例如某個詞語的出現次數)
使用
#1.匯入
from sklearn.naive_bayes import MultinomialNB
#2.建立模型
mNB = MultinomialNB()
#3.字符集轉換為詞頻
from sklearn.feature_extraction.text import TfidfVectorizer
#先構建TfidfVectorizer物件
tf = TfidfVectorizer()
#使用要轉換的資料集和標籤集對tf物件進行訓練
tf.fit(X_train,y_train)
#文字集 ----> 詞頻集
X_train_tf = tf.transform(X_train)
#4.使用詞頻集對機器學習模型進行訓練
mNB.fit(X_train_tf,y_train)
#5.預測
#將字符集轉化為詞頻集
x_test = tf.transform(test_str)
#預測
mNB.predict(x_test)
- 案例:垃圾簡訊過濾
3、伯努利分佈樸素貝葉斯
應用場景
- 適用於伯努利分佈,也適用於文字資料(此時特徵表示的是是否出現,例如某個詞語的出現為1,不出現為0)
- 絕大多數情況下表現不如多項式分佈,但有的時候伯努利分佈表現得要比多項式分佈要好,尤其是對於小數量級的文字資料
使用
#1.匯入
from sklearn.naive_bayes import BernoulliNB
#2.建立模型
bNB = BernoulliNB()
#3.將字符集轉詞頻集
from sklearn.feature_extraction.text import TfidfVectorizer
tf = TfidfVectorizer()
tf.fit(X_train,y_train)
X_train_tf = tf.transform(X_train)
#4.訓練
bNB.fit(X_train_tf,y_train)
#5.預測
#將字符集轉化為詞頻集
x_test = tf.transform(test_str)
#預測
bNB.predict(x_test)
- 案例
- 高斯分佈:普通分類(鳶尾花)
- 多項式分佈、伯努利分佈:文字處理(垃圾簡訊、垃圾郵件過濾)
8.支援向量機SVM
- 原理
解決的問題:
1.線性分類
在訓練資料中,每個資料都有n個的屬性和一個二類類別標誌,我們可以認為這些資料在一個n維空間裡。我們的目標是找到一個n-1維的超平面(hyperplane),這個超平面可以將資料分成兩部分,每部分資料都屬於同一個類別。 其實這樣的超平面有很多,我們要找到一個最佳的。因此,增加一個約束條件:這個超平面到每邊最近資料點的距離是最大的。也成為最大間隔超平面(maximum-margin hyperplane)。這個分類器也成為最大間隔分類器(maximum-margin classifier)。 支援向量機是一個二類分類器。
2.非線性分類
SVM的一個優勢是支援非線性分類。它結合使用拉格朗日乘子法和KKT條件,以及核函式可以產生非線性分類器。
SVM的目的是要找到一個線性分類的最佳超平面 f(x)=xw+b=0。求 w 和 b。首先通過兩個分類的最近點,找到f(x)的約束條件。
有了約束條件,就可以通過拉格朗日乘子法和KKT條件來求解,這時,問題變成了求拉格朗日乘子αi 和 b。
對於異常點的情況,加入鬆弛變數ξ來處理。
非線性分類的問題:對映到高維度、使用核函式。線性分類及其約束條件:
SVM的解決問題的思路是找到離超平面的最近點,通過其約束條件求出最優解。
- 使用
#1.匯入
處理分類問題:
from sklearn.svm import SVC
處理迴歸問題:
from sklearn.svm import SVR
#2.建立模型(迴歸時使用SVR)
svc = SVC(kernel='linear')
svc = SVC(kernel='rbf')
svc = SVC(kernel='poly')
#3.訓練
svc_linear.fit(X_train,y_train)
svc_rbf.fit(X_train,y_train)
svc_poly.fit(X_train,y_train)
#4.預測
linear_y_ = svc_linear.predict(x_test)
rbf_y_ = svc_rbf.predict(x_test)
poly_y_ = svc_poly.predict(x_test)
9.K均值演算法(K-means)
原理
- 聚類的概念:一種無監督的學習,事先不知道類別,自動將相似的物件歸到同一個簇中。
- K-Means演算法是一種聚類分析(cluster analysis)的演算法,其主要是來計算資料聚集的演算法,主要通過不斷地取離種子點最近均值的演算法。
使用
#1.匯入
from sklearn.cluster import KMeans
#2.建立模型
# 構建機器學習物件kemans,指定要分類的個數
kmean = KMeans(n_clusters=2)
#3.訓練資料
# 注意:聚類演算法是沒有y_train的
kmean.fit(X_train)
#4.預測資料
y_pre = kmean.predict(X_train)
- 例項
- 中國足球定位
- 圖片壓縮