第三章: 機器學習經典算法
機器學習之經典算法
機器學習適用的數據爲具有特徵值(屬性,label)和目標值(結果,point)的數據集。通過從歷史數據集中學習經驗,建立模型,從而達到預測新特徵值對應的目標值的效果。因此在數據方面,越見多識廣的數據集(樣本集越大越全),越能進行更可信的預測(越準確的預測)。
算法分類:
按有無特徵值分類:1、監督學習:有特徵值 2、無監督學習:無特徵值
按特徵值類型分類;1、分類算法:特徵值爲一組有限且固定的序列 2、迴歸算法:特徵值爲一個連續的數值空間
算法選擇:sklearn中提供了基礎的算法選擇圖譜。
一、KNN算法
定義:
如果一個樣本在特徵空間中的K個最相似(距離最近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。
人以類聚,物以羣分。
距離計算公式:
歐式距離(平方根距離)、曼哈頓距離(絕對值距離),明科夫斯基距離(以上兩種距離均是明科夫斯基距離的特例)
適用案例:
iris,根據鳶尾花的一些特徵判斷一個鳶尾花所屬的種類
適用於小數據場景,K-W數據量級別的樣本。
算法優缺點:
優點:簡單、易於理解,易於實現,無需訓練
缺點:1、懶惰算法,對預測樣本分類時才進行計算,計算量大,內存開銷大。
2、必須指定K值,K值選擇會極大程度影響分類的準確度。
關於K值選取:K值過小,容易受到異常數據的影響。而K值過大,容易受樣本不均衡的影響。
特徵工程處理:
需儘量保證各個維度的數據公平性。無量綱化-標準化處理。儘量保證各個維度的數據公平性。
skLearn API:
sklearn.neighbors.KNeighborsClassifier(n_neighbor=5,algrithm='auto')
n_neighbors: int 可選,默認5 , K值
algorithm : {'auto','ball_tree','kd_tree','brute'} .可選。用於計算最近的算法。有ball_tree、kd_tree。不同的實現方式會影響效率,但不影響結果。一般用auto,會自己根據fit方法的值來選擇合適的算法。
spark API:
未找到。
二、樸素貝葉斯分類算法
樸素:假定了特徵與特徵之間相互獨立,沒有影響。
貝葉斯:貝葉斯概率計算公式。
原理:
30%的男人是好人,80%的老人是好人, 那男老人有24%的概率是好人
應用場景:
文本分類、評論區分好差評
優缺點:
優點:發源於古典數學理論,有穩定的分類效率
對缺失數據不敏感,算法也比較簡單,常用語文本分類。
分類速度快,準確度相對較高。
缺點:由於使用了樣本屬性獨立的假設,當特徵屬性之間有關聯時,其效果就不太好。
API:
sklearn:
sklearn.naive_bayes.MuitinomialNB(alpha = 1.0)
alpha:拉普拉斯平滑係數,一般用1 。
spark: JavaNaiveBayesExample
三、決策樹
決策樹模型就是一個多層的if-else結構
分類原理:
特徵判斷的先後順序,要能儘量快速過濾掉大部分不符合標準的情況。決策樹的劃分依據之一:信息熵,信息增益。
信息熵可認爲是信息的混亂程度。而信息增益可以理解爲按某一個屬性進行劃分後的信息熵增益。決策樹的劃分方式就是在每一個節點選擇信息增益最大的屬性進行劃分。
另外,在理論上,信息增益準則對可取值數據較多的屬性是有偏好的,爲了減少這種不利影響,改進方法是使用信息增益率來選擇最優劃分屬性。–這個選擇偏好可以這樣理解,比如對一般的數據庫,大都有ID作爲唯一標識。那如果按照信息增益準則,這個ID就是最優的劃分屬性,因爲按照這個屬性可以唯一的將數據分出類別,這就是所謂的偏好。而增益率則可以減少這種偏好的不利影響。比較高端的做法是先從候選劃分屬性中找出信息增益高出平均水平的屬性,再從中選擇增益率高的屬性,作爲最優的屬性。
信息熵計算公式,信息增益計算公式,信息增益率計算公式,gini係數。。全都看得似懂非懂。
API
sklearn:
sklearn.tree.DecisionTreClassifier(criterion='gini',max_depth=None,random_state=None)
決策樹分類器
criterion: 默認是'gini'係數,也可以選擇信息增益的熵‘entropy’
max_depth:樹的深度大小
random_state:隨機數種子
spark:
JavaDCTExample、JavaDecisionTreeClassificationExample、JavaDecisionTreeRegressionExample
優缺點:
優點: sklearn中有可視化工具,並且模型的可解釋能力強,不需要進行數據歸一。模型就是一個多層的If-else結構,比較容易理解。
缺點:不太容易擴展到更復雜的情況,整個決策樹容易過大。容易產生過擬合。過擬合的調整方式是配置maxDepth參數,修改樹的深度。
另一種改進方法是進行剪枝。
四、隨機森林
通過建立幾個模型組合來解決單一預測問題。其原理就是生成多個分類器(模型),各自獨立地學習和做出預測。這樣預測最後結合成組合預測,一般都優於任何一個單一分類器做出的預測。其輸出的類別就是取多數的結果。
原理:
BootStrap隨機有放回抽樣。從訓練集中隨機取一個樣本,讓如新訓練集。然後從原訓練集中再隨機抽取(已抽取的樣本放回原訓練集)。這樣,每棵樹的訓練集都是獨有的。
相當於將數據分散成不同的樹。隨機的預測思想就是這些樹中有“正確”的樹,也有“錯誤”的樹。而“錯誤”的樹的學習結果會互相抵消,最終“正確”的樹就會脫穎而出。
API:
sklearn:
sklearn.ensemble.RandomForestClassifier(n_estimators=10,criterion='gini',max_depth=None,bootstrap=True,random_state=None,min_samples_split=2)
n_estimators: Int 默認10 森林裏的數據數量
criteria: String 默認gini . 分隔特徵的測量方法 entropy
max_depth: Integer或者None,可選。樹的最大深度
max_features="auto" 每個決策樹的最大特徵數量
auto, sqrt log2 None
auto和sqrt是一個意思,開根號。 None取跟原樣本一樣的特徵樹。
bootstrap: boolean 默認true 是否在構建樹時使用放回抽樣
min_samples_split:節點劃分最少樣本數
min_samples_leaf:葉子節點的最小樣本數
超參數:n_estimator, max_depth,min_samples_split,min_samples_leaf。 可用網格搜索
spark中也有多個官方示例。
優缺點:
在所有分類算法中,具有較好的準確率。能夠有效的運行在大數據集上,處理具有高維特徵的輸入樣本,而且不需要降維。能夠評估各個特徵在分類問題上的重要性。
五、線性迴歸
迴歸問題:目標值是一組連續的數據。
原理:
用一個多元一次方程來描述特徵值與目標值之間的關係,線性關係。
使用場景:波士頓方法預測Demo
目標:
模型參數能夠儘量準確的預測目標值。–損失函數最小。
損失函數:最小二乘法
預測目標值減去實際目標值,再求平方和。優化的方法就是求出模型中的一組參數,使得損失函數打到最小。
優化方法:
1、正規方程: --打不出公式來,參數矩陣一通轉置,求逆。 直接按照方程求最優解。類似於拋物線方程直接求極值。
缺點:當特徵過多且複雜時,求解速度太慢,而且可能得不到結果。 另外,無法解決過擬合的問題。 所以一般都是用下面的梯度下降。
2、梯度下降:先假定一組解,再不斷試錯,逼近正確答案。
原理:沿着坡度最陡的方向()移動一段距離,不斷逼近損失函數最小值。
API:
sklearn.linear_model.LinearRegression(fit_interfcept=True)
- 通過正規方程優化
- fit_intercept: 是否計算偏置--參數序列最後的b
- LinearRegression.coef_ : 迴歸係數
- LinearRegression.intercept_ : 偏置
sklearn.linear_model.SGDRegressor(loss="squard_loss",fit_intercept=True,learning_rate='invscaling',eta0=0.01)
- SGDRegressor類實現了隨機梯度下降學習,支持不同的loss函數和正則化懲罰項來擬合線性迴歸模型
- loss: 損失類型 squared_loss 普通最小二乘法
- fit_intercept: 是否計算偏置
- learning_rate: string,可選項:
constant : eta=eta0
optimal: eta=1.0/(alpha*(t+t0)) --default
invscaling.: eta = eta0/pow(t,power_t)
常用constant,並使用eta0指定學習率。
SGDRegressor.coef_ :迴歸係數
SGDRegressor.intercept_ :偏置
迴歸性能評估方法:
均方誤差MSE(Mean Squared Error)-跟損失函數長得挺像的。
兩種線性迴歸方法對比:
梯度下降:有超參數-學習率。迭代求解。可以使用於大規模數據集。可以通過調整解決過擬合問題。
正規方程:不需要學習率,一次運算的出。大規模數據計算太過複雜,只適用於小規模數據。不能解決過擬合問題。
集中梯度下降的優化方法:
GD: Grandient Descent ; 原始的梯度下降方式。需要計算所有樣本的值才能的出梯度,計算量大,後面會有一系列的改進。
SGD:Stochastic Grandient Descent:隨機梯度下降,他在一次迭代時只考慮一個訓練樣本。比較高效,節省時間。缺點是需要許多超參數,對特徵標準化敏感。
SAG:Stochastic Average Gradient 。 隨機平均梯度法。比SGD的收斂速度更快
六: 嶺迴歸- RidgeRegressor
嶺迴歸也是一種線性迴歸,只不過在算法建立迴歸方案時,加上了正則化的限制,從而達到解決過擬合的效果。因此比線性迴歸更常用。
關於正則化:
當原始數據的特徵較多時,容易存在一些嘈雜特性。而模型爲了去兼顧所有特徵會變得過於複雜,這樣很容易產生過擬合。
而優化的方式是使用正則化。在損失函數中加入一個懲罰項。可以使模型中一些參數w都很小,很接近於0,削弱某個特徵的影響。越小的參數說明模型越簡單,越簡單的模型則越不容易產生過擬合。
有L1正則化和L2正則化,L2更常用。
正則化力度越大,權重係數會越小。
API:
sklearn.linear_model.Ridge(alpha=1.0. fit_intercept=True,solver='auto',normalize=False)
- 具有L2正則化的線性迴歸。、
- alpha: 正則化力度,也叫λ 取值範圍: 0~1 1~10
- solver: auto 會根據數據自動選擇優化方法。sag:如果數據集、特徵都比較大,可以ixuanze隨機梯度下降優化
- normalize:數據是否進行標準化。設置爲true時,相當於先進行標準化,在進行預估器流程。
- 返回值: Ridge.coef_: 迴歸參數
- Ridge.intercept_: 迴歸偏置
帶交叉驗證的嶺迴歸
sklearn.linear_model.RidgeCV(_BaseRidgeCV,RegressorMixin)
七:邏輯迴歸與二分類
二分類問題: 是否垃圾郵件、是否金融詐騙、是否虛假帳號。。。
這裏即是用邏輯迴歸來解決二分類問題。
邏輯迴歸原理:
先對一組數據建立線性迴歸模型,h(w) = w1x1 + w2x2+…+b
然後用線性迴歸的輸出作爲邏輯迴歸的輸入,將特徵值映射到一個分類中,作爲預測的目標值。例如:sigmoid激活函數:
線性迴歸的輸出作爲邏輯迴歸的輸入
例如,看下圖的計算示例,邏輯迴歸的結果可以認爲是樣本的二分類概率。然後,同樣通過損失函數來計算邏輯迴歸的模型性能。
邏輯迴歸API:
sklearn.linear_model.LogisticRegrsssion(solver='liblinear',penalty='l2',C=1.0)
- solver: 優化求解模式。 默認 liblinear , 還有sag 隨機平均梯度下降
- penalty: 正則化的種類。 l1 l2
- C: 正則化力度
邏輯迴歸模型評估:
邏輯迴歸的結果只是一個二分類的概率,如有80%的可能是垃圾郵件。然而這種概率結果其實是很虛的,用模型評估拿到也是一個概率,閉上眼睛瞎蒙也能說出一種概率,因此,對計算模型需要有更詳細的評估標準。
混淆矩陣、精確率(Precision)、召回率(Recall)
在二分類任務中,預測結果與正確標記之間存在四種不同的組合,構成混淆矩陣(這個矩陣其實在多分類問題中也能建立,只是更加複雜)
真實結果\預測結果 | 正例 | 假例 |
---|---|---|
正例 | 真正例TP | 爲反例FN |
假例 | 僞正例FP | 真反例TN |
精確率Precision: 預測結果未正例樣本中真實爲正例的比例:
一批西瓜中,預測爲好西瓜的瓜有多少真正是好西瓜。體現模型的準確性。–要把好西瓜挑出來
召回率Recall:真實爲正例的樣本中預測結果也爲正例的比例:對正樣本的區分能力。
一批西瓜中,所有真正爲好西瓜的西瓜中有多少是被正確預測爲好西瓜。體現模型對正樣本的區分能力。–要把壞西瓜扔掉
另外,還有其他更復雜的評估標準。如F1-Score,反映了模型的穩健型
混淆矩陣計算API:
`sklearn.metrics.classification_report(y_true,y_pred,labels=[],target_name=None)`
- `y_true : 真實目標值數組`
- `y_pred: 估計器預測目標值`
- `labels: 指定類別對應的數字`
- `target_names: 目標類別名稱`
- `return: 每個類別精確率與召回率`
- `precision 精確率`
- `recall 召回率`
- `f1-scoreL 穩健度`
- `support 樣本數`
有了這些指標後,能夠一定程度上評估模型的健康度。但是光有這些指標還不太夠,例如在樣本不均衡,正樣本太多,負樣本太少時,這些指標評估結果就不太可信。看下面的這個例子:
這樣隨便進行預測的模型顯然是不靠譜的,但是這些指標都很高。而爲了能更準確的評估二分類模型,就引入了ROC曲線和AOC指標。
ROC曲線和AUC指標
首先需要了解TPRate和FPRate
-
TPRate = TP / (TP+FN): 所有真實類別爲1的樣本中,預測類別也爲1的比例
-
FPRate = FP/( FP + TN):所有真實類別爲0的樣本中,預測類別爲1的比例
有這兩個數據後,對於每一個分類器,就可以建立一條ROC曲線
而AUC指標就可以認爲是ROC曲線下方的圖形面積。
因此,
-
AUC指標的概率意義是隨機取一對正負樣本,正樣本得分大於負樣本的概率。
-
AUC指標的最小值是0.5,最大值是1,取值越大越好
-
AUC=1,就是完美分類器,採用這個預測模型時,不管設定什麼閾值都能的出完美預測結果。但是,在絕大多數預測的場合,都不存在完美分類器。
-
0.5<AUC<1,優於隨機猜測。這個分類器(模型)妥善設定閾值的話,能有預測價值。
-
同時,AUC指標也能用於比較多個不同的分類器的性能。
AUC指標計算API:
`sklearn.metrics.roc_auc_score(y_true,y_score)`
- `計算ROC曲線面積,即AUC值`
- `y_true: 每個樣本的真是類別,必須爲0-反例,1-正例 標記`
- `y_score:預測得分,可以是正類的估計概率、可信值或者分類器方法的返回值`
AUC總結
AUC只能用來評估二分類問題
AUC非常適合評價樣本不均衡時的分類器性能。
回到開始的那個例子,通過AUC指標就能評估出癌症邏輯迴歸的模型不太好了。
八: 無監督學習-K-means算法
無監督學習:無目標值
示例場景:一家廣告平臺需要根據相似的人口學特徵和客戶消費習慣將目標客戶分成不同的小組,以便廣告客戶可以通過有關聯的廣告解除到他們的目標客戶
算法:K-Means聚類, PCA(主成分分析法)降維
以下KMeans效果圖: 將一羣點隨機分成三類
而下面這個圖說明了KMeans的計算步驟:
KMeans API:
kMeans實現走預估器代碼流程
`sklearn.cluster.KMeans(n_clusters=8, init = 'k-means++')`
`n_clusters:開始的聚類中心數量`
`init : 初始化方法。`
`labels_ : 默認標記的類型,可以和真實值比較(不是值比較)`
kMeans性能評估:
KMeans採用輪廓係數來進行評估,輪廓係數在-1,1之間,越接近1,分類效果越好,越接近-1 ,分類效果越差。
輪廓係數API:
sklearn.metrics.silhouette_score(X,labels)`
計算所有樣本的平均輪廓係數`
X: 特徵值`
labels: 被聚類標記的目標值
總結:
特點: KMeans採用迭代式算法,直觀易懂並且非常實用
缺點:容易收斂到局部最優解 : 一開始隨機選取的聚類中心過於集中 , 可以多次聚類來解決。
應用場景:聚類一般用在分類之前。沒有目標值,先用聚類計算出一部分目標值,再用目標值進行分類。