從零開始學習機器學習

語言: CN / TW / HK

參考文章:http://juejin.cn/post/6844903805071392782#heading-3

什麼是機器學習

機器學習是根據大量現有的資料,找出一個基本擬合的函式(模型),並根據該函式對新資料進行預測、決策、分類等技術。

比如,現有資料:

| 身高 | 體重| | --- | --- | | 160 | 120| | 170 | 130| | 180 | 140|

假設身高=x,體重=y,最擬合的函式是 y = 1 * x + 40

那麼根據函式,我們預測身高=190的人,體重=150

以上例子是理想的情況,實際我們接觸的資料遠比它大,維度(列)也多,不能輕易地給出一個完全擬合的函式,但是我們仍然有辦法找到該函式,這個過程就是機器學習的過程。

開始練習

安裝環境

  • pip3 install virtualenv
  • virtualenv ai_python
  • source ./ai_python/bin/activate

安裝依賴庫

  • pip install numpy # 數值處理庫
  • pip install pillow # 簡單的影象處理庫
  • pip install --upgrade scikit-learn # 包含多種機器學習演算法的工具包
  • pip install tensorflow # 深度學習庫
  • pip install keras # 深度學習庫
  • pip install opencv-contrib-python # 影象識別工具
  • pip install --upgrade imutils # 影象處理庫

引入演算法庫

  • KNN
  • 樸素貝葉斯
  • 邏輯迴歸
  • SVM
  • 決策樹
  • 隨機森林
  • 感知機

準備資料

鳶尾花資料集(部分),共計150條記錄,包含 setosa,versicolor,virginica 三種花型

| 葉片長度 | 葉片寬度 | 花瓣長度 | 花瓣寬度 | 鳶尾花型別 | | --- | --- | --- | --- | --- | | 5.1 | 3.5 | 1.4 | 0.2 | setosa | | 6.9 | 3.1 | 4.9 | 1.5 | versicolor | | 7.7 | 2.8 | 6.7 | 2.0 | virginica | | 6.1 | 3.0 | 4.9 | 1.8 | virginica | | 6.2 | 2.2 | 4.5 | 1.5 | versicolor |

測試

```python

coding: utf-8

from sklearn.neighbors import KNeighborsClassifier from sklearn.naive_bayes import GaussianNB from sklearn.linear_model import LogisticRegression from sklearn.svm import SVC from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.neural_network import MLPClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report from sklearn.datasets import load_iris import argparse

根據引數選擇模型

ap = argparse.ArgumentParser() ap.add_argument("-m", "--model", type=str, default="knn", help="請輸入模型簡稱") args = vars(ap.parse_args())

models = { "knn": KNeighborsClassifier(n_neighbors=1), "naive_bayes": GaussianNB(), "logit": LogisticRegression(solver="lbfgs", multi_class="auto"), "svm": SVC(kernel="rbf", gamma="auto"), "decision_tree": DecisionTreeClassifier(), "random_forest": RandomForestClassifier(n_estimators=100), "mlp": MLPClassifier() }

載入鳶尾花資料集,然後進行訓練集和測試集的劃分,75%資料作為訓練集,其餘25%作為測試集

random_state是隨機狀態,類似隨機種子

print("載入鳶尾花資料集...") dataset = load_iris() (trainX, testX, trainY, testY) = train_test_split(dataset.data, dataset.target, random_state=3, test_size=0.25)

訓練模型

print("正在使用模型:'{}'".format(args["model"])) model = models[args["model"]] model.fit(trainX, trainY)

預測並輸出一份分類結果報告

print("生成結果報告") predictions = model.predict(testX) print(classification_report(testY, predictions, target_names=dataset.target_names)) ```

結果報告

image.png

報告解析

舉個例子,現有100人,專家預測大概30人為陽性,70人為陰性,現在有一個模型,在專家預測陽性的30人中,20人陽性,10人為陰性,在專家預測陰性的70人中,5人陽性,65人陰性。

  • 預測正確 = 陽性樣本預測結果為陽,陰性樣本預測結果為陰 = T
  • 預測錯誤 = 陽性樣本預測結果為陰,陰性樣本預測結果為陽 = F
  • 正樣本數量 = 專家預測陽性的30人 = P
  • 負樣本數量 = 專家預測陰性的70人 = N
  • 正樣本中預測結果為正的數量 = 專家預測陽性樣本中預測結果為陽的數量 = TP
  • 正樣本中預測結果為負的數量 = 專家預測陽性樣本中預測結果為陰的數量 = FP
  • 負樣本中預測結果為正的數量 = 專家預測陰性樣本中預測結果為陽的數量 = FN
  • 負樣本中預測結果為負的數量 = 專家預測陰性樣本中預測結果為陰的數量 = TN
  • 準確率 = accuracy = (TP + TN) / (TP + FP + TN + FN)
  • 精準率 = precision = TP / (TP + FP)
  • 召回率 = recall = TP / (TP + FN)
  • F1 = f1-score (2 * 精準率 * 召回率)/ (精準率 + 召回率)
  • support = 預測時的樣本容量
  • macro avg = 巨集平均 = 每個分類的精準率之和 / 分類數
  • weighted avg = 加權平均 = ∑(分類的精準率*分類的support/總support)

一般看weighted avg 即可知道該模型預測的準確率