機器學習基礎知識-上

一、數據預處理

一行一樣本,一列一特徵

import sklearn.preprocessing as sp
1)標準化
sp.scale(原樣本) # 返回值爲標準化樣本

定義:將樣本矩陣中各列的平均值和標準差統一爲0和1
實現:假設有樣本[ a b c],均值爲m,標準差爲s,則標準化的樣本爲[(a-m)/s (b-m)/s (c-m)/s]

2)範圍縮放
mms = sp.MinMaxScaler(feature_range=(0, 1))
mms.fit_transform(原樣本) # 返回範圍縮放後的樣本

定義:樣本矩陣中每一列的最大值和最小值爲某個給定值(通常是[0, 1]),其它元素線性縮放
實現:k * max + b = 1, k *min + b =0,解出k,b其他值則代入得到

3)歸一化
sp.normalize(原樣本, norm=‘l1’) # 返回歸一化樣本矩陣

  • l1:l1範數,樣本中各元素絕對值的1次方之和
  • l2:l2範數,樣本中各元素絕對值的2次方之和
  • lk:lk範數,樣本中各元素絕對值的k次方之和

定義:用樣本中的每一列的數除以這一列所有數絕對值之和,使得處理後的每一列的元素的絕對值之和爲1,這是norm參數等於l1的

4)二值化
bin = sp.Binarizer(threshold=閾值)
bin.transform(原樣本)# 返回二值化樣本

定義:根據一個事先設定的閾值,將樣本矩陣中不大於閾值的元素設定爲0,大於閾值的元素設定爲1

5)獨熱編碼
ohe = sp.OneHotEncoder(sparse=緊縮格式(默認True),dtype=目標類型)
ohe.fit_transform(原樣本)# 返回獨熱編碼樣本
在這裏插入圖片描述
順序隨意是指1不一定要對應10,可以1對應01,7對應10。
在計算機中,因爲位數相同,它實際只是存儲1的位置,而不記錄所有的0和1

6)標籤編碼
lbe = sp.LabelEncoder()
lbe.fit_transform(原樣本) # 返回標籤編碼樣本
lbe.inverse_transform(標籤編碼樣本) # 返回原樣本

定義:將一列字符串形式的特徵值,按照字典排序,用每個字符在排序序列中的索引號表示該字符,一般用於非數字數據

二、線性迴歸和梯度下降算法

1、根據機器學習的任務把不同的業務模型劃分爲四種基本問題:
迴歸問題 、分類問題
:在有監督條件下,根據已知的輸入和輸出,構建預測模型,對未知輸出的輸入給出大概率的輸出 。如果輸出是連續域的值,則被劃分爲迴歸問題。如果輸出被限定在離散域(已知的一些值或類別)內,則被劃分爲分類問題。

聚類問題:在無監督模式下,根據輸入的特徵劃分族羣。

降維問題:在無監督模式下,對輸入特徵進行取捨以降低維度。

2、線性迴歸:通過線性方程描述輸出和輸入之間的關係,以解決迴歸問題

1)預測函數:y = kx + b
最小二乘法(上一篇博客解釋了):總樣本誤差E = (y1-y1’)^2 + (y2-y2’) ^2 + … + (yn-yn’) ^2。爲了方便計算,實際的E一般取E/2

總誤差E其實是關於係數k、b的函數,被稱爲損失函數。函數在空間表現爲一個空間曲面,形狀類似於球體的下半部分

2)梯度下降算法
梯度(百度百科解釋):一個向量,表示某一函數在該點處的方向導數沿着該方向取得最大值,即函數在該點處沿着該方向(此梯度的方向)變化最快,變化率最大(爲該梯度的模)

梯度下降算法:給定一個起始點,求得該點的梯度,然後沿着梯度的反向移動一些距離(這個移動的距離和學習率的大小有關)得到第二個點,重複上面的過程,直到損失值達到某個值,或者深度(重複次數)已經超過某個值

原理:梯度既然是方向導數沿着該方向取得最大值,也就是說,沿梯度方向,函數值增加最快。同樣可知,方向導數的最小值在梯度的相反方向取得,此最小值爲最大值的相反數,從而沿梯度相反方向函數值的減少最快,然後我們沿這個方向行進一些距離得到的點(這個點還在損失函數上)一定比上一個點低(或者說z值更小),重複一定次數,則最後的結果就接近於最小值了。
至於爲什麼沿梯度方向增加最快,這就是數學上的問題,有興趣的可以瞭解一下。當然大部分時候,我們能使用別人已經造出的輪子,不必去刻意關心過程。

疑問:損失函數既然是一個類似於下半球的曲面,那麼在數學上完全可以求得最低點的切平面,進而得到最小值,爲什麼還要梯度下降算法?因爲梯度下降算法是應用於計算機的,而計算機並不像人,它更適合做一些重複不用思考的工作,而且這樣做在時間上也不比人思考來的慢

