機器學習
一、機器學習的過程
特徵選擇->數據採集->數據清洗->數據劃分->模型選擇->模型訓練->模型測試->模型驗證->模型存儲->模型應用
二、數據預處理
特徵
|
V
姓名 身高 體重 年齡
張三 1.7 55 20
李四 1.8 65 22
王五 1.6 50 19
...
1.均值移除
將每個特徵的平均值設置為0,將標準差設置為1。
a
b
c
sqrt((a^2 + b^2 + c^2) / 3) = s
a/s
b/s
c/s
sqrt((a^2/s^2 + b^2/s^2 + c^2/s^) / 3)
sqrt((a^2+ b^2 + c^2) / (3*s^2))
s/s=1
sklearn.preprocessing.scale(原始樣本矩陣)->處理後的樣本矩陣
代碼:std.py
2.範圍縮放
針對樣本矩陣中的每一列(每一個特徵)通過線性變換(kx+b)使得該列的最小值和最大值分別變成0和1,其它值結餘0和1之間。
min k + b = 0
max k + b = 1
/ min 1 \\ x / k \\ = / 0 \\
\\ max 1 / \\ b / \\ 1 /
---------- ----- ------
a x b
numpy.linalg.lstsq(a, b) -> x
構造範圍縮放器:
sklearn.preprocessing.MinMaxScaler(
feature_range=(目標最小值, 目標最大值))->範圍縮放器
執行範圍縮放操作:
範圍縮放器.fit_transform(原始樣本矩陣)->處理後的樣本矩陣
代碼:mms.py
3.歸一化
針對樣本矩陣中的每一行(每一個樣本),將其中的元素除以該行所有元素的和,以是各行的元素之和均為1。
Python Java C++ PHP
2015 10 30 15 12
2016 50 45 20 18
sklearn.preprocessing.normalize(原始樣本矩陣,
norm='l1')->處理後的樣本矩陣
l1範數:將向量諸元素按絕對值求和。
l2範數:將向量諸元素按平方求和。
代碼:nor.py
4.二值化
根據一個預先設定的閾值,將樣本矩陣中所有高於閾值的元素置為1,低於或等於閾值的元素置為0。
sklearn.preprocessing.Binarizer(threshold=閾值)->二值化器
二值化器.transform(原始樣本矩陣)->處理後的樣本矩陣
代碼:bin.py
5.獨熱編碼
針對樣本矩陣中的每一列,根據其值域用若干個0和一個1來編碼其中的元素,這樣整個樣本矩陣就變成一個僅有0和1組成的稀疏矩陣。
1 3 9
7 5 2
1 8 4
7 3 6
1 10 3 100 2 1000
7 01 5 010 4 0100
8 001 6 0010
9 0001
1 0 1 0 0 0 0 0 1
0 1 0 1 0 1 0 0 0
1 0 0 0 1 0 1 0 0
0 1 1 0 0 0 0 1 0
sklearn.preprocessing.OneHotEncoder(
sparse=是否用緊湊格式表示稀疏矩陣, dtype=元素類型)->
獨熱編碼器
獨熱編碼器.fit_transform(原始樣本矩陣)->處理後的樣本矩陣
代碼:ohe.py
6.標記編碼
將字符串形式的特徵值映射為數字以便數學模型的計算。
sklearn.preprocessing.LabelEncoder()->標記編碼器
標記編碼器.fit_transform(原始樣本矩陣)->處理後的樣本矩陣
標記編碼器.inverse_transform(處理後的樣本矩陣)->原始樣本矩陣
代碼:lab.py
三、機器學習的基本問題
1.有監督學習:在已知輸出的條件下,利用某種數學方法建立輸入和輸出之間的聯繫,當出現新的輸入時,利用這種聯繫預測或者判斷其所可能產生的輸出。
1)迴歸:輸出值是連續數值,用於預測。
2)分類:輸出值是離散類別,用於判斷。
2.無監督學習:在未知輸出的條件下,僅根據輸入的相似性利用數學方法進行集群的劃分或者的成分提取。
1)聚類:根據輸入的相似度進行劃分。
2)成分分析:將多個輸入在不影響劃分效果的前提下降低為較少的輸入,降維。
張三,認真聽課,按時完成作業,積極回答問題,成績好
李四,不認真聽課,按時完成作業,積極回答問題,成績較好
王五,不認真聽課,不寫作業,不回答問題,成績差
趙六,認真聽課,按時完成作業,不回答問題,成績差
人臉之別:分類
四、線性迴歸
通過一個線性方程建立輸入和輸出之間的聯繫。
x -> y
預測函數:h(x) = t0 + t1 x
m
成本函數:J(t)=(#(h(x[i]) - y[i])^2) / 2m
i=1
尋找可以使得成本函數J(t)取得最小值的t,h(x)所表示的預測函數就是線性迴歸模型。
梯度下降法
h(x) = t0 + t1 x1 + t2 x2 + ... + tn xn
計算模型的準確性
平均絕對誤差:數據集的真實輸出和預測輸出的誤差絕對值的算術平均數。
sklearn.metrics.mean_absolute_error(真實輸出, 預測輸出)
->平均絕對誤差
均方誤差:數據集的真實輸出和預測輸出的誤差平方的算術平均數之平方根。
sklearn.metrics.mean_squared_error(真實輸出, 預測輸出)
->均方誤差
中位數絕對誤差:數據集的真實輸出和預測輸出的誤差絕對值的中位數。消除異常誤差的干擾,避免樣本中的少數壞點影響評估效果。
sklearn.metrics.median_absolute_error(真實輸出, 預測輸出)->中位數絕對誤差
R方得分:綜合了各種誤差計算方法的結果,通過一個百分比值評估模型的預測性能。該得分越接近於100%越好。
sklearn.metrics.r2_score(真實輸出, 預測輸出)->R方得分
模型的持久化:pickle.dump()/pickle.load()
代碼:line.py、load.py
五、嶺迴歸
線性迴歸的主要問題在於對異常值敏感。在實際應用中,經常會遇到一些明顯錯誤的樣本,會對迴歸結果產生較大的負面影響。嶺迴歸旨在降低異常樣本的權重,削弱其對預測模型的影響。
代碼:rdg.py
六、多項式迴歸
通過在原始參與線性迴歸的樣本基礎上,增加高次項,提高模型的複雜度,避免出現欠擬合。
h(x1, x2) = t0 + t1x1 + t2x2 + t3x1^2 + t4x^2 + t5x1x2
代碼:poly.py
七、決策樹
性別:1-男,0-女
專業:1-文學,2-物理,3-歷史,4-化學
學號 性別 專業 -> 類別
1 1 2 1
2 1 1 0
3 0 4 4
4 0 3 2
5 1 4 1
5 1 3 ?
-----------------------
1 1 2 1
2 1 1 0
5 1 4 1
5 1 3 ?
3 0 4 4
4 0 3 2
-----------------------
1 1 2 1
5 1 4 1
2 1 1 0
5 1 3 ?->0
3 0 4 4
4 0 3 2
-----------------------
1.決策樹分類/迴歸算法步驟
1)計算數據集劃分前的信息熵;
2)遍歷所有未作為劃分條件的特徵,分別計算根據該特徵劃分數據後的信息熵;
3)選擇可以獲得最大信息增益的特徵,並使用該特徵作為劃分依據將數據集劃分為若干子集;
4)遞歸地處理被劃分後的所有子數據集,從未被選擇的特徵中尋找最優的劃分特徵來劃分出更小的子集;
5)以上遞歸過程的終止條件通常可以選擇以下兩個:
A.所有的特徵都用過了,即沒有新的特徵可以作為繼續劃分的依據了;
B.劃分後產生的信息增益已經足夠小,或者已小於實現設定的增益閾值。
6)對於新的輸入數據,按照模型中決策樹每個節點的劃分依據,將該樣本歸屬到相應的子集中,直到該樣本出現在某個特定的葉節點中,該樣本的輸出由此節點各樣本的輸出經過投票(分類)
或取均值(迴歸)確定。
說明:對於連續值的特徵,可以在數據預處理階段根據業務的需要人為劃分為若干區段,這個過程被稱為離散化。
2.算法優化
1)前剪枝
在劃分前根據信息增益是否足夠小,決策樹是否足夠高,待劃分子集樣本是否足夠少等條件,決定是否可以提前終止劃分迭代,以避免因模型過於複雜導致過擬合。
2)後剪枝
在決策樹構建完成以後,自底向上,從生成的子樹中尋找可以合併的依據,用子樹的根節點代替這棵子樹,以此簡化數學模型,防止過擬合。
3.集合算法
根據統計學原理將多棵決策樹的預測結果通過投票或者平均的方法,消除單棵決策樹對特殊特徵及樣本的傾向性。
1)自助聚合:從n個訓練樣本中隨機抽取m個,創建模型,重複這個過程B次,得到B個模型,針對每個待預測的樣本,有B個模型得到B個預測值,通過投票或平均得到相應的輸出。
2)正向激勵:為每個訓練樣本分配初始權重,建立模型,增加預測錯誤樣本權重,再建立模型,重複這個過程,得到B個模型...越晚建立的模型權重越高,在後續投票或平均的過程中體現出模型權重的差別。
3)隨機森林:在自助聚合的基礎上,每個構建決策樹的時候,隨機選擇部分特徵,以消除較強特徵對預測結果的影響。
代碼:house.py
八、特徵的相對重要性
1.學習模型對象的feature_importances_屬性,表示各個特徵的相對重要性。不同的模型針對特徵所認為的重要性不盡相同,但應該大體符合實際業務邏輯。
2.有學習模型輸出的特徵相對重要性與算法和特徵集緊密相關,從不同的算法模型或特徵集合中可能會得出完全不同的重要性排列。
代碼:imp.py、bike.py
九、簡單分類器
對於可以人工方法找到的分類依據就沒有必要使用數學模型完成分類,換言之自己編寫的代碼邏輯就已經體現分類模型的效果。
代碼:simple.py
十、邏輯分類器
1.預測函數
g(z) = 1 / (1+e^-z)
z = t0 + t1x1 + t2x2 + ... + tnxn
h(x1, ..., xn) = 1 / (1+e^-(t0 + t1x1 + t2x2 + ... + tnxn))
J(t0, ..., tn) = sigma((h(x1, ..., xn) - y)^2) / 2m
t0, ..., tn ? -> J(t0, ..., tn) min
若可證明K(t0, ..., tn)和J(t0, ..., tn)是同極函數,則可以通過使K函數取極值的模型參數(t0, ..., tn)間接地表示使成本函數J取極小值的參數。
J(t)+r||t||(l1/l2(缺省))
||t||(l1):t向量各元素絕對值之和
||t||(l2):t向量各元素平方值之和
r||t||稱為正則項,避免由於t向量過大造成模型過擬合,其中r稱為正則強度,越大正則強度越高,對t的懲罰力度越大,反而反之。
代碼:log1.py
多元分類:首先把問題轉化為二元分類問題,即y=A是一個類別,y={B, C, D}作為另一個類別,然後計算這兩個類別的概率,接著,把y=B作為一個類別,把y={A, C, D}作為另一個類別,在計算這兩個類別的概率,以此類推,總共需要4個預測函數,選出其中概率最高的那個類別,作為未知類別樣本的分類。
坐飛機 不坐飛機
坐火車 不坐火車
自駕 不自駕
A 1 0 0
B 0 1 0
C 0 0 1
D 0 0 0
模型1 模型2 模型3 ...
0.97 0.02
0.01 0.01
代碼:log2.py
十一、樸素貝葉斯分類器
警察用劣質檢測器測試酒駕,該檢測器有5%的概率把一個正常司機判斷為酒駕,已知有0.1%的司機會酒駕。假設警察攔下一個司機,做呼氣測試,檢測器顯示酒駕,該司機究竟有多大概率真的酒駕?
1000個司機中有1個酒駕,另外999個正常
1/(1+999x5%)=1.96%
貝葉斯定理:
P(A|B)=P(A)P(B|A)/P(B)
P(A|B)P(B)=P(B|A)P(A)
P(A,B) = P(B,A)
B: 檢測器顯示酒駕的概率
A: 司機真正酒駕的概率
P(A|B)=0.1%x100%/(0.1%x100%+(1-0.1%)x5%)=1.96%
在B事件發生的條件下A事件發生的概率P(A|B),等於A事件發生的概率P(A)乘以A事件發生的條件下B事件發生的概率P(B|A)比上B事件發生的概率P(B)。
求輸入樣本x被標記為c類的概率p(c|x),當c取所有可能標記事,對應概率最大的就是x的所屬的類別。
p(c|x)=p(c)p(x|c)/p(x)
p(c|x)&p(c)p(x|c)=p(c,x)
=p(c,x1,x2,...,xn)
=p(x1,x2,...,xn,c)
=p(x1|x2,...,xn,c)p(x2,...,xn,c)
=p(x1|x2,...,xn,c)p(x2|x3,...,xn,c)p(x3,...,xn,c)
=p(x1|x2,...,xn,c)p(x2|x3,...,xn,c)p(x3|x4,...,xn,c)...p(xn|c)p(c)
樸素:輸入樣本中的n個特徵(x1,x2,...,xn)是條件獨立的,其中任何一個特徵都與其它特徵無關。
=p(x1|c)p(x2|c)p(x3|c)...p(xn|c)p(c)
代碼:nb.py
十二、劃分訓練集和測試集
model_selection
sklearn.cross_validation.train_test_split(輸入, 輸出,
test_size=測試集佔比, random_state=混合度)->
訓練輸入, 測試輸入, 訓練輸出, 測試輸出
代碼:split.py
十三、交叉驗證
1.只做一次訓練集和測試集的劃分,多得到的性能指標不具有一般性,通過多次劃分和評估,取其平均值,獲得更具一般意義的評價指標。
2.分類問題的三個驗證指標
1)查準率(P):對於特定類別,預測正確的樣本數/預測樣本數
2)召回率(R):對於特定類別,預測正確的樣本數/實際樣本數
3)F1得分:2PR/(P+R),[0, 1]
sklearn.model_selection.cross_val_score(模型對象,
輸入樣本, 輸出樣本, cv=驗證次數, scoring=指標名)->
由驗證次數個指標值組成的數組
指標名: precision_weighted - 查準率
recall_weighted - 召回率
f1_weighted - F1得分
代碼:cv.py
十四、混淆矩陣
混淆矩陣中每行表示一個實際分類的樣本,每列表示預測分類的樣本,主對角線上的值表示被正確預測的樣本數,用主對角線上的值比上其所在列各元素之和就是該類別的查準率,用主對角線上的值比上其所在行各元素之和就是該類別的召回率。理想情況是所有的非零元素都落在主對角線上。
sklearn.metrics.confusion_matrix(實際輸出, 預測輸出)->混淆矩陣
sklearn.metrics.classification_report(實際輸出, 預測輸出)->性能報告
代碼:cm.py
十五、基於隨機森林分類器的汽車品質評估
代碼:car.py
十六、驗證曲線和學習曲線
1.驗證曲線:模型的性能指標與該模型超參數之間的函數關係。
sklearn.model_selection.validation_curve(模型對象,
輸入樣本,輸出樣本,超參數名,超參數取值序列,cv=交叉驗證次數)->訓練集得分列表,測試集得分列表
得分列表矩陣
1次驗證 2次驗證 ...
超參數值1 0.98 0.97 ...
超參數值2 0.99 0.96 ...
...
代碼:vc.py
並不是模型越複雜性能越好。
2.學習曲線:模型的性能指標與訓練該模型所使用的訓練樣本數量之間的函數關係。
sklearn.model_selection.learning_curve(模型對象,
輸入樣本,輸出樣本,train_sizes=訓練集大小序列,
cv=交叉驗證次數)->訓練集得分列表,測試集得分列表
得分列表矩陣
1次驗證 2次驗證 ...
訓練集大小1 0.98 0.97 ...
訓練集大小2 0.99 0.96 ...
...
代碼:lc.py
閱讀更多 小悅 的文章