機器學習 Scikit Learn
Scikit-learn集成了很多機器學習需要使用的函數,Scikit-learn能簡潔、快速寫出機器學習程序
-
scikit-learn簡稱sklearn,支持包括分類、回歸、降維和聚類四大機器學習算法。還包含了特征提取、數據處理和模型評估三大模塊。
scikit_learn.png
# 數據分割 訓練測試集
from sklearn.model_selection import train_test_split
# 數據處理 標準化
from sklearn.preprocessing import StandardScaler
# 分類模型性能評測報告
from sklearn.metrics import classification_report
# 特征轉換
from sklearn.feature_extraction import DictVectorizer
# 回歸模型評估
from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error
機器學習
機器學習是設計和研究能夠根據過去的經驗來為未來做決策的軟件,它是通過數據進行研究的程序。機器學習的基礎是歸納(generalize),就是從已知案例數據中找出未知的規律。
一般我們將機器學習的任務分為
- 監督學習(Supervised Learning),關注對事物未知表現的預測,分類問題(Classification)和回歸(Regression)
- 無監督學習(Unsupervised Learning),對事物本身特性的分析,聚類(Clustering)和數據降維(Dimensionality Reducting)
- 增強學習(Reinforcement Learning),一個能感知環境的自治agent,怎樣通過學習選擇能達到其目標的最優動作。
-
監督學習問題是,從成對的已經標記好的輸入和輸出經驗數據作為一個輸入進行學習,用來預測輸出結果,是從有正確答案的例子中學習。
監督學習是通過一個輸入產生一個帶標簽的輸出的經驗數據對中進行學習。
監督式機器學習任務就是分類 (classification)和回歸(regression)- 分類認為需要學會從若干變量約束條件中預測出目標變量的值,就是必須預測出新觀測值的類型,種類或標簽。
- 回歸問題需要預測連續變量的數值,比如預測新產品的銷量,或者依據工作的描述預算工資水平等。
-
無監督學習是程序不能從已經標記好的數據中學習。它需要在數據中發現一些規律。假如我們獲取了人的身高和體重數據,非監督學習的例子就是把數據點分成組別。
無監督式機器學習任務是通過訓練數據發現相關觀測值的組別,稱為類(clusters)。主要方式是聚類(clustering),即通過一些相似性度量方法把一些觀測值分成同一類。數據的相似性
降維(Dimensionality reduction)是另一個常見的無監督學習任務。有些問題可能包含成千上萬個解釋變量,處理起來非常麻煩。另外,有些解釋變量屬于噪音,也有些完全是無邊的變量,這些影響都會降低程序的歸納能力。降維是發現對響應變量影響最大的解釋變量的過程。降維可以更容易的實現數據可視化。對事物特性進行壓縮和篩選——數據壓縮降維- 聚類應用場景比如有一些影評數據,聚類算法可以分辨積極的和消極的影評。系統是不能給類加上“積極”或“消極”的標簽的;沒有監督,系統只能通過相似性度量方法把觀測值分成兩類。聚類分析的應用場景是用市場產品銷售數據為客戶分級。
監督學習與非監督學習可以看作機器學習的兩端。
半監督學習,既包含監督數據也有非監督數據,這類問題可以看作是介于監督學習與非監督學習之間的學習。半監督機器學習案例是一種增強學習(Reinforcement Learning),問題可以通過決策來獲得反饋,但是反饋與某一個決策可能沒有直接關系。
增強學習就是將情況映射為行為,也就是去最大化收益。學習者并不是被告知哪種行為將要執行,而是通過嘗試學習到最大增益的行為并付諸行動。也就是說增強學習關注的是智能體如何在環境中采取一系列行為,從而獲得最大的累積回報。通過增強學習,一個智能體應該知道在什么狀態下應該采取什么行為。RL是從環境狀態到動作的映射的學習,我們把這個映射稱為策略。
機器學習三要素:1.模型;2.策略;3.算法
- 公式(方法) = 模型 + 策略 + 算法
模型、參數、目標函數
-
模型 根據不同的業務或使用場景選擇合適的模型
ml_select
參數 模型的參數用來讓數據更好的適應結果
目標函數也為代價函數,
目標是讓代價(錯誤)最小
而如何找到最優解呢,這就需要使用代價函數來求解了:
目標函數的求解
引出了梯度下降:能夠找出cost function函數的最小值;
梯度下降原理:將函數比作一座山,我們站在某個山坡上,往四周看,從哪個方向向下走一小步,能夠下降的最快;
當然解決問題的方法有很多,梯度下降只是其中一個,還有一種方法叫Normal Equation;
方法:
- 先確定向下一步的步伐大小,我們稱為Learning rate
- 任意給定一個初始值
- 確定一個向下的方向,并向下走預先規定的步伐,并更新
- 當下降的高度小于某個定義的值,則停止下降
[機器學習算法地圖(下圖) 摘自"SIGAI"微信公眾號]
監督學習 分類——乳腺癌分類案例
監督學習 分類/回歸
即根據已有經驗知識對未知樣本的目標/標記進行預測
據目標預測變量的類型不同,分為分類和回歸
流程順序:
- 獲取數據
- 抽取所需特征,形成特征向量(Feature Vectors)
- 特征向量+標簽數據(Labels)構成模型所需數據格式
- 數據分割成 訓練集,測試集,驗證集
- 模型訓練,評估驗證等
分類
- 二分類(Binary Classification),即判斷是非
- 多類分類(Multiclass Classification),多于兩個類別中選擇一個
線性分類器(Linear Classifiers)
假設特征與分類結果存在某種線性關系
二分類之邏輯回歸(Logistic Regression)
也被稱為對數幾率回歸
邏輯回歸(Logistic Regression)是用于處理因變量為分類變量的回歸問題,常見的是二分類或二項分布問題,也可以處理多分類問題,它實際上是屬于一種分類方法。
- 讀取數據,查看數據情況 pandas
# 引入所需包
import numpy as np
import pandas as pd
# 使用sklearn.model_selection里的train_test_split模塊用于分割數據。得到 訓練/測試數據
# http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html
from sklearn.model_selection import train_test_split
# 創建特征列表, 每列名稱
column_names = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size',
'Uniformity of Cell Shape', 'Marginal Adhesion', 'Single Epithelial Cell Size',
'Bare Nuclei', 'Bland Chromatin', 'Normal Nucleoli', 'Mitoses', 'Class']
# 使用pandas.read_csv函數讀取指定數據
data = pd.read_csv('data/breast-cancer-wisconsin.csv', names = column_names)
# 將?替換為標準缺失值表示,缺失值處理
data = data.replace(to_replace='?', value=np.nan)
# 丟棄帶有缺失值的數據
data = data.dropna(how='any')
# 輸出data的數據量和維度。
print('數據維度為: {}'.format(data.shape))
-
查看數據具體內容情況
image.png 將數據切分成 訓練集測試集
# 隨機采樣25%的數據用于測試,剩下的75%用于構建訓練集合
X_train, X_test, y_train, y_test = train_test_split(data[column_names[1:10]], data[column_names[10]],
test_size=0.25, random_state=25)
# 查驗訓練樣本的數量和類別分布
y_train.value_counts()
- 用邏輯回歸進行二分類模型訓練及預測并作出性能評測
# 引入 線性分類 進行預測
# 數據先做 標準化處理
from sklearn.preprocessing import StandardScaler
# 引入 邏輯回歸 與 隨機梯度分類器
from sklearn.linear_model import LogisticRegression
from sklearn.linear_model.stochastic_gradient import SGDClassifier
# 從sklearn.metrics里導入classification_report模塊。
from sklearn.metrics import classification_report
# 標準化數據,保證每個維度的特征數據方差為1,均值為0。使得預測結果不會被某些維度過大的特征值而主導。
ss = StandardScaler()
X_train = ss.fit_transform(X_train)
X_test = ss.transform(X_test)
# 實例化分類器
lr = LogisticRegression()
sgdc = SGDClassifier(max_iter=5, tol=None)
# 調用LogisticRegression中的fit函數/模塊用來訓練模型參數。
lr.fit(X_train, y_train)
# 使用訓練好的模型lr對X_test進行預測,結果儲存在變量lr_y_predict中。
lr_y_predict = lr.predict(X_test)
# 調用SGDClassifier中的fit函數/模塊用來訓練模型參數。
sgdc.fit(X_train, y_train)
# 使用訓練好的模型sgdc對X_test進行預測,結果儲存在變量sgdc_y_predict中。
sgdc_y_predict = sgdc.predict(X_test)
# 使用邏輯斯蒂回歸模型自帶的評分函數score獲得模型在測試集上的準確性結果。
print('Accuracy of LR Classifier:', lr.score(X_test, y_test))
# 利用classification_report模塊獲得LogisticRegression其他三個指標的結果。
print(classification_report(y_test, lr_y_predict, target_names=['Benign', 'Malignant']))
# 使用隨機梯度下降模型自帶的評分函數score獲得模型在測試集上的準確性結果。
print('Accuarcy of SGD Classifier:', sgdc.score(X_test, y_test))
# 利用classification_report模塊獲得SGDClassifier其他三個指標的結果。
print(classification_report(y_test, sgdc_y_predict, target_names=['Benign', 'Malignant']))