計算:E = f(k, b) , 梯度爲(k", b"),k"是E對k求偏微分得到的表達式,而b"是E對b求偏微分得到的表達式。那麼某一點的梯度只需要將點的k,b帶入到兩個表達式得到相應的(k", b")

過程示例代碼:kb.py
調庫示例代碼:sklearn_kb.py

三、嶺迴歸

原理:在最小二乘法的基礎上減掉一個正則項乘以正則強度,即總誤差E = f(k, b) - 正則項 * 正則強度,目的是爲了防止過擬合(過分匹配訓練樣本)。

解釋:而正則項是除常數項的所有係數的平方和(因爲線性迴歸的未知數x不一定只有一個,通用表達式爲y= w0 + … + wnxn),假設y = w0 + w1x1 + w2x2,正則項爲(w1^2 + w2 ^2),正則強度是可變參數,會根據實際情況做出測試調整。當正則項爲所有係數的和時,則是另一種迴歸,被稱作lasso迴歸。

sklearn代碼:

import sklearn.linear_model as lm
#創建模型
model = lm.Ridge(正則強度, fit_intercept=是否訓練截距,
    max_iter=最大迭代次數)
# 訓練模型
model.fit(訓練輸入樣本,訓練輸出樣本)
# 預測
預測輸出 = model.predict(預測輸入樣本)

四、多項式迴歸

其實和線性迴歸原理相同,只是表達式改成了y = w0 + w1x + w2x^2 + …,但是它並不是直接利用多項式的表達式求總誤差,而是將高次項看成是一次項的擴展再用管道連接。我並不理解這樣做的原理,不過沒關係,代碼直接用就行。

代碼:

import sklearn.linear_model as lm

# 創建模型
model = pl.make_pipeline(
    sp.PolynomialFeatures(10),  # 多項式特徵擴展器,10爲多次項的最高項的次數,即十次多項式
    lm.LinearRegression())      # 線性迴歸器
# 訓練模型
model.fit(x, y)  
# 預測模型
model.predict(x)

五、決策樹

核心思想:相似的輸入必會產生相似的輸出。

原理:首先從訓練樣本矩陣中選擇第一個特徵進行劃分,使每個子表中該特徵的值全部相同(比如第一個特徵是男女,則可以劃分出兩個子表,男表和女表),然後再在每個子表中選擇下一個特徵按照同樣的規則繼續劃分更小的子表(比如第二個特徵是年齡,我可以劃分成三個子表(當然根據情況的不同而不同),小於18,大於18小於60,大於60,則在男女表中分別又有三個子表,每個子表下的特徵值都相同),不斷重複直到所有的特徵全部使用完爲止,此時便得到葉級子表,其中所有樣本的特徵值全部相同。

解釋:決策樹是一種分類方法,用於對樣本的特徵分類。而分類完成之後,得到的結果是同一類(或者稱爲表)的所有特徵基本相同,然後根據某一類的所有樣本通過平均(迴歸)或者投票(分類)得到一個輸出。那麼,當有新的待預測樣本需要預測輸出時,我只需知道樣本屬於哪個類(表)。

工程優化(剪枝):不必用盡所有的特徵,葉級子表中允許混雜不同的特徵值,以此降低決策樹的層數,在精度犧牲可接受的前提下,提高模型的性能。通常情況下,可以優先選擇使信息熵減少量最大的特徵作爲劃分子表的依據。(通俗的講就是有些特徵值並不區分,比如第一個特徵是男女,我並不分成兩個表,而是放在一個表裏,這種情況一般是男女這個特徵對輸出的影響不大,至於怎麼知道這個特徵值對輸出結果的影響程度,我暫時還沒明白)

集合算法(組合樹)
1) 自助聚合:每次從總樣本矩陣中以有放回抽樣的方式隨機抽取部分樣本構建決策樹,這樣形成多棵包含不同訓練樣本的決策樹,以削弱某些強勢樣本對模型預測結果的影響,提高模型的泛化特性。

2) 隨機森林:在自助聚合的基礎上,每次構建決策樹模型時,不僅隨機選擇部分樣本,而且還隨機選擇部分特徵,這樣的集合算法,不僅規避了強勢樣本對預測結果的影響,而且也削弱了強勢特徵的影響,是模型的預測能力更加泛化。

3) 正向激勵:首先爲樣本矩陣中的樣本隨機分配初始權重,由此構建一棵帶有權重的決策樹,在由該決策樹提供預測輸出時,通過加權平均或者加權投票的方式產生預測值。將訓練樣本代入模型,預測其輸出,對那些預測值與實際值不同的樣本,提高其權重,由此形成第二棵決策樹。重複以上過程,構建出不同權重的若干棵決策樹。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章