1、概述算法
一、什麼是機器學習編程
機器學習是一門可以讓編程計算機從數據中學習的計算機科學。 一個計算機程序在完成任務T以後,得到經驗E,其表現效果爲P,若是任務T的性能表現,也就是用以衡量的P,隨着E增長而增長,那麼這樣計算機程序就被稱爲機器學習系統。數組
簡而言之:自我完善,自我增進,自我適應。框架
二、爲何須要機器學習運維
1>自動化的升級和維護機器學習
2>解決那些算法過於複雜甚至跟本就沒有已知算法的問題函數
3>在機器學習的過程當中協助人類得到對事物的洞見工具
三、機器學習的問題oop
1>建模問題: 所謂機器學習,在形式上可這樣理解:在數據對象中經過統計或推理的方法,尋找一個接受特定輸入X,並給出預期輸出Y的功能函數f,即Y=f(X)。性能
2>評估問題: 針對已知的輸入,函數給出的輸出(預測值)與實際輸出(目標值)之間存在必定的偏差,所以須要構建一個評估體系,根據偏差的大小斷定函數的優劣。
3>優化問題 :學習的核心在於改善性能,經過數據對算法的反覆錘鍊,不斷提高函數預測的準確性,直至得到可以知足實際需求的最優解,這個過程就是機器學習。
四、機器學習的種類
監督學習、無監督學習、半監督學習、強化學習
1>有監督學習:用已知輸出評估模型的性能。
2>無監督學習:在沒有已知輸出的狀況下,僅僅根據輸入信息的相關性,進行類別的劃分。
3>半監督學習:先經過無監督學習劃分類別,再根據人工標記經過有監督學習預測輸出。
4>強化學習:經過對不一樣決策結果的獎勵和懲罰,使機器學習系統在通過足夠長時間的訓練之後,愈來愈傾向於給出接近指望結果的輸出。
批量學習和增量學習
1>批量學習:將學習的過程和應用的過程截然分開,用所有的訓練數據訓練模型,而後再在應用場景中實現預測,當預測結果不夠理想時,從新回到學習過程,如此循環。
2>增量學習:將學習的過程和應用的過程統一塊兒來,在應用的同時以增量的方式,不斷學習新的內容,邊訓練邊預測。
基於實例的學習和基於模型的學習
1>基於實例的學習:根據以往的經驗,尋找與待預測輸入最接近的樣本,以其輸出做爲預測結果。-----機率論相關
2>基於模型的學習:根據以往的經驗,創建用於聯繫輸出和輸入的某種數學模型,將待預測輸入代入該模型,預測其結果。 輸入 -> 輸出 1 2 2 4 3 6 Y = 2 * X ... 9 ? -> 18 -------線性代數(數學公式)相關
五、機器學習的通常過程
1)數據處理:時間佔比大,只有數據嚴格符合要求,模型精度纔可能獲得保障
1>數據收集 (數據檢索、數據挖掘、爬蟲)Hadoop storm hive
2>數據清洗 (隨機數、插值、或直接扔掉)
2)機器學習
1>選擇模型 (算法)
2>訓練模型 (算法)
3>評估模型 (工具、框架、算法知識)
4>測試模型
3)業務運維
1>應用模型
2>維護模型
六、機器學習的典型應用
股價預測
推薦引擎
天然語言識別
語音識別
圖像識別
人臉識別
七、機器學習的基本問題
1)迴歸問題:根據已知的輸入和輸出尋找某種性能最佳的模型,將未知輸出的輸入代入模型,獲得連續的輸出。
2)分類問題:根據已知的輸入和輸出尋找某種性能最佳的模型,將未知輸出的輸入代入模型,獲得離散的輸出。
3)聚類問題:根據已知輸入的類似程度,將其劃分爲不一樣的羣落。
4)降維問題:在性能損失儘量小的前提下,下降數據的複雜度。
2、數據預處理
''' 數據預處理: 1.均值移除:因爲一個樣本的不一樣特徵值差別較大(模型底層算法會偏向權重大的樣本,致使模型預測不許),不利於使用現有機器學習算法進行樣本處理。 均值移除可讓樣本矩陣中的每一列的平均值爲0,標準差爲1。 1>如何使樣本矩陣中的每一列的平均值爲0呢? 例若有一列特徵值表示年齡: 17, 20, 23 mean = (17 + 20 + 23)/3 = 20 a' = -3 b' = 0 c' = 3 完成! 2>如何使樣本矩陣中的每一列的標準差爲1呢? a' = -3 b' = 0 c' = 3 s' = std(a', b', c') [a'/s', b'/s', c'/s'] 3>均值移除API: import sklearn.preprocessing as sp A = sp.scale(array) scale函數用於對數據進行預處理,實現均值移除。 array爲原數組,返回A爲均值移除後的結果。 2.範圍縮放:將樣本矩陣中的每一列的最小值和最大值設定爲相同的區間,統一各列特徵值的範圍。通常狀況下會把特徵值縮放至[0, 1]區間。 1>如何使一組特徵值的最小值爲0呢? 例若有一列特徵值表示年齡: [17, 20, 23] 每一個元素減去特徵值數組全部元素的最小值便可:[0, 3, 6] 2>如何使一組特徵值的最大值爲1呢? [0, 3, 6] 把特徵值數組的每一個元素除以最大值便可:[0, 1/2, 1] 3>範圍縮放API: # 建立MinMax縮放器 mms = sp.MinMaxScaler(feature_range=(0, 1)) # 調用mms對象的方法執行縮放操做, 返回縮放事後的結果 result = mms.fit_transform(原始樣本矩陣) ''' import sklearn.preprocessing as sp import numpy as np # 整理樣本矩陣 samples = np.array([[17, 100, 4000], [20, 80, 5000], [23, 75, 5500]]) # 均值移除(每一列均值爲0,標準差爲1) std_samples = sp.scale(samples) print(std_samples) print(std_samples.mean(axis=0)) print(std_samples.std(axis=0)) print('==================================') # 範圍縮放,把每一列都縮放到[0,1]區間 mms = sp.MinMaxScaler(feature_range=(0, 1)) result = mms.fit_transform(samples) print(result) print('==================================') # 手動實現範圍縮放 result = np.zeros_like(samples, dtype='f4') i = 0 for col in samples.T: # print(col) # 17k+b=0 # 23k+b=1 A = np.array([[col.min(), 1], [col.max(), 1]]) B = np.array([0, 1]) kb = np.linalg.solve(A, B) print(col * kb[0] + kb[1]) result[i] = col * kb[0] + kb[1] i += 1 print('=======================') print(result.T)
輸出結果:
[[-1.22474487 1.38873015 -1.33630621]
[ 0. -0.46291005 0.26726124]
[ 1.22474487 -0.9258201 1.06904497]]
[ 0.00000000e+00 -3.70074342e-17 5.18104078e-16]
[1. 1. 1.]
==================================
[[0. 1. 0. ]
[0.5 0.2 0.66666667]
[1. 0. 1. ]]
==================================
[0. 0.5 1. ]
[1. 0.2 0. ]
[0. 0.66666667 1. ]
=======================
[[0. 1. 0. ]
[0.5 0.2 0.6666667]
[1. 0. 1. ]]
''' 數據預處理: 3.歸一化(正則化):有些狀況每一個樣本的每一個特徵值具體的值並不重要,可是每一個樣本特徵值的佔比更加劇要。 Python Java PHP 2017 10 20 5 2018 8 5 0 因此歸一化便是用每一個樣本的每一個特徵值除以該樣本各個特徵值絕對值的總和。 變換後的樣本矩陣,每一個樣本的特徵值絕對值之和爲1。 1>歸一化API: # array 原始樣本矩陣 # norm 範數 # l1 - l1範數,向量中元素絕對值之和 # l2 - l2範數,向量中元素平方之和 # 返回歸一化預處理後的樣本矩陣 sp.normalize(array, norm='l1') 4.二值化:有些業務並不須要分析矩陣的詳細完整數據(好比圖像邊緣識別只須要分析出圖像邊緣便可),能夠根據一個事先給定的閾值, 用0和1表示特徵值不高於或高於閾值。二值化後的數組中每一個元素非0即1,達到簡化數學模型的目的。 ----該數據處理方法通常業務爲圖像處理(邊緣識別) 1>二值化API: # 給出閾值, 獲取二值化器 bin = sp.Binarizer(threshold=閾值) # 調用transform方法對原始樣本矩陣進行二值化預處理操做 result = bin.transform(原始樣本矩陣) 5.獨熱編碼(OneHot):爲樣本特徵的每一個值創建一個由一個1和若干個0組成的序列,用該序列對全部的特徵值進行編碼。 ----數字字符串也是能夠編碼的 1>好比: 兩個數 三個數 四個數 1 3 2 7 5 4 1 8 6 7 3 9 爲每個數字進行獨熱編碼: 1-10 3-100 2-1000 7-01 5-010 4-0100 8-001 6-0010 9-0001 編碼完畢後獲得最終通過獨熱編碼後的樣本矩陣: 101001000 010100100 100010010 011000001 2>獨熱編碼API: 1)方法1: # 建立一個獨熱編碼器 # sparse: 是否使用緊縮格式true(稀疏矩陣false) # dtype: 數據類型 ohe = sp.OneHotEncoder(sparse=是否採用緊縮格式, dtype=數據類型) # 對原始樣本矩陣進行處理,返回獨熱編碼後的樣本矩陣。 result = ohe.fit_transform(原始樣本矩陣) 2)方法2: # 建立一個獨熱編碼器 ohe = sp.OneHotEncoder(sparse=是否採用緊縮格式, dtype=數據類型) # 對原始樣本矩陣進行訓練,獲得編碼字典 encode_dict = ohe.fit(原始樣本矩陣) # 調用encode_dict字典的transform方法對樣本矩陣進行獨熱編碼 result = encode_dict.transform(原始樣本矩陣) 6.標籤編碼:當樣本矩陣中含有字符串,則須要把字符串轉爲數字。根據字符串形式的特徵值在特徵序列中的位置, 爲其指定一個數字標籤,用於提供給基於數值算法的學習模型。 1>標籤編碼API: # 獲取標籤編碼器 lbe = sp.LabelEncoder() # 調用標籤編碼器的fit_transform方法訓練而且爲一個字符串數組進行標籤編碼 result = lbe.fit_transform(字符串數組) # 根據標籤編碼的結果矩陣反查字典 獲得原始數據矩陣 samples = lbe.inverse_transform(result) ''' import sklearn.preprocessing as sp import numpy as np import warnings warnings.filterwarnings('ignore') # 整理樣本矩陣 samples = np.array([[17, 100, 4000], [20, 80, 5000], [23, 75, 5500]]) print('==================================') # 歸一化處理,每一行歸一化後的特徵值之和爲1 result = sp.normalize(samples, norm='l1') print(result) print('==================================') # 二值化處理,使得樣本矩陣中的值全爲0或1 # 侯建二值化器對象 b = sp.Binarizer(threshold=80) result = b.transform(samples) print(result) print('==================================') # 獨熱編碼(OneHot)---方法1 samples = np.array([[1, 3, 2], [7, 5, 4], [1, 8, 6], [7, 3, 9]]) # 構建獨熱編碼器---使用緊縮格式 ohe = sp.OneHotEncoder(sparse=True, dtype='i4') result = ohe.fit_transform(samples) print(result, type(result)) print(result.toarray()) print('==================================') # 構建獨熱編碼器---使用稀疏矩陣 ohe = sp.OneHotEncoder(sparse=False, dtype='i4') result = ohe.fit_transform(samples) print(result, type(result)) print('==================================') # 獨熱編碼(OneHot)---方法2 ohe = sp.OneHotEncoder(sparse=False, dtype='i4') encode_dict = ohe.fit(samples) print(encode_dict) result = encode_dict.transform(samples) print(result) print('==================================') # 標籤編碼 # 假設獲取一組特徵---在樣本矩陣中爲一列 features = np.array(['bmw', 'ford', 'toyota', 'audi', 'auto', 'ford', 'toyota', 'HAVAL', 'bmw']) # 對這組特徵進行標籤編碼 lbe = sp.LabelEncoder() result = lbe.fit_transform(features) print(result) # 根據標籤編碼結果反查字典 inver = lbe.inverse_transform(result) print(inver, type(inver)) 輸出結果: ================================== [[0.00412922 0.02428953 0.97158125] [0.00392157 0.01568627 0.98039216] [0.00410861 0.01339764 0.98249375]] ================================== [[0 1 1] [0 0 1] [0 0 1]] ================================== (0, 5) 1 (0, 2) 1 (0, 0) 1 (1, 6) 1 (1, 3) 1 (1, 1) 1 (2, 7) 1 (2, 4) 1 (2, 0) 1 (3, 8) 1 (3, 2) 1 (3, 1) 1 <class 'scipy.sparse.csr.csr_matrix'> [[1 0 1 0 0 1 0 0 0] [0 1 0 1 0 0 1 0 0] [1 0 0 0 1 0 0 1 0] [0 1 1 0 0 0 0 0 1]] ================================== [[1 0 1 0 0 1 0 0 0] [0 1 0 1 0 0 1 0 0] [1 0 0 0 1 0 0 1 0] [0 1 1 0 0 0 0 0 1]] <class 'numpy.ndarray'> ================================== OneHotEncoder(categorical_features=None, categories=None, drop=None, dtype='i4', handle_unknown='error', n_values=None, sparse=False) [[1 0 1 0 0 1 0 0 0] [0 1 0 1 0 0 1 0 0] [1 0 0 0 1 0 0 1 0] [0 1 1 0 0 0 0 0 1]] ================================== [3 4 5 1 2 4 5 0 3] ['bmw' 'ford' 'toyota' 'audi' 'auto' 'ford' 'toyota' 'HAVAL' 'bmw'] <class 'numpy.ndarray'>