機(jī)器學(xué)習(xí) Scikit Learn
Scikit-learn集成了很多機(jī)器學(xué)習(xí)需要使用的函數(shù)宣渗,Scikit-learn能簡潔溜宽、快速寫出機(jī)器學(xué)習(xí)程序
-
scikit-learn簡稱sklearn昵仅,支持包括分類、回歸、降維和聚類四大機(jī)器學(xué)習(xí)算法护锤。還包含了特征提取送丰、數(shù)據(jù)處理和模型評(píng)估三大模塊。
# 數(shù)據(jù)分割 訓(xùn)練測試集
from sklearn.model_selection import train_test_split
# 數(shù)據(jù)處理 標(biāo)準(zhǔn)化
from sklearn.preprocessing import StandardScaler
# 分類模型性能評(píng)測報(bào)告
from sklearn.metrics import classification_report
# 特征轉(zhuǎn)換
from sklearn.feature_extraction import DictVectorizer
# 回歸模型評(píng)估
from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error
機(jī)器學(xué)習(xí)
機(jī)器學(xué)習(xí)是設(shè)計(jì)和研究能夠根據(jù)過去的經(jīng)驗(yàn)來為未來做決策的軟件疗绣,它是通過數(shù)據(jù)進(jìn)行研究的程序线召。機(jī)器學(xué)習(xí)的基礎(chǔ)是歸納(generalize),就是從已知案例數(shù)據(jù)中找出未知的規(guī)律持痰。
一般我們將機(jī)器學(xué)習(xí)的任務(wù)分為
- 監(jiān)督學(xué)習(xí)(Supervised Learning)灶搜,關(guān)注對(duì)事物未知表現(xiàn)的預(yù)測,分類問題(Classification)和回歸(Regression)
- 無監(jiān)督學(xué)習(xí)(Unsupervised Learning)工窍,對(duì)事物本身特性的分析割卖,聚類(Clustering)和數(shù)據(jù)降維(Dimensionality Reducting)
- 增強(qiáng)學(xué)習(xí)(Reinforcement Learning),一個(gè)能感知環(huán)境的自治agent患雏,怎樣通過學(xué)習(xí)選擇能達(dá)到其目標(biāo)的最優(yōu)動(dòng)作鹏溯。
-
監(jiān)督學(xué)習(xí)問題是,從成對(duì)的已經(jīng)標(biāo)記好的輸入和輸出經(jīng)驗(yàn)數(shù)據(jù)作為一個(gè)輸入進(jìn)行學(xué)習(xí)淹仑,用來預(yù)測輸出結(jié)果丙挽,是從有正確答案的例子中學(xué)習(xí)。
監(jiān)督學(xué)習(xí)是通過一個(gè)輸入產(chǎn)生一個(gè)帶標(biāo)簽的輸出的經(jīng)驗(yàn)數(shù)據(jù)對(duì)中進(jìn)行學(xué)習(xí)匀借。
監(jiān)督式機(jī)器學(xué)習(xí)任務(wù)就是分類 (classification)和回歸(regression)- 分類認(rèn)為需要學(xué)會(huì)從若干變量約束條件中預(yù)測出目標(biāo)變量的值颜阐,就是必須預(yù)測出新觀測值的類型,種類或標(biāo)簽吓肋。
- 回歸問題需要預(yù)測連續(xù)變量的數(shù)值凳怨,比如預(yù)測新產(chǎn)品的銷量,或者依據(jù)工作的描述預(yù)算工資水平等。
-
無監(jiān)督學(xué)習(xí)是程序不能從已經(jīng)標(biāo)記好的數(shù)據(jù)中學(xué)習(xí)肤舞。它需要在數(shù)據(jù)中發(fā)現(xiàn)一些規(guī)律紫新。假如我們獲取了人的身高和體重?cái)?shù)據(jù),非監(jiān)督學(xué)習(xí)的例子就是把數(shù)據(jù)點(diǎn)分成組別李剖。
無監(jiān)督式機(jī)器學(xué)習(xí)任務(wù)是通過訓(xùn)練數(shù)據(jù)發(fā)現(xiàn)相關(guān)觀測值的組別芒率,稱為類(clusters)。主要方式是聚類(clustering)篙顺,即通過一些相似性度量方法把一些觀測值分成同一類偶芍。數(shù)據(jù)的相似性
降維(Dimensionality reduction)是另一個(gè)常見的無監(jiān)督學(xué)習(xí)任務(wù)。有些問題可能包含成千上萬個(gè)解釋變量慰安,處理起來非常麻煩腋寨。另外,有些解釋變量屬于噪音化焕,也有些完全是無邊的變量萄窜,這些影響都會(huì)降低程序的歸納能力。降維是發(fā)現(xiàn)對(duì)響應(yīng)變量影響最大的解釋變量的過程撒桨。降維可以更容易的實(shí)現(xiàn)數(shù)據(jù)可視化查刻。對(duì)事物特性進(jìn)行壓縮和篩選——數(shù)據(jù)壓縮降維- 聚類應(yīng)用場景比如有一些影評(píng)數(shù)據(jù),聚類算法可以分辨積極的和消極的影評(píng)凤类。系統(tǒng)是不能給類加上“積極”或“消極”的標(biāo)簽的穗泵;沒有監(jiān)督,系統(tǒng)只能通過相似性度量方法把觀測值分成兩類谜疤。聚類分析的應(yīng)用場景是用市場產(chǎn)品銷售數(shù)據(jù)為客戶分級(jí)佃延。
監(jiān)督學(xué)習(xí)與非監(jiān)督學(xué)習(xí)可以看作機(jī)器學(xué)習(xí)的兩端腹缩。
半監(jiān)督學(xué)習(xí)枷恕,既包含監(jiān)督數(shù)據(jù)也有非監(jiān)督數(shù)據(jù)拘哨,這類問題可以看作是介于監(jiān)督學(xué)習(xí)與非監(jiān)督學(xué)習(xí)之間的學(xué)習(xí)档玻。半監(jiān)督機(jī)器學(xué)習(xí)案例是一種增強(qiáng)學(xué)習(xí)(Reinforcement Learning),問題可以通過決策來獲得反饋瘟斜,但是反饋與某一個(gè)決策可能沒有直接關(guān)系翁垂。
增強(qiáng)學(xué)習(xí)就是將情況映射為行為莽使,也就是去最大化收益绵跷。學(xué)習(xí)者并不是被告知哪種行為將要執(zhí)行膘螟,而是通過嘗試學(xué)習(xí)到最大增益的行為并付諸行動(dòng)。也就是說增強(qiáng)學(xué)習(xí)關(guān)注的是智能體如何在環(huán)境中采取一系列行為碾局,從而獲得最大的累積回報(bào)荆残。通過增強(qiáng)學(xué)習(xí),一個(gè)智能體應(yīng)該知道在什么狀態(tài)下應(yīng)該采取什么行為净当。RL是從環(huán)境狀態(tài)到動(dòng)作的映射的學(xué)習(xí)内斯,我們把這個(gè)映射稱為策略。
機(jī)器學(xué)習(xí)三要素:1.模型;2.策略嘿期;3.算法
- 公式(方法) = 模型 + 策略 + 算法
模型、參數(shù)埋合、目標(biāo)函數(shù)
-
模型 根據(jù)不同的業(yè)務(wù)或使用場景選擇合適的模型
參數(shù) 模型的參數(shù)用來讓數(shù)據(jù)更好的適應(yīng)結(jié)果
目標(biāo)函數(shù)也為代價(jià)函數(shù)备徐,
目標(biāo)是讓代價(jià)(錯(cuò)誤)最小
而如何找到最優(yōu)解呢,這就需要使用代價(jià)函數(shù)來求解了:
目標(biāo)函數(shù)的求解
引出了梯度下降:能夠找出cost function函數(shù)的最小值甚颂;
梯度下降原理:將函數(shù)比作一座山蜜猾,我們站在某個(gè)山坡上,往四周看振诬,從哪個(gè)方向向下走一小步蹭睡,能夠下降的最快;
當(dāng)然解決問題的方法有很多赶么,梯度下降只是其中一個(gè)肩豁,還有一種方法叫Normal Equation;
方法:
- 先確定向下一步的步伐大小辫呻,我們稱為Learning rate
- 任意給定一個(gè)初始值
- 確定一個(gè)向下的方向清钥,并向下走預(yù)先規(guī)定的步伐,并更新
- 當(dāng)下降的高度小于某個(gè)定義的值放闺,則停止下降
[機(jī)器學(xué)習(xí)算法地圖(下圖) 摘自"SIGAI"微信公眾號(hào)]
監(jiān)督學(xué)習(xí) 分類——乳腺癌分類案例
監(jiān)督學(xué)習(xí) 分類/回歸
即根據(jù)已有經(jīng)驗(yàn)知識(shí)對(duì)未知樣本的目標(biāo)/標(biāo)記進(jìn)行預(yù)測
據(jù)目標(biāo)預(yù)測變量的類型不同祟昭,分為分類和回歸
流程順序:
- 獲取數(shù)據(jù)
- 抽取所需特征,形成特征向量(Feature Vectors)
- 特征向量+標(biāo)簽數(shù)據(jù)(Labels)構(gòu)成模型所需數(shù)據(jù)格式
- 數(shù)據(jù)分割成 訓(xùn)練集怖侦,測試集篡悟,驗(yàn)證集
- 模型訓(xùn)練,評(píng)估驗(yàn)證等
分類
- 二分類(Binary Classification)匾寝,即判斷是非
- 多類分類(Multiclass Classification)搬葬,多于兩個(gè)類別中選擇一個(gè)
線性分類器(Linear Classifiers)
假設(shè)特征與分類結(jié)果存在某種線性關(guān)系
二分類之邏輯回歸(Logistic Regression)
也被稱為對(duì)數(shù)幾率回歸
邏輯回歸(Logistic Regression)是用于處理因變量為分類變量的回歸問題,常見的是二分類或二項(xiàng)分布問題旗吁,也可以處理多分類問題踩萎,它實(shí)際上是屬于一種分類方法。
- 讀取數(shù)據(jù)很钓,查看數(shù)據(jù)情況 pandas
# 引入所需包
import numpy as np
import pandas as pd
# 使用sklearn.model_selection里的train_test_split模塊用于分割數(shù)據(jù)香府。得到 訓(xùn)練/測試數(shù)據(jù)
# http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html
from sklearn.model_selection import train_test_split
# 創(chuàng)建特征列表, 每列名稱
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函數(shù)讀取指定數(shù)據(jù)
data = pd.read_csv('data/breast-cancer-wisconsin.csv', names = column_names)
# 將?替換為標(biāo)準(zhǔn)缺失值表示码倦,缺失值處理
data = data.replace(to_replace='?', value=np.nan)
# 丟棄帶有缺失值的數(shù)據(jù)
data = data.dropna(how='any')
# 輸出data的數(shù)據(jù)量和維度企孩。
print('數(shù)據(jù)維度為: {}'.format(data.shape))
-
查看數(shù)據(jù)具體內(nèi)容情況
將數(shù)據(jù)切分成 訓(xùn)練集測試集
# 隨機(jī)采樣25%的數(shù)據(jù)用于測試,剩下的75%用于構(gòu)建訓(xùn)練集合
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àn)訓(xùn)練樣本的數(shù)量和類別分布
y_train.value_counts()
- 用邏輯回歸進(jìn)行二分類模型訓(xùn)練及預(yù)測并作出性能評(píng)測
# 引入 線性分類 進(jìn)行預(yù)測
# 數(shù)據(jù)先做 標(biāo)準(zhǔn)化處理
from sklearn.preprocessing import StandardScaler
# 引入 邏輯回歸 與 隨機(jī)梯度分類器
from sklearn.linear_model import LogisticRegression
from sklearn.linear_model.stochastic_gradient import SGDClassifier
# 從sklearn.metrics里導(dǎo)入classification_report模塊袁稽。
from sklearn.metrics import classification_report
# 標(biāo)準(zhǔn)化數(shù)據(jù)勿璃,保證每個(gè)維度的特征數(shù)據(jù)方差為1,均值為0。使得預(yù)測結(jié)果不會(huì)被某些維度過大的特征值而主導(dǎo)补疑。
ss = StandardScaler()
X_train = ss.fit_transform(X_train)
X_test = ss.transform(X_test)
# 實(shí)例化分類器
lr = LogisticRegression()
sgdc = SGDClassifier(max_iter=5, tol=None)
# 調(diào)用LogisticRegression中的fit函數(shù)/模塊用來訓(xùn)練模型參數(shù)歧沪。
lr.fit(X_train, y_train)
# 使用訓(xùn)練好的模型lr對(duì)X_test進(jìn)行預(yù)測,結(jié)果儲(chǔ)存在變量lr_y_predict中莲组。
lr_y_predict = lr.predict(X_test)
# 調(diào)用SGDClassifier中的fit函數(shù)/模塊用來訓(xùn)練模型參數(shù)诊胞。
sgdc.fit(X_train, y_train)
# 使用訓(xùn)練好的模型sgdc對(duì)X_test進(jìn)行預(yù)測,結(jié)果儲(chǔ)存在變量sgdc_y_predict中锹杈。
sgdc_y_predict = sgdc.predict(X_test)
# 使用邏輯斯蒂回歸模型自帶的評(píng)分函數(shù)score獲得模型在測試集上的準(zhǔn)確性結(jié)果撵孤。
print('Accuracy of LR Classifier:', lr.score(X_test, y_test))
# 利用classification_report模塊獲得LogisticRegression其他三個(gè)指標(biāo)的結(jié)果。
print(classification_report(y_test, lr_y_predict, target_names=['Benign', 'Malignant']))
# 使用隨機(jī)梯度下降模型自帶的評(píng)分函數(shù)score獲得模型在測試集上的準(zhǔn)確性結(jié)果竭望。
print('Accuarcy of SGD Classifier:', sgdc.score(X_test, y_test))
# 利用classification_report模塊獲得SGDClassifier其他三個(gè)指標(biāo)的結(jié)果邪码。
print(classification_report(y_test, sgdc_y_predict, target_names=['Benign', 'Malignant']))