1. 人工智能
通俗來講,只要一個系統具備一定的智能,同時可以幫助我們做一些決策,我們都可以把它列為AI系統。
Al is the field that studies the synthesis and analysis Of computational agents that act intelligently.
Think like humans Think rationally
Act like humans Actr ationally
分析犯罪嫌疑人生活軌跡及可能出現的場所,利用了計算機視覺(CV)技術和大數據分析犯罪嫌疑人生活軌跡及可能出現的場所;
在線客服,讓人人都享受一對一專業服務,在線客服需要使用自然語言處理技術;
快速進行癌症早期篩查,幫助患者更早發現病灶,通過分析病理圖像和其他一些身體狀態特征得出。
AI和 BI 最大的區別在於, AI可以幫助我們做決策, 但BI更多的是輔助人做決策。
- AI + 教育 ->因材施教、 人工智能助教、 人工智能老師、 自動判卷
- AI + 金融 ->大數據風控、 量化投資、 智能保險
- AI + 農業 ->種子、種植、管理等
- AI + 醫療 ->病情演變、圖形分析等
- AI + 汽車 ->自動駕駛
- AI + 廣告 ->精准投放
全民AI(中小學):
數據思維(從數據中發掘價值)、 迭代思維、 最優化思維等
2. 機器學習與深度學習
機器學習自動幫我們從數據中挖掘並總結規律,廣泛應用在電商推薦、無人駕駛、人臉識別、金融風險評估等應用。
FieId of study that gives computers the ability to learn without being explicitly programmed.
想用程序來辨別張三和李四兩個人。一種實現方法是根據它倆的 顯著特征 來設計規則如:假如一個人比較高、偏胖、臉上有皺紋,同時擁有啤酒肚就識別為張三,否則為李四。這種實現方案是基於人的 先驗知識 的,也就把一個人已經了解到的知識提前寫成規則的形式。
機器學習的運作方式恰好跟這個相反:假如我們手里有若干張張三和李四的照片,然后給機器看,同時告訴機器哪個是張三,哪個是李四。之后我們期待機器可以從這些數據中自動尋找可以分辨張三和李四的規律出來,這叫作機器學習。
- 機器學習技術可以幫助我們從數據中自動找出規律,並把這個規律應用在未來的任務中。
- 機器學習通常需要依賴於大量的數據。數據量越大,通常總結出來的規律就會越准確,對於預測效果也越好。
- 機器學習,從字面意思上可以理解為 ”機器“從數據中自動“學習”規律,而不是我們提前告訴機器具體怎么做,后者也稱之為經驗主義。
AI的崛起過程中有兩件非常具有代表性的事件,一個是2012年的ImageNet競賽, 另外一個是2015年的AlphaGo事件,利用的都是深度學習。
Deep Learning is a subfield Of machine learning concerned with algorithms inspired by the structure and function 0f the brain called artificial neural networks.
深度學習並不特指某一個模型,而是泛指某一類模型。一個模型如果是屬於深度學習范疇,它必將具有比較”深“的結構。這種”深“度通常是通過把一系列簡單的模型通過不斷疊加的方式來實現的。
- 深度神經網絡
- 深度隨機森林
- 深度高斯混合模型
- 深度BI-LSTM
比如深度神經網絡就是把經典的神經網絡不斷疊加在一起;深度隨機森林就是把隨機森林不斷疊加在一起。
主流的深度學習模型
- 深度神經網絡(Deep Neural Networks)
- 卷積網絡(Convolutional Neural Networks) -- 圖像
- 循環神經網絡(Recurrent Neural Networks) -- 時序數據
- 遞歸神經網絡(Recursive Neural Networks) -- 遞歸方式構造
- 生成式對抗網絡(Generative Adversarial Networks) -- 生產圖片
常用工具:
- Numpy、 Pandas、 matplotlib
- scikit_learn(機器學習算法)
- spark MLib(分布式-大數據環境)
- PyTorch、 keras、 TensorFlow (深度學習框架)
從應用的角度,AI技術可以分為三大類: 視覺、自然語言和語音。
文本(自然語言處理)、 圖像| 視頻(圖像識別)、 語音識別(音頻、語音)
AI領域頂級會議
- AI全領域:AAAI、IJCAI
- 機器學習領域:Neurips、ICML、UAI、AISTATS
- 深度學習領域:ICLR
- 計算機視覺領域:CVPR、ICCV、ECCV
- 自然語言處理領域:ACL、EMNLP、COLING、NAACL
- 數據挖掘領域:KDD、WSDM、SDM
- 語音識別領域:ICASSP、INTERSPEECH
機器學習基本概念
監督學習、無監督學習、回歸、分類。
監督學習和無監督學習的區別
前者處理的數據是帶有標簽(label)的,后者處理的數據則沒有標簽的。由於后者的數據沒有被標記,我們就無法做預測。
除了 監督學習 和 無監督學習 ,其實還有一類叫作強化學習(reinforcement learning)。AlphaGo就是強化學習最經典的代表作。雖然在棋牌等任務上強化學習取得了不俗的表現,但對於工業界實際問題來講,強化
學習目前為止並沒有特別突出的表現,這也意味着強化學習技術本身也需要更多的探索。 其實,對於現實中的問題,它所面臨的環境要比棋牌復雜得多,同時也 充斥了很多的不確定性 。
監督學習例子:
- 人臉識別(人臉 -> 人名)
- 語音識別(語音 -> 文本)
- 主題/文本分類(文檔->這個文本屬於哪個主題?)
- 機器翻譯
- 目標檢測(圖片里標記過的物體)
- 金融風控
- 情感分析(文本-情感)
- 自動駕駛
監督學習 進一步分為回歸和分類問題
- 其中回歸問題是用來預測具體的數值如溫度、身高、氣溫、股價;(輸出連續性變量)
- 分類問題則用來預測特定的類別, 如文檔的主題, 信用的好壞、陰晴、好壞等。(輸出定性結果)
數值和類別的主要區別在於后者是沒有大小關系的, 比如”好“和”壞“,”電商“和"體育", ”國內“和”國外“。
無監督學習(聚類算法)
- 人群划分(精准推送)
特征與標簽
數據集 (Dataset)包含了100個 樣本 (sample), 每一個樣本擁有50個特征和1個類別 標簽 , 標簽取自於(0,1)”,這就是經典的用於監督學習的數據。我們可以使用一個標准化的數學用語來表示上面的這句話。
一共有2個樣本;
工作經驗、職位、城市都屬於特征,用X表示;
薪資屬於標簽(label),用Y表示,是我們需要去預測的,屬於一個回歸問題(預測的是個具體的值)。
工作經驗 | 職位 | 城市 | 薪資(月薪/k) |
2 | 運營 | 北京 | ? |
3 | 后端開發工程師 | 杭州 | ? |
X就是一個矩陣,Y就是一個向量;
數據集的描述:
D表數據集,里邊有n個樣本,x1,x2...xn 叫一組特征向量; y1,y2...yn叫標簽 ,這個標簽數據其中一個類別。
訓練數據和測試數據
對於給定的訓練數據,我們通常把它進一步分為 訓練數據 和 測試數據 。這么做的目的是需要留出一部分數據來驗證訓練出來的模型的好壞。我們使用訓練數據來訓練模型,並在測試數據上做最后的驗證。
如果在測試數據上表現也良好,就說明達到了上線的標准。
機器學習建模流程
機器學習建模通常都需要經過以下幾步:
從 數據探索 、 數據處理 、 建模 到最終的 模型驗證 和 部署上線 。
案例:通過身高去預測一個人的體重
屬於經典的回歸問題;AI建模流程:
1. 數據的探索
通過數據探索我們會對業務和數據本身有更深入的理解,從而能夠選擇更合適的方法來解決問題。 數據探索過程中,最常用的是 數據可視化技術 ,也就是把數據直觀地展示在二維或者三維的空間。 通過這種可
視化的方法,我們可以試着理解數據的 分布特征 (如是否滿足線性?)、發現是否包含 異常值 、 特征值 是否滿足某一類分布(如高斯分布)等等。
# 創建數據集,把數據寫入到numpy數組
import numpy as np # 引用numpy庫,主要用來做科學計算
import matplotlib.pyplot as plt # 引用matplotlib庫,主要用來畫圖 # 定義數據,總共10個樣本,每個樣本包含兩個值,分別為身高和體重。
data = np.array([[152,51],[156,53],[160,54],[164,55], [168,57],[172,60],[176,62],[180,65], [184,69],[188,72]]) # 打印出數組的大小
print(data.shape) #(10, 2) # 從data中提取身高和體重的值,分別存放在x, y變量中。 # data[:,0]指的是取出所有第一列,也就是身高特征。
x, y = data[:,0].reshape(-1,1), data[:,1] # 在二維空間里畫出身高和體重的分布圖
plt.scatter(x, y, color='black') plt.xlabel('height (cm)') plt.ylabel('weight (kg)') plt.show()
從身高和體重的可視化結果中,通過肉眼可以直觀地看到它們之間的關系,偏向於線性關系。
數據本身具有線性關系,同時屬於回歸類問題,所以我們可以選擇線性回歸模型來解決這個任務。線性回歸是最為經典的、最簡單的回歸模型,廣泛地應用在各類預測任務中,如下一季度收入預測、銷量預測等等。對於線性回歸,在之后的章節里做詳細的介紹。
在數據探索階段,可視化技術起到了很重要的作用。但對於特征維度很高的數據來講,直接去可視化是不太現實的,因為我們人類只能識別出二維或者三維的可視化。
如果給定的數據維度很大,如何做可視化分析呢?
- 沒有特別好的方法一下子把所有特征一起做可視化
- 可以采用降維的方法,把特征映射到二維或者三維的空間
- 針對於每一個特征單獨做可視化,並觀察倆倆特征之間的關系
最為常用的方法是做數據的降維, 比如把100維的數據降維到2維或者3維的空間。用來做數據降維的方法有很多種, 其中最經典的方法叫作主成分分析(PCA)。
2. 數據預處理和特征工程
在建模過程中,數據預處理扮演着舉足輕重的角色,這個過程通常會涉及到一些 數據清洗 的工作。在很多的AI任務中,數據本身具有大量的噪聲,所以處理好這些是一項必要的工作。噪聲可以是,數據字段的缺失、數據字段的異常、數據字段的不匹配等等。雖然這些工作看似很枯燥,但對於結果有着非常重要的影響,所以一定要引起足夠的重視。
特征工程 (feature engineering)也起着非常重要的作用。所謂的特征工程指的是把一個物體表示為向量的過程。那為什么需要這種向量呢?這是因為任何模型的輸入要求的就是一個個向量。
特征工程本身具有很多的學問和技巧,而且對於不同的數據類型如文本或者圖像,需要使用不一樣的特征工程技術。 在一般的建模過程中,花費50%以上的時間在特征工程上其實也很正常。
對於體重預測問題來講,實際上不太需要特征預處理或者特征工程步驟的。首先,我們的特征都很干凈,而且也沒有任何異常值。另外,畢竟只有一個特征,也不太需要特征工程的步驟。
3. 構建回歸模型
當選定了模型之后(如線性回歸),下一步的事情就是針對於訓練數據去 擬合 一個最好的線性回歸模型。這部分的工作可以通過 sklearn 里封裝好的函數來實現。
對於給定的特征X和標簽y,我們可以直接調用sklearn里的LinearRegression()類初始化一個線性回歸模型,之后再通過fit()函數在給定的數據上做擬合。樣例代碼如下:
# 實例化一個線性回歸的模型
regr = linear_model.LinearRegression()
# 擬合給定的數據(X, y)
regr.fit(X_train,y_train)
擬合完之后對象regr里存儲着已經訓練好的線性回歸模型的參數,並可以使用regr來對未來的數據做預測了。這里需要注意的是,對於給定的數據我們可以提前分好訓練集和測試集。
4. 驗證模型效果
對於驗證模型的效果,可以從兩個方面考慮。一方面,我們可以觀察在訓練數據上的 擬合度 ,另外一方面觀察在測試數據上的 預測能力 。在訓練數據上的擬合度是根本,如果在訓練數據上都沒有很好地擬合,就更不要談測試數據上的驗證了。
對於線性回歸模型,它的擬合度可以通過真實值和預測值之間的誤差來表示。
# 計算訓練好的模型在訓練數據上的擬合度
print (regr.score(X_train, y_train))
# 可視化在訓練數據上擬合后的線條,這部分通過matplotlib庫來實現,線條可以通過
# plot()函數來實現
# 首先,畫出給定的訓練數據
plt.scatter(x_train, y_train, color='red')
# 畫出訓練好的線條
plt.plot(x_train, regr.predict(x_train), color='blue')
# 畫x,y軸的標題
plt.xlabel('height (cm)')
plt.ylabel('weight (kg)')
代碼如下:
# 引用 sklearn庫,主要為了使用其中的線性回歸模塊
from sklearn import datasets, linear_model # train_test_split用來把數據集拆分為訓練集和測試機
from sklearn.model_selection import train_test_split # 引用numpy庫,主要用來做科學計算
import numpy as np # 引用matplotlib庫,主要用來畫
import matplotlib.pyplot as plt # 創建數據集,把數據寫入到numpy數組
data = np.array([[152, 51], [156, 53], [160, 54], [164, 55], [168, 57], [172, 60], [176, 62], [180, 65], [184, 69], [188, 72]]) # 打印出數據大小
print("The size of dataset is (%d,%d)" % data.shape) # X,y分別存放特征向量和標簽. 注:這里使用了reshape(-1,1), 其主要的原因是 # data[:,0]是一維的數組(因為只有一個特征),但后面調用模型的時候對特征向量的要求 # 是矩陣的形式,所以這里做了reshape的操作。
X, y = data[:, 0].reshape(-1, 1), data[:, 1] # 使用train_test_split函數把數據隨機分為訓練數據和測試數據。 訓練數據的占比由 # 參數train_size來決定。如果這個值等於0.8,就意味着隨機提取80%的數據作為訓練集
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.8) # TODO 1. 請實例化一個線性回歸的模型 # TODO 2. 在X_train,y_train上訓練一個線性回歸模型。 如果訓練順利,則regr會存儲訓練完成之后的結果模型
# 實例化一個線性回歸的模型
regr = linear_model.LinearRegression() # 擬合給定的數據(X, y)
regr.fit(X_train,y_train) # 在訓練集上做驗證,並觀察是否訓練得當,首先輸出訓練集上的決定系數R平方值
print("Score for training data %.2f" % regr.score(X_train, y_train)) #0.97
# 畫訓練數據
plt.scatter(X_train, y_train, color='red') # 畫出訓練好的線條
plt.plot(X_train, regr.predict(X_train), color='blue') # TODO 3. 畫在訓練數據上已經擬合完畢的直線 # 畫測試數據
plt.scatter(X_test, y_test, color='black') # 畫x,y軸的標題
plt.xlabel('height (cm)') plt.ylabel('weight(kg)') plt.show() # 輸出在測試集上的決定系數R平方值
print("Score for testing data %.2f" %regr.score(X_test, y_test)) print("Prediction for a person with height 171 is: %.2f" % regr.predict([[171]])) ---->> The size of dataset is (10,2) Score for training data 0.97 Score for testing data 0.89 Prediction for a person with height 171 is: 60.